web-dev-qa-db-ja.com

ffmpegは異なるサイズのフレームからビデオをエンコードできますか?

通常は1920x1080ですが、場合によっては1919x1080または1920x1079のフレームを生成するツールチェーンがあります。 (はい、これはバグです。読んでください。)ffmpegが次のようなコマンドでビデオをエンコードする場合

ffmpeg -y -r 30 -i foo/%04d.png -vcodec h264 out.mp4

次に、次のようなコメントを出力します

Input stream #0:0 frame changed from size:1919x1080 fmt:rgb24 to size:1920x1080 fmt:rgb24

ただし、これらのフレームは、サイズが変更されてout.mp4に含まれるのではなく、out.mp4から省略されます。

それらのフレームを含めることはできますか?フォーラムやドキュメントで一定でないフレームサイズについての言及は見つかりませんでしたが、ここでffmpeg自体クレームでフレームのサイズを変更しています。 (コメントはffmpeg.cの1688行目に出力されます。そこで、フラグresample_changedが設定され、InputStream *istの幅と高さのフィールドが修正されます。)

デビッドエリマンは、 https://stackoverflow.com/questions/18043841/ffmpeg-missing-image-frames-in-generated-video-from-images?rq=1 への回答で同様の動作を報告している可能性があります=。

3

おそらく scale ビデオフィルターはあなたが探しているものを提供することができます:

ffmpeg -r 30 -i foo/%04d.png -vf "scale=1920:1080,format=yuv420p" -codec:v libx264 out.mp4

これにより、フレームごとに1920x1080のサイズが強制されます。これにより、奇妙なサイズの入力が正しくスケーリングされずに単純にトリミングされた場合、画像がわずかに引き伸ばされたり押しつぶされたりする可能性があります。その場合は、代わりに pad ビデオフィルターの使用を検討してください。ただし、欠落しているピクセルを補うために単色のバーが表示されることに注意してください。

scaleは、さまざまな 関数 も受け入れます。例については、 静的サイズのプレーヤーに収まるようにffmpegを使用してビデオのサイズを変更する を参照してください。

追加した format=yuv420p libx264のRGB入力では、ffmpegはクロマサブサンプリングを回避しようとするため、ほとんどのプレーヤーがデコードできないYUV 4:4:4平面ピクセル形式になります。

3
llogan

これがFFmpegのバグなのか、FFmpegがサポートやサポートの欠如をより適切に文書化する必要があるのか​​どうかにかかわらず、プログラミングの質問は実際にはわかりません。誤ったフレームサイズを生成しているバグを修正し、FFmpegがこの問題について警告してくれたことに感謝する必要があります。拡張またはリサンプリングによってサイレントに「修正」すると、エンコードされたビデオに小さな「ジッター」が発生し、微妙に欠陥が残る可能性があるためです。出力ビデオと低圧縮品質。

サイズ変更を機能させるには、スケールモードを指定する必要がある場合があります。私は自分の実装からこれをつかみました。

--custom-anamorphic --display-width 1920  --keep-display-aspect --modulus 8 --crop 0:0:0:0
0
FlavorScape

入力フレームレートの-r 30パラメータを省略し、代わりに出力フレームレートの-framerate 30を使用してみてください。私は同じ問題を抱えていました、そしてそれは私のために働きました。

0
pelagos