私は現在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
これは、スクリプトを使用せずに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内。
ffmpeg
は segment 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
の多くのインスタンスを呼び出す必要があるため、効率が大幅に低下します)。