web-dev-qa-db-ja.com

FFmpegx264エンコード設定

私の新しいCanonVixia HF G30ビデオカメラには、1080p60で35 Mbit/sec Mp4に直接エンコードするオプションがあり、それは素晴らしい仕事をします。私は主に娘の高校のバスケットボールの試合を記録するためにそれを使用します。

カメラファイルからハイライトを作成する必要があり、可能な限り多くの品質と明瞭さを維持したいと思います。 FFmpegについての私の限られた理解で開発したワークフローは次のとおりです。

ステップ1.)カメラで生成されたmp4クリップを1つのゲームを表す1つのmp4ファイルに結合します。これは、Windowsコマンドプロンプト(DOSボックス)からこのステップに使用する代表的なコマンドです。

ffmpeg -f concat -i "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\gameclipsfromcamera.txt" -c copy "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\joined_fullgame.mp4"

これは、トランスコーディングなしでゲームクリップをゲームビデオに結合するので(私は信じています)、これは良いことです(高速で、追加の圧縮アーティファクトは導入されません)。

ステップ2.)ゲームビデオからハイライトクリップを切り取ります。このステップで使用する代表的なコマンドは次のとおりです。

ffmpeg -ss 00:00:06.00 -i "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\joined_fullgame.mp4" -acodec copy -vcodec copy  -t 00:00:20.00 "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\1.mp4"

これにより、ゲームビデオの6秒から始まる次の20秒のクリップが生成されます。

ハイライトサンプル (85 MB)

ステップ3.)各ハイライトクリップの先頭で、テキストオーバーレイが娘を識別する2秒間の一時停止が必要です。これを取得するために、クリップの最初のフレームからビットマップ画像を作成します。

ffmpeg -i "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\1.mp4" -ss 00:00:00.00 -f image2 -vframes 1 -deinterlace "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\1freezeframe.bmp"

これが 結果 です。

次に、CRF 0でビデオを2秒間ループして、追加のアーティファクトを導入しません。

ffmpeg -loop 1 -r 59.97 -i "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\1freezeframe.bmp" -c:v libx264 -crf 0 -pix_fmt yuv420p  -t 2  "\\Excelhero\f\Canon\2013.09.21_san_francisco_game2\1freezeframe.mp4"

次に、Fionaを識別するテキストオーバーレイラベルを追加します。

ffmpeg -i "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\1freezeframe.mp4" -vf drawtext="fontfile=/Windows/Fonts/Corbelb.ttf:text='Fiona':fontsize=40:fontcolor=yellow:x=1321:y=417"  -b:v 35M -minrate 35M -maxrate 35M -bufsize 35M    -profile:v high -level:v 4.2  -refs 2  -pix_fmt yuv420p  -bf 0    -r 59.97 "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\1freezeframeannotated.mp4"

これはこのファイルを生成します:[ehasamples.excelhero.com/video/1freezeframeannotated.mp4]

(SuperUserでは、2つのライブリンクのみを含めることができました)

次に、サイレントサウンドストリームをクリップに追加します。

ffmpeg -f lavfi -i aevalsrc=0:0:sample_rate=48000 -i "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\1freezeframeannotated.mp4" -shortest -c:v copy -c:a aac -b:a 255k -strict -2 "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\1freezeframeannotatedwithsilentsound.mp4"

結果:[ehasamples.excelhero.com/video/1freezeframeannotatedwithsilentsound.mp4]

(SuperUserでは、2つのライブリンクのみを含めることができました)

上記は、私の娘が空白のサウンドストリームで仮死状態でラベル付けされた2秒のビデオです。

ステップ4.)最後の操作は、2秒のビデオをカメラからの完全なクリップに結合することです。この方法で、これら2つの入力ファイルから1つの出力ファイルを生成するフィルターを使用して、簡単に再レンダリングできます。

ffmpeg -i "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\1freezeframeannotatedwithsilentsound.mp4" -i "\\Excelhero\f\Canon\2013.09.21_san_francisco_game2\1.mp4" -filter_complex "[0:0] [0:1] [1:0] [1:1] concat=n=2:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" -c:v libx264 -r 59.97 "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\1done.mp4"

しかし、これは優れたソリューションではありません。ビデオカメラからの元の映像が新しい圧縮アーティファクトの導入で再レンダリングされるため、時間がかかります。 「-crf0」を追加してロスレス再レンダリングを行うこともできますが、これによりクリップのサイズが1000%をはるかに超えて膨張し、この場合、サンプルクリップがギガバイトを超えます。したがって、これは実用的な解決策ではありません。

だから私はフィルターの代わりにconcatdemuxerを使いたい:

ffmpeg -f concat -i "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\clipfiles.txt" -c copy "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\1doneBAD.mp4"

このアプローチでは、再エンコードがないため、操作が迅速です。しかし、結果のファイルは正しく再生されません。ここにあります:

[ehasamples.excelhero.com/video/1doneBAD.mp4]

(SuperUserでは、2つのライブリンクのみを含めることができました)

2秒の画像には、22秒全体が表示されます。ビデオは正しく再生されませんが、サウンドは問題なく機能しているようです。したがって、2つのファイル(カメラからのクリップと2秒のラベルクリップ)は、相対的なエンコーディングが離れすぎていると思います。 MediaInfoとFFProbeを使用して、エンコードに関して可能な限り同一に近づけようとしました。上記の一連のコマンドが最善ですが、明らかに十分ではありません。

だから私が持っている質問は単純にこれです:Concat demuxが成功するために、FFmpegでカメラからのエンコードされた映像のようにラベル付けされたクリップを十分に作ることは可能ですか?もしそうなら、どのように?

このワークフロー全体はバッチファイルによって駆動され、私の側では非常に単純なので、この方法論を使用して、今後のゲームのハイライトをすばやく編集できるようにしたいと考えています。

逆に、FFmpegを使用したより良い(より速い、トランスコーディングなしの)ワークフローはありますか?

よろしくお願いします。

3
fionasdad

高速ディスクを使用している場合は、ffvhuffなど、より多くの一時スペースを使用する、より高速なロスレスコーデックを使用することをお勧めします。それ以外の場合は、-preset ultrafast-crf 0とともに使用します。 (-qp 0と同じで、ロスレスモードを有効にします。)

x264 slowは、ロスレスモードでsuperfastよりもわずかに圧縮するだけです。たぶん、1フレーム以上前にビットが同一のブロックがあるアニメーションがあり、複数のrefフレームが役立つ場合は、設定を高くするとより多くのことができます。私の調査結果は、1時間22分NTSC DVインターレース解除(720x480p60)の場合、27.9GB(superfast)対27.0GB(slow)、つまり55.0GBでした。 ffvhuffの場合は37.6GB、ffv1の場合は37.6GB(デフォルト設定、ffv1の圧縮/解凍設定がさらに遅い場合はやや小さい)すべてyuv420)。そのビットレートでのCABACエンコード/デコードには、大量のCPUが必要です。超高速ではなく超高速、または単に-x264-params cabac=0を使用する必要がありました。

TL; DR:中間ファイルにはlibx264 -preset ultrafastまたはffvhuffを使用

cABACを使用したffv1またはh.264は、ファイルサイズが実際には重要でない場合、CPU時間のエンコード/デコードの価値がありません。そして、huffyuvはyuv 4:2:0を実行しません。そのためには、ffvhuffが必要です。 LagarithはGPLですが、デコーダーはffmpegのみであり、エンコーダーはWindows以外には移植されません。 (速度と圧縮のトレードオフは、おそらくアニメーションのようなノイズのないソースを除いて、x264に対してもそれほど印象的ではありません。エントロピーコーダーの前の予測/ランレングスのものがうまくいくでしょう。)

また、bmp-> 2秒のビデオステップで-vf drawtextを使用できることを確認してください。そして、なぜそのためにハードCBR(ビットレート35M、最大ビットレート35M)を使用しているのですか?そのステップでもロスレスではないのはなぜですか?

通常、x264の特定のプロファイルには役立ちません。ビットストリームに何を入れるかを考慮して、出力のプロファイルフラグを可能な限り低く設定します。 (つまり、8x8dct=1の場合、プロファイルを高に設定し、rez、ビットレート、およびrefフレームに基づいてどのレベルを計算します。)編集:-profileは、x264にrefフレーム数またはその他の必要な設定を強制的に下げます。指定されたプロファイルの制限を維持します。それでも、一部のHWデコーダーを対象としない限り、使用する必要はほとんどありません。

IS損失の多い最終エンコードで役立つのは、-preset slowerなどを使用して、x264でより多くのCPU時間を使用できるようにすることですが、同じビットレートでより多くの品質を得ることができます。 refフレーム、トレリス、アダプティブbフレーム、モーション検索などのすべてのノブ。

実際の質問に答えるには、さまざまなh.264ストリーム(カメラのエンコーダーからおよびBMP-> x264)から)を連結できるようにするために重要なのは、解像度、色空間だけです。 (yuv420とyuv444など)、そしておそらくインターレースかどうかなど、いくつかのh.264ストリームパラメータ。

35Mbit/s全体を維持することを計画していて、インターネット経由で送信できる妥当なファイルサイズにしたくない場合は、カメラのハードウェアエンコーダーが実行しているものと一致させる必要があります。 。または、すべてをx264で実行することもできますが、これには時間がかかりますが、-preset veryslowを使用すると、目立った品質の低下をほとんど伴わずに、おそらく10Mbit/s、場合によっては5を実行できます。 -crf 18を試してください。これは、通常、ほとんど透過的です。 (ええ、x264フレームとソースフレームの間で一時停止して前後に反転すると、違いに簡単に気付くことができます)。

shouldの場合、ffmpegの1回の呼び出しでプロセス全体を実行できます。最終的にconcatフィルターで終わるフィルターグラフには、2秒間の静止画像の繰り返しを生成するチェーンと、入力ファイル->出力だけのチェーンが点在する無音を含めることができます。

(または、本当にカメラ出力をxcodeしたくない場合で、カメラの出力とx264の違いを理解できる場合:静止画像ごとにffmpegを1回呼び出してから、最後に1つ連結します。)

電話やカメラのハードウェアエンコーダーは通常かなり悪いです。彼らが見栄えのする唯一の方法は、問題に多くのビットレートを投げることです。 x264は通常、特にはるかに優れています。 -presetが遅い、遅い、または非常に遅い。明らかに別の世代の損失が発生しますが、通常、非常に鮮明なディテールを備えた1080p @ 24fpsハリウッド映画の場合、ビデオのビットレートを2Mbit/sに削減できます。常に動きの激しいノイズの多いハンドヘルドソースはより多くのビットを必要としますが、-crf 18は一定の品質であるため、適切なモニターで近くでも見るのに十分なものとしてお勧めします。ただし、ストレージが安くなるだけで、x264出力から元の品質を復元することはできないため、おそらく元のソースを保存しておきます。それでも、私はそれらを保持するだけです。このファイルを誰かに渡したり、インターネット経由でコピーしたりする場合は、x264 -preset slowが適しています。デフォルトの-preset mediumでも問題ありません。目標のビットレートや品質を設定しない場合、デフォルトは-crf 23だと思います。

X264を取得して、カメラの非xcodedビットストリームと連結できる出力を作成する方法については、あまり答えていません。これは、私がしなければならなかったことではなく、調べることにあまり興味がないためです。申し訳ありません。 。ほとんどの場合、あなたの出発点をたどりたいと思った人が-crf0やそのようなばかげたものに導かれないように答えます。 :P

1
Peter Cordes