Last updated on

黒塗りアプリのC++化計画!! その8!


完成?

C++で物体検出のDLLを作成して、C#で作成したGUIから呼び出すところも完成!実際にプレビューや動画の処理ができるようになった!
ちょっと試してみよう!

・・・あれ?
C++でffmpeg実行すると黒いコマンドプロンプトの画面が表示されちゃうね。
せっかくWindowsでカッコいいのにコマンドプロンプトの画面が出ちゃうと興ざめしちゃうなぁ。
出さない方法あるのかな?

調べてみると、今のffmpeg.exeをc++の_popenで呼び出している限り無理らしい。
現状でも動いているけど、_popenはもうサポートされてなくて、CreateProcessとかCreatePipeやらを使うのがおすすめらしく、これを使うと黒いコマンドプロンプトの画面は出ないみたい。
ちょっとやろうとしてみたものの、なんか使い方がよくわからない!

もうめんどくさいし、黒い画面出るままでもいいかなー?
あ、現状の黒い画面で処理速度がどうなのか、ちょっと確認してみよ。

FPSを測ってみた。

まだGUIでFPSなどが出るようにしてないから、手で計測。
結果はこんな感じ。

SDR動画

HDR動画

TensorRT(GUIから)

24FPS

22FPS

TensorRT(前回のテスト)

36FPS

26FPS

現行版
Pyinstaller+torch-tensorrt

25FPS

20FPS

なんか現行版から改善された感じがしないし、SDR動画の処理だとなんかは劣化してるよね?
前回のテストでは、コンソール(コマンドプロンプト)での実行だったから、GUI+_popenが処理速度が出ないのかも?
そういえば黒い画面が出ないというCreateProcessでも、LinuxとWindowsで比べてみると、Windowsはめっちゃ遅いとかなんとか。プロセス間の通信だからそもそもあまり速くはないと思うけど、Windowsはかなり遅いのかも?
うーん・・・

さてどうしよう?

従来よりも処理速度が出るのであれば、黒い画面が出るけれどもそのままリリースしてもいいかなー?と考えたりしてましたが、処理速度が出ないならあまり意味はありません。
DirectML対応でAMDやIntelでも処理ができるようになりましたが、黒い画面が出る状態でSDR画質でざっくり13FPSくらいでした。
ffmpeg.exeを_popenなどで利用することがネックになって、処理速度が落ちているのだろうと思います。

FFmpegは、当初、ライブラリやDLLをC++のコードに取り込んで、処理に利用しようと考えていました。しかし、FFmpegはGPLライセンスで、全てのコードをオープンにしないいけない、という取り決めがあります。

これに対してCUDAやTensorRTのNVIDIAのライブラリやDLLのライセンスでは、NVIDIAのコードをオープンにしてはいけない、という取り決めになっています。

FFmpegのライセンス規定とNVIDIAのライセンス規約が相反することや、FFmpegの取り込みでの処理があまりうまくいっていなかったこともあり、ffmpeg.exeでの利用とすることで、ライセンス問題の回避や開発のハードルを下げることを考えていました。
事前のテストでは、ffmpeg.exeでの利用でも処理速度は出ていたので、これで進めて問題ない!と判断していたのですが・・・

こうなると、ffmpeg.exeでの利用ではなく、ライブラリやDLLを利用してよりと密接な状態でFFmpegを利用しないと処理速度の改善は期待できそうにありません。

しかしライセンスはどうなのか?
FFmpegのライセンスには、上記のGPLの他に、LGPLというライセンスがあります。GPLとLGPLはFFmpegをビルドする際のオプション設定で、変更できます。
GPLとLGPLで、ビルドされた後、何が違うか?というと、一番の違いはx264というコーデックの有無です。x264が必要であればGPL、必要なければLGPLとなります。
では、私のアプリにx264が必要か?というと、NVENCやAMF、QSVといったハードウェアエンコードを利用するので特に必要ではありません。(x264はソフトウェアエンコード)
LGPLでビルドしたffmpeg.exeでサポートしているエンコーダー一覧を表示した時、NVENCやQSVがあったので問題なさそうです。

次に、LGPLにした場合、NVIDIAのライセンスと喧嘩することになるのか?を、LGPLのライセンス条項から確認します。
LGPL(Lesser GNU GENERAL PUBLIC LICENSE)は、GPL(GNU GENERAL PUBLIC LICENSE)から派生したライセンスで、劣化や低位(Lesser)のGPLライセンスになります。
GPLでは、利用する側も全てオープンソースにして同じくGPLライセンスであることを強制するライセンスで、GPL汚染と言われるようにあまり積極的に利用しようと思えないものでした。
LGPLでは、より利用しやすいように緩和されており、利用する側のライセンスをGPLに強制することはない、ソース開示も必須ではない、というようになっています。

FFmpegをC++で利用するには、静的リンク、動的リンクの両方を利用する必要があり、開発したアプリのソース開示は必要になりますが、アプリをGPLにする必要がないため、アプリで利用しているNVIDIAのソース開示要求には至らない、と考えられそうです。

LGPL版のFFmpegであればライセンス上の問題、利用上の問題は回避できそうです。
じゃあ、あとは作るだけだ!!
これが全然うまくいかない・・・
設定する項目やたくさんの前提があり、ffmpeg.exeの呪文のようなオプションコードをゼロから作るような、そんな難しさを感じます。
ffmpegを作った人、ほんとすごい。
使うだけでこんなにパニくるのに、作ったっていったい・・・

というわけで、大変苦労しているので、リリースはもうしばらく先になりそうです・・・