機械学習のためにffmpegを使って動画をカットしたいです。
たとえば、25fps でビデオの 1 秒をカットした場合、正確に 25 フレームの同期されたオーディオとビデオが提供されるようにするにはどうすればよいですか?
ffmpeg はカット時にキーフレームを探し、最も近いものを選択することがわかりました。負のタイムスタンプが生成され、カットされたビデオの最後がコピーされたフレームで埋められるため、問題が発生しました。
メタデータには実際の fps などが表示されないことは理解しています。
では、オーディオ ストリームと一致する正確なフレーム数で正確なカットを取得するためのパイプラインはどのようなものになるでしょうか?
ありがとう
答え1
ビデオのコーデックとコンテナによっては、直感に反するいくつかの手順が必要になる場合があります。多くのコーデックでは、ランダムなインポイントとアウトポイントを直接許可しません。
- まず、ビデオをカットする必要があります (しばらくはオーディオを無視します)。これは、ffmpeg のいずれかまたは別のインスタンスを使用してパイプすることで最もよく行われます
-ss inpoint
。-pix_fmt yuv420p -an -f yuv4mpegpipe -frames:v 25
これx264
は、ビデオ ストリームをフレーム単位でカットする信頼性の高い方法であることが証明されています。 - オーディオの場合、最も簡単な方法は、
-c:a pcm_s16le
'-f s16le' に変換し、正しいオフセットからの正しいバイト数が含まれるようにファイル レベルで結果を操作することです。 - 最後の
ffmpeg
パスでは、必要に応じてオーディオを圧縮するか、ビデオに多重化することができます。生の PCM にはタイムスタンプが含まれていないため、非同期になる可能性はありません。
これは、疑わしいソース (つまり、広告主からのコマーシャル クリップ) からのビデオを、アーティファクトを発生させることなく、高度に規制されたリニア ストリーム (つまり、TV チャンネル) に配置するための信頼性の高い方法であることが証明されています。