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


22

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を試しましたが、コーデックに関連する問題ではないようです。ここに私が試したファイルがあります:

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

何か不足していますか?


これは、それがIフレームのみに再同期化することができるので-vcodecコピーして、あなたが「本当に」、フレームの特定のカットを得ることができないことをメーリングリストで答え(およびNBた表示されます
rogerdpack

@ user39364メーリングリストで尋ねたところ、このオプションはOPが望んでいることをしないことがわかりました。私も何か新しいことを学びました:)
slhck

を使用して正確なフレームでカットする方法を見つけたことに注意したいだけです。コマンドラインからビデオファイルmelt正確にカットする-スーパーユーザー
-sdaau

回答:


46

私はちょうど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)で正確なフレームをカットすることはできません。これは、すべてのフレームがイントラコード化されておらず、独立しているためです。

-ss 常にフレーム精度になります。

特定のフレーム数をエンコードする場合-frames:vは、たとえば、を使用します。

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

ビデオフィルター使用することもできますが、音声のサポートは正確ではない場合があります。そして、明らかに、フレームでのシークはまだ機能ではありません。詳細については、このFFmpeg-usersメーリングリストスレッドを参照してください。

-vf select正確なフレーム選択に使用できます(-vf 'select=gte(n\,100)'最初の100フレームをスキップするようなもの )


3
10分を超えるドロップフレーム(29.97fpsなど)のビデオの場合。特定のフレームの時間を正確に計算するにはどうしますか?
GFoley83

select=gte(n\,100)この方法では動作しますが、シークはパフォーマンスを食べています。一度に30フレームだけをエンコードしてテストする場合、ビデオを開始するほど、シークのためにffmpegの完了に時間がかかります。
アダムグラント

6

オプション

-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から始まります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.