通常は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 への回答で同様の動作を報告している可能性があります=。
おそらく 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平面ピクセル形式になります。
これがFFmpegのバグなのか、FFmpegがサポートやサポートの欠如をより適切に文書化する必要があるのかどうかにかかわらず、プログラミングの質問は実際にはわかりません。誤ったフレームサイズを生成しているバグを修正し、FFmpegがこの問題について警告してくれたことに感謝する必要があります。拡張またはリサンプリングによってサイレントに「修正」すると、エンコードされたビデオに小さな「ジッター」が発生し、微妙に欠陥が残る可能性があるためです。出力ビデオと低圧縮品質。
サイズ変更を機能させるには、スケールモードを指定する必要がある場合があります。私は自分の実装からこれをつかみました。
--custom-anamorphic --display-width 1920 --keep-display-aspect --modulus 8 --crop 0:0:0:0
入力フレームレートの-r 30
パラメータを省略し、代わりに出力フレームレートの-framerate 30
を使用してみてください。私は同じ問題を抱えていました、そしてそれは私のために働きました。