web-dev-qa-db-ja.com

LinuxでFFmpegを使用してOpenCV 3からx264を作成する

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コンテナを使用しようとしました。タグがサポートされていないという警告は消えましたが、結果のビデオはまだ読めません。

14
Greg Kramida

問題は、表示された警告とは関係ありませんでした。 VideoWriterが3チャンネルのカラーイメージ(VideoWriterのコンストラクターの5番目の引数であるisColorのデフォルト値は「true」)を期待している間に、私はシングルチャンネルイメージを書き込もうとしていました。ソリューションはisColorをfalseに設定していました。

6
Greg Kramida

ここでのあなたの発見が重要だと思います:

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

0x21VideoWriter.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リリースです。

8
Jameson

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を直接使用することにしました。これにより、有効で解釈可能なビデオファイルが生成されます。」