web-dev-qa-db-ja.com

ビデオファイルをいくつかのセグメントにスライスする

私は現在ffmpegを使用してビデオファイルをスライスしています。 ffmpeg_split.shというスクリプトを使用してプロセスを自動化しました。これは非常に遅いですが、ビデオを同等の設定に分割するのに効率的です。唯一の問題は、フレームレートの問題があることです。以下の邪悪なスープは、ffmpegでsegmentを使用してこれをすべて行う方法を推奨しました。私はこれを試しましたが、それは私に同等の期間セグメントを与えません。

[〜#〜]更新[〜#〜]

このコマンドを使用してビデオをセグメント化するevilsoupごと:

ffmpeg -i input.mp4 -c copy -map 0 -segment_time 8 -f segment output%03d.mp4

古い:

スクリプトでビデオをスライスする構文は次のとおりです:ffmpeg_split.sh -s test_vid.mp4 -o video-part%03d.mp4 -c 00:00:08

結果

my_split_script.sh

input.mp4 – Duration 00:01:20
#EXTINF:10,
Output01.mp4
#EXTINF:10,
Output02.mp4
#EXTINF:10,
Output03.mp4
#EXTINF:9,
Output04.mp4
#EXTINF:10,
Output05.mp4
#EXTINF:10,
Output06.mp4
#EXTINF:11,
Output07.mp4
#EXTINF:10,
Output08.mp4
real    0m30.517s #execution time

ffmpeg

input.mp4 – Duration 00:01:20
#EXTINF:10,
Output01.mp4
#EXTINF:10,
Output02.mp4
#EXTINF:6,
Output03.mp4
#EXTINF:10,
Output04.mp4
#EXTINF:10,
Output05.mp4
#EXTINF:7,
Output06.mp4
#EXTINF:10,
Output07.mp4
#EXTINF:9,
Output08.mp4
real    0m7.493s #executition time
8
Code_Ed_Student

これは、スクリプトを使用せずにffmpegから直接実行できます。基本的にffmpeg segmentを使用する場合は常に、各セグメントに指定した時間の近くで分割するように最善を尽くします。これはkey_framesに基づいており、最も近いキーフレームを見つけてそこでカットします。正確なセグメントをカットするには、ビデオ全体を再エンコードする必要があります。

ffmpeg -i input.mp4 -c:v libx264 -crf 22 -map 0 -segment_time 9 -g 9 -sc_threshold 0 -force_key_frames "expr:gte(t,n_forced*9)" -f segment output%03d.mp4

-crf-sc_threshold-force_key_framesを読み取る必要があります。 ffmpeg のWiki内。

11
techAddict82

ffmpegsegment muxer を使用して実際にこれを行うことができます

ffmpeg -i input.mp4 -c copy -map 0 -segment_time 8 -f segment output%03d.mp4

最良の結果を得るには、必ずドキュメントを読んで少し試してみてください(ほとんどの目的にはデフォルトで十分ですが、100%正確に分割することはできません)。


一般に、ファイルから継続時間などの情報を取得する必要がある場合は、ffprobeにバンドルされているffmpegを使用することをお勧めします。これにより、key=valueペアの束として情報が出力されるため、処理がはるかに簡単になります。

ffprobe -show_format file.mp4 | grep -F duration | cut -d= -f2
## or, if you want hh:mm:ss format:
ffprobe -show_format -sexagesimal file.mp4 | grep -F duration | cut -d= -f2

...しかし、シェルスクリプトよりもffmpeg自体のオプションに依存する方がおそらく良いと思います(これは、ffmpegの多くのインスタンスを呼び出す必要があるため、効率が大幅に低下します)。

10
evilsoup