出力が .avi ファイルとして指定されている場合、.avi ファイルの一部を切り取ることは正確ではありません (ただし、出力が .mp4 ファイルとして指定されている場合は正確です)

出力が .avi ファイルとして指定されている場合、.avi ファイルの一部を切り取ることは正確ではありません (ただし、出力が .mp4 ファイルとして指定されている場合は正確です)

私は一部を切り取ろうとしている.aviコマンドを使用してファイル

ffmpeg -ss 346 -i input.avi -t 5 -c copy -y output.avi

出力ビデオの合計時間は約13秒で、必要な時間より8秒長くなります。しかし、出力ファイルの拡張子を次のように指定すると、.mp4、カットは正確です。なぜこのようなことが起こるのか理解したいと思います。

どのような助けでも大歓迎です。

答え1

AVI と MP4 はデータ ストリームのコンテナーであり、MP4 の方がはるかに優れています。

MP4コンテナでは、内部的にリストを編集

たとえば、ソース ビデオから 346 秒から 351 秒をコピーするとします (実際にそうしているように見えます)。346 秒より前の最も近いキーフレームが 338 秒にある場合、ffmpeg は実際には 338 秒からビデオをコピーしますが、MP4 の編集リスト マジックを使用して、メディア プレーヤーに最初の 8 秒をスキップするように指示します。

同じ論理かもしれないカットの最後にも適用されます (確信はありません。テストする必要があります)。そうであれば、編集リストはメディア プレーヤーに再生を早く停止するように指示します。

AVI は MP4 のように編集リストをサポートしていないため、AVI コンテナでは 13 秒のカット全体が表示されます。

これが意味を成すことを願っています。質問がある場合はコメントを残してください。明確に説明できるよう努めます。

編集ffmpeg が何をしているかを視覚的に示すために図を作成しました。

再エンコードしない場合にffmpegがカットする方法

関連情報