FFmpeg( "'X'、 '2'、 '6'、 '4'" FOURCC)を介してOpenCV 3でh264ビデオを作成するのに問題があります。 SOに関するこれまでのすべての関連記事を見てきましたが、何も役に立ちません。コード:
cv::VideoWriter writer(output_path.string(), CV_FOURCC('X','2','6','4'), 60, frame_size);
出力:
OpenCV:FFMPEG:タグ0x34363258/'X264'はコーデックID 28およびフォーマット 'mp4/MP4(MPEG-4 Part 14)'ではサポートされていませんOpenCV:FFMPEG:タグ0x00000021/'!???'を使用するフォールバック
結果のビデオは非常に小さく(バイト単位)、判読できません。 four_ccを-1に設定すると、FFmpegから「不明なタグ」が発生します。他の人が提案したようにコーデックを選択するプロンプトが表示されません。
OpenCV 3ドキュメントには次のように記載されています。
MP4コンテナを備えたFFMPEGバックエンドは、他の値をfourccコードとしてネイティブに使用します。 ObjectType を参照してください。したがって、OpenCCからfourccコード変換に関する警告メッセージを受け取る場合があります。
参照するページにはh264/x264がリストされておらず、 earlier SO posts )なので、そのステートメントの解釈方法がわかりませんH.2.6.4を使用すると、実際には同じ出力が得られます。
提案/回避策はありますか?
追伸ffmpegはUbuntuメンテナーからの最新情報です。--enable-libx264
EDIT:mp4の代わりにmkvコンテナを使用しようとしました。タグがサポートされていないという警告は消えましたが、結果のビデオはまだ読めません。
問題は、表示された警告とは関係ありませんでした。 VideoWriterが3チャンネルのカラーイメージ(VideoWriterのコンストラクターの5番目の引数であるisColorのデフォルト値は「true」)を期待している間に、私はシングルチャンネルイメージを書き込もうとしていました。ソリューションはisColorをfalseに設定していました。
ここでのあなたの発見が重要だと思います:
MP4コンテナを使用したFFMPEGバックエンドは、他の値をfourccコードとしてネイティブで使用します。ObjectTypeを参照してください。したがって、OpenCVからfourccコード変換に関する警告メッセージが表示される場合があります。
ffmpeg
に実装されたmp4タグの値はこれを確認し、 ff_mp4_obj_type[]
のisom.c
にあります。 OpenCVの cap_ffmpeg_impl.hpp
のコードは、おそらくこれをサポートするために更新する必要があります。私は1時間か2時間ぶらぶらして、それが取るに足らないことであることに気付き、保釈しました。
回避策の1つは、.avi
ファイルに出力することです。 OpenCVとmp4に問題があり、.mov
または.avi
を使用するように言われている人々の例は数多くあります。 ( こちらです 。)
@Greg Kramida:isColor = false
を設定しても役に立たなかった:メッセージは残り、出力ファイルはたったの48バイトになりました。ドキュメントによると、これはWindowsのフラグです。Linux上で私が何をしようとしても、それは良くありません。
Ffmpegでx264を単独で生成できることを確認しましたか?
コマンドラインでこれを呼び出すと、libx264の値が0x21であることを確認した後:
ffmpeg -i x264-input.mp4 -vcodec libx264 -f mp4 x264-output.mp4
0x21
を VideoWriter.open()
に直接使用することにしました。これにより、有効で解釈可能なビデオファイルが生成されます。
参考までに、私のソフトウェアはffmpeg 3.0です。
ffmpeg -version
ffmpeg version 3.0 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.9.2 (Debian 4.9.2-10)
configuration: --enable-libx264 --enable-gpl --prefix=/usr/local --enable-shared --cc=`gcc -fPIC` --enable-libfdk-aac --enable-libx265 --enable-nonfree --enable-libmp3lame
libavutil 55. 17.103 / 55. 17.103
libavcodec 57. 24.102 / 57. 24.102
libavformat 57. 25.100 / 57. 25.100
libavdevice 57. 0.101 / 57. 0.101
libavfilter 6. 31.100 / 6. 31.100
libswscale 4. 0.100 / 4. 0.100
libswresample 2. 0.101 / 2. 0.101
libpostproc 54. 0.100 / 54. 0.100
OpenCV 3.1.0は以下で構成されています:
cmake \
-D WITH_IPP=ON \
-D INSTALL_CREATE_DISTRIB=ON \
-D CMAKE_BUILD_TYPE=Release \
-D CMAKE_INSTALL_PREFIX=/usr/local ..
x264はDebian Jessieのlibx264-142:AMD64
リリースです。
OpenCVの問題であるメッセージ:
OpenCV:FFMPEG:タグ0x34363248/'H264'はコーデックID 28およびフォーマット 'mp4/MP4(MPEG-4 Part 14)'ではサポートされていませんOpenCV:FFMPEG:タグ0x00000021/'!???'を使用するフォールバック
CV_FOURCC( 'H'、 '2'、 '6'、 '4')の定義によって生成されます。この値はisom.cで定義された値と一致しません。
{AV_CODEC_ID_H264、0x21}
次に、fourccを0x21 cv :: VideoWriterとして定義するとスムーズに動作します。
cv::VideoWriter VF;
VF.open(filename,0x21,fps,frameSize,true);
ジェイムソンが上でコメントしているように、
「VideoWriter.open()に0x21を直接使用することにしました。これにより、有効で解釈可能なビデオファイルが生成されます。」