AviUtl 関係の資源を再利用できないかテストしています。
Visual Studio 2022 のランタイムライブラリが必要です。(x86・x64 両方とも) https://docs.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist?view=msvc-170
Visual Studioの場合、
C++によるデスクトップ開発(C++ MFCオプション含め)、
ユニバーサルWindowsプラットフォーム開発(Nugetのため)
が必要です。
https://github.com/hebiiro/Common-Library のフォルダ内にAtlivuフォルダを配置します。
AviUtl公式サイトからaviutl_plugin_sdkをダウンロードし、下のような配置になるよう置きます。
Common-Library/Aviutl/aviutl_plugin_sdk/(各種 auf,cpp,def,hなど)
- 以下のファイルとフォルダを任意のフォルダに配置します。
- 任意のフォルダ
- Atlivu.exe
- aui.exe
- auo.exe
- Plugins
- lwinput.aui
- x264guiEx.auo
Plugins フォルダは AviUtl の Plugins フォルダをそのまま持ってくれば OK。
- Atlivu.exe を起動します。
- メニューの「ファイル」→「入力プラグインを選択」で aui ファイルを選択します。(今のところ lwinput.aui のみでテスト)
- メニューの「ファイル」→「入力プラグインの設定」で入力の設定を行います。※設定ウィンドウが背後に出ます。
- メニューの「ファイル」→「出力プラグインを選択」で auo ファイルを選択します。(今のところ x264guiEx.auo のみでテスト)
- メニューの「ファイル」→「出力プラグインの設定」で出力の設定を行います。※設定ウィンドウが背後に出ます。
- メニューの「ファイル」→「メディアファイルを開く」で動画ファイルを選択します。(入力プラグインで読み込めるもの)
- トラックーバーを動かしてシークができるかテストします。
- 「再生」ボタンを押して再生できるかテストします。(正常動作すれば音声も出ます)
- メニューの「ファイル」→「メディアファイルを保存」で動画ファイルを保存できるかテストします。
Atlivu.exe (64bit UNICODE) -> aui.exe (32bit UNICODE) -> AviUtl 入力プラグイン (32bit マルチバイト)
プロセス間通信にウィンドウメッセージと名前付きパイプを使用。
- 名前付きパイプ "\\.\pipe\aui%d" を作成する。"%d" はホスト側のスレッド ID。
- ホスト側のウィンドウハンドルを引数にして aui.exe を起動する。(例 : aui.exe 0x12345678)
- aui.exe のスレッドに Input::CommandID::LoadPlugin をポストする。
- TCHAR[TextMaxSize] 型のファイル名をパイプに書き込む。
- int32_t 型の結果をパイプから読み込む。
- aui.exe のスレッドに Input::CommandID::UnloadPlugin をポストする。
- int32_t 型の結果をパイプから読み込む。
- aui.exe のスレッドに Input::CommandID::Config をポストする。
- int32_t 型の結果をパイプから読み込む。
- aui.exe のスレッドに Input::CommandID::OpenMedia をポストする。
- TCHAR[TextMaxSize] 型のファイル名をパイプに書き込む。
- int32_t 型のメディアハンドルをパイプから読み込む。
- aui.exe のスレッドに Input::CommandID::CloseMedia をポストする。
- int32_t 型のメディアハンドルをパイプに書きこむ。
- int32_t 型の結果をパイプから読み込む。
- aui.exe のスレッドに Input::CommandID::GetMediaInfo をポストする。
- int32_t 型のメディアハンドルをパイプに書きこむ。
- MediaInfo 型のメディア情報をパイプから読み込む。
- aui.exe のスレッドに Input::CommandID::ReadVideo をポストする。
- int32_t 型のメディアハンドルをパイプに書きこむ。
- int32_t 型のフレーム番号をパイプに書きこむ。
- int32_t 型のバッファサイズをパイプから読み込む。
- BYTE[バッファサイズ] 型の映像バッファをパイプから読み込む。
- aui.exe のスレッドに Input::CommandID::ReadAudio をポストする。
- int32_t 型のメディアハンドルをパイプに書きこむ。
- int32_t 型の開始サンプルをパイプに書きこむ。
- int32_t 型のサンプル数をパイプに書きこむ。
- int32_t 型の実際に読み込むサンプル数をパイプから読み込む。
- 実際に読み込むサンプル数からバッファサイズを算出する。
- BYTE[バッファサイズ] 型の音声バッファをパイプから読み込む。
Atlivu.exe (64bit UNICODE) -> auo.exe (32bit UNICODE) -> AviUtl 出力プラグイン (32bit マルチバイト)
プロセス間通信にウィンドウメッセージと名前付きパイプを使用。
- 名前付きパイプ "\\.\pipe\auo%d" を作成する。"%d" はホスト側のスレッド ID。
- ホスト側のウィンドウハンドルを引数にして auo.exe を起動する。(例 : auo.exe 0x12345678)
- auo.exe のスレッドに Output::CommandID::LoadPlugin をポストする。
- TCHAR[TextMaxSize] 型のファイル名をパイプに書き込む。
- int32_t 型の結果をパイプから読み込む。
- auo.exe のスレッドに Output::CommandID::UnloadPlugin をポストする。
- int32_t 型の結果をパイプから読み込む。
- auo.exe のスレッドに Output::CommandID::Config をポストする。
- int32_t 型の結果をパイプから読み込む。
- auo.exe のスレッドに Output::CommandID::SaveFile をポストする。
- TCHAR[TextMaxSize] 型のファイル名をパイプに書き込む。
- MediaInfo 型のメディア情報をパイプに書き込む。
- auo.exe 側からパイプデータが送られてくるのでそれを読み込む。
- Output::CommandID::End を読み込む。
- パイプデータの読み込みを終了する。
- Output::CommandID::IsAbort を読み込む。
- int32_t 型のデータをパイプに書きこむ。保存を中止するなら 0 以外を書きこむ。
- Output::CommandID::RestTimeDisp を読み込む。
- int32_t 型の現在フレームをパイプから読み込む。
- int32_t 型のフレーム総数をパイプから読み込む。
- Output::CommandID::UpdatePreview を読み込む。
- 必要ならプレビューを更新する。
- Output::CommandID::GetVideo を読み込む。
- int32_t 型のフレーム番号をパイプから読み込む。
- int32_t 型のフォーマットをパイプから読み込む。
- int32_t 型のバッファサイズをパイプに書き込む。
- BYTE[バッファサイズ] 型の映像バッファをパイプに書き込む。
- Output::CommandID::GetAudio を読み込む。
- int32_t 型の開始サンプルをパイプから読み込む。
- int32_t 型のサンプル数をパイプから読み込む。
- int32_t 型のバッファサイズをパイプに書き込む。
- BYTE[バッファサイズ] 型の音声バッファをパイプに書き込む。
- 映像を取得してビットマップを描画。
- 音声波形を取得して折れ線グラフを描画。
- シーク処理に加えて音声を再生。WaveOut を使用。
- プラグインの設定ウィンドウが後ろに行ってしまう。
- エンコード時、音声の長さがおかしいときがある。
- 32bit 版と 64bit 版の入出力インターフェイスを定義する。
- 当面は 32bit 版インターフェイスで aui.exe と auo.exe を使用する。
- 入出力プラグイン製作者の方が 64bit 版インターフェイスに対応してくれたらそれを直接使用する。
これにより入出力プラグイン側のメモリ空間が 64bit に拡張され、エンコードの安定性が増す。
さらにプロセス間通信のオーバーヘッドがなくなって処理速度が多少向上する。(AviUtl と同等にまで戻る)
- サブプロセスの exe ファイルはユーザーが誤って実行しないように拡張子を変えたほうがいいかもしれない。
- タイムラインの UI 制作をやってみたい。
- 2.0.0 - 2022/08/06 入出力を整理
- 1.0.1 - 2022/07/28 ロケールを設定するように修正
- 1.0.0 - 2022/07/16 入力プラグインと出力プラグインが使えるかテスト
- 作成者 - 蛇色 (へびいろ)
- GitHub - https://github.com/hebiiro
- Twitter - https://twitter.com/io_hebiiro
この作成物および同梱物を使用したことによって生じたすべての障害・損害・不具合等に関しては、私と私の関係者および私の所属するいかなる団体・組織とも、一切の責任を負いません。各自の責任においてご使用ください。