これは不可能かもしれないとわかっていますが、少なくとも何が起こっているのか理解していただければ幸いです。
2 秒ごとに強制的にキーフレームが挿入されるビデオがあります。 理想的には、再エンコードせずにフレーム パーフェクトなスライスを取得できるとよいのですが。 たとえば、次のようになります。
ffmpeg -ss 00:00:00 -i original.mp4 -t 2 -c copy slices_0.mp4
ffmpeg -ss 00:00:02 -i original.mp4 -t 2 -c copy slices_1.mp4
ffmpeg -ss 00:00:04 -i original.mp4 -t 2 -c copy slices_2.mp4
...
これはうまく機能しないようです。
さらに詳しく調べてみると、最初のスライスはフレーム精度が正確ですが、それ以降はすべてわずかにずれているようです (他の問題があるかもしれませんが、今はこれに焦点を当てています)。最初のフレームは問題ないようです:
# same output
ffmpeg -ss 00:00:03 -i original.mp4 -vframes 1 o.png && md5 o.png
ffmpeg -ss 00:00:00 -i slices_1.mp4 -vframes 1 1.png && md5 1.png
しかし、その後はすべてオフです。
# not the same output
ffmpeg -ss 00:00:04 -i original.mp4 -vframes 1 o.png && md5 o.png
ffmpeg -ss 00:00:01 -i slices_1.mp4 -vframes 1 1.png && md5 1.png
何をやっても同じ結果になります。フレーム 60 のオリジナルの PTS を見ると、2.002000 (2 ではなく) になります。ただし、これをスライスに使用しても、同じオフセットになります。
どうしたの?
(おそらく関係ないと思いますが、0_slices.mp4 の最初のフレームに、オリジナルにはない PST/DST オフセットがあるのはなぜか気になります)
答え1
フレーム精度のシークが必要な場合は、-ss
入力ファイルの後にフラグを置いてみてください。
つまり、次のようになります。
ffmpeg -i original.mp4 -ss 00:00:04 -vframes 1 -f image2 0.png
。
入力ファイルの前にフラグを置くと、ss
PTS の観点からは「大まかな推測」になりますが、機能するには I フレームにスナップする必要があります。ss
入力ファイルの後にフラグを置くよりもはるかに速く実行されますが、精度が低くなります。
入力ファイルの後にフラグを置くとss
、FFmpeg はファイルの先頭から時間が始まるまでずっとデコードします-ss
。その後、時間より前のすべての情報をダンプしますss
... そのため、時間は大幅に長くなりますが、正確であるはずです。