OpenCVで画像をH264ビデオにエンコードしたい。
イメージトラッキング用のソフトウェアの一部として、OpenCV 3.4(64ビット)でVideoWriterをVisual Studio 2017 C++と共に使用しています。私は手動エンコードにffmpegを使用していますが、OpenCVに付属しているので、これが最良のオプションだと思います。 OpenCVの私のバージョンは、ffmpegでコンパイルされていることを示しており、opencv_ffmpeg340_64.dllをロードしていることを確認できます。
H264(AVC1)のデコードは、特にffmpeg APIを使用する場合を含め、完全に問題ありません。ただし、MJPGまたは未加工画像以外のエンコードは機能しません。VideoWriter.Open()はほとんどの場合falseを返します。場合によっては、空のヘッダーまたは小さなヘッダーのみを書き込み、フレームを書き込まないこともあります。私はffmpeg APIだけでなく、利用可能なAPIも試しました。 VC=のコンソール/デバッグ出力を中間ウィンドウにリダイレクトしても、OpenCVまたはffmpegからのメッセージは表示されません。
(Cisco)OpenH264ライブラリを含む、FFmpegを使用したOpenCVの以前のバージョンに関する多数の投稿があり、これを使用する難しさがあります。私は多くのオプションを試し、H264、ffmpeg静的バージョン、Cisco openH264ライブラリ、パスの設定などを含むコーデックパックをインストールし、OpenCVで公開されているcvCreateVideoWriterなどの低レベルのffmpegライブラリ機能を試し、さまざまなビデオコンテナー(AVI、MPG、 MP4)と同様にfourcc文字列。
2018年には、FFmpegをサポートする優れたOpenCVが難解なMJPGまたは生の画像以外をエンコードできないとは信じられません。 FFmpegを使用している場合、重要な機能セットが確実に利用できるはずですか?
私はこれはうまくいくと思いますが、次の最良のオプションは、別のffmpegライブラリを使用することです。どんな提案も歓迎します!
コードフラグメント(ビデオエンコーディングAPIを使用):
VideoWriter writer;
int codec = VideoWriter::fourcc('X', '2', '6', '4');
writer.open("test.avi", codec, 30, colorImage.size(), true);
writer.write(colorImage);
writer.release();
私自身の質問に答えるために-以前の提案に感謝します-再コンパイルを必要とせずに、フレームを作成してH264ビデオに書き込むことができました。これは私が使用したものです:
私は自分のマシン(Windows 10 64ビット)をフォーマットしたので、コーデックの競合の可能性がある問題を除外できません。また、他の組み合わせについては十分にテストしていません。これは非常に一般的な問題であるように思われるため(多くの誤解があります)、これが役立つことを願っています。