web-dev-qa-db-ja.com

H264へのOpenCVエンコーディング

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();
6
Yost777

私自身の質問に答えるために-以前の提案に感謝します-再コンパイルを必要とせずに、フレームを作成してH264ビデオに書き込むことができました。これは私が使用したものです:

  • OpenCVバージョン3.4.1の使用
  • Exeと同じフォルダー:opencv_ffmpeg341_64.dll(OpenCVに付属)
  • 同じフォルダ内:openh264-1.7.0-win64.dll(入手可能: https://github.com/Cisco/openh264/releases
  • 特定のエンコーディングAPIを省略して、OpenCV VideoWriterクラスを使用する
  • コンテナ:MP4
  • コーデックfourcc文字列: "H264"

私は自分のマシン(Windows 10 64ビット)をフォーマットしたので、コーデックの競合の可能性がある問題を除外できません。また、他の組み合わせについては十分にテストしていません。これは非常に一般的な問題であるように思われるため(多くの誤解があります)、これが役立つことを願っています。

7
Yost777