web-dev-qa-db-ja.com

ffmpegを使用して正確なフレームでカットする方法は?

私はffmpegを使用してビデオファイルを正確な時間にカットしようとしています。 ffmpegのヘルプには、開始フレームを指定するオプション-timecode_frame_startが示されていますが、このコマンドを機能させることができません。結果のビデオは常に元のビデオの先頭から始まります。これが私が実行しているコマンドの例です:

ffmpeg -i input.mpg -acodec copy -vcodec copy -timecode_frame_start 200 -vframes 210 -n ouput.mpg

Timecode_frame_startオプションを他のオプションの前後に移動しましたが、結果は変わりません。指定する必要がある追加のオプションはありますか?私はさまざまなファイル形式、mkv、avi、mp4を試しましたが、問題はコーデックに関連しているようには見えません。これが私が試した1つのファイルです:

http://www.seaotter.com/marine/movies/hermit-long-01.mpg

何か不足していますか?

29
curmil

timecode_frame_startはこのように機能しません。

フレーム番号に基づくシークはできません。特定のフレームで開始する唯一の方法は、いくつかのフレームをss.ms構文またはhh:mm:ss.msに変換することです。したがって、ビデオが25 fpsであり、133フレームから開始したい場合は、最初にタイムスタンプを計算する必要があります。

133/25 = 5.32

次に実行します:

ffmpeg -ss 5.32 -i input.mp4 -c:v libx264 -c:a aac out.mp4

すべてのフレームがイントラコード化されているわけではない(「キーフレーム」)ため、ビットストリームコピー(-c:v copy)で正確なフレームを切り取ることはできないことに注意してください。適切にデコードするには、ビデオがキーフレームで始まる必要があります。したがって、ビデオを再エンコードする必要があります。上記のように-c:v libx264を使用してH.264に変換します。入力ビデオの品質を維持する-c:v ffv1のようなロスレスコーデックを選択することもできます。

要約すると、-ssは再エンコードを実行するときに常にフレーム精度になります。

さらに特定の数のフレームをエンコードする場合は、-frames:vを使用します。次に例を示します。

ffmpeg -ss 5.32 -i input.mp4 -c:v libx264 -c:a aac -frames:v 60 out.mp4

select/aselect filters を使用してフレーム/オーディオサンプルを選択することもできることに注意してください。

ffmpeg -i input.mp4 -vf 'select=gte(n\,100)' -c:v libx264 -c:a aac out.mp4

ただし、これはビデオ全体がデコードされるため、上記の-ssオプションよりも低速です。

52
slhck

オプション

-vf select="between(n\,start_frame_num\,end_frame_num),setpts=PTS-STARTPTS"

例えば。、

-vf select="between(n\,200\,300),setpts=PTS-STARTPTS"

200番目から300番目までのフレームをビデオにカットします。シーケンスのカウントは0から始まります。

8
Nuo Chen