皆さん
パソコンでエロいことをする時に欠かせないものといえば?
そう ffmpeg ですね
最近
こういうシリーズをやってて、そこでも出てきたんですけど。
まあ、開発に限らず、エロ動画を ffmpeg で切ったり貼ったりすることが多いと思うんですよね。
このシーンカットしたいなー。この動画のこのシーンとこのシーンをつなぎたいなー。とか
まあ、色々あると思うんですよ
ネットで調べると
細かいファイルを一旦作ってから、結合するみたいなやり方が多い気がする
参考
中間ファイルを作りたくない時は今までこうやってた
$ ffmpeg \
-ss 00:00 -t 12 -i main.mp4 \
-ss 01:00 -t 30 -i main.mp4 \
-ss 00:00 -t 30 -i sub.mp4 \
-filter_complex "[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[v][a]" \
-map [v] -map [a] output.mp4
-
-ss 00:00 -t 12 -i main.mp4
は main.mp4 の 00:00 から 12 秒読みこむ -
-ss 01:00 -t 30 -i main.mp4
は main.mp4 の 01:00 から 30 秒読みこむ -
-ss 00:00 -t 30 -i sub.mp4
は sub.mp4 の 00:00 から 30 秒読みこむ -
-filter_complex "[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[v][a]"
の最初の鉤括弧の部分は concat フィルタに入力するストリームを列挙している、最後の鉤括弧の部分は concat フィルタから出力するストリームを列挙している -
-map [v] -map [a] output.mp4
は output.mp4 にどのストリームを使うかを指定している
こうすると、カットと結合が一つのコマンドでかけて、中間ファイルもできないので、ディスク IO が減って場合によってはかなり高速化される。
正直 filter_complex は可読性悪いし、どの入力が何番のストリームだっけ?ってなるので、書きにくい。。。
ffmpeg-python だとこう書ける
これが ffmpeg-python だとかなり書きやすいことに気がついた
input_stream_main = ffmpeg.input('main.mp4', ss=0, t=12)
input_stream_main_2 = ffmpeg.input('main.mp4', ss=60, t=30)
input_stream_sub = ffmpeg.input('sub.mp4', ss=0, t=30)
concatenated_stream = ffmpeg.concat(
input_stream_main.video,
input_stream_main.audio,
input_stream_main_2.video,
input_stream_main_2.audio,
input_stream_sub.video,
input_stream_sub.audio,
v=1, a=1, unsafe=True)
output_stream = ffmpeg.output(concatenated_stream, 'output.mp4')
ffmpeg.run(output_stream)
こんな感じ。そんなに簡単に見えないかもしれないが、 filter_complex にストリームの番号を書かなくてよくなったのが非常に大きい。 stream を 100 個結合したい場合などを想像してもらえるとわかりやすいかも
例えば、以下のように動画のシーンのリストを持っている時に以下のように書けるのも素晴らしい
scene_list = [(10, 300), (350, 200), (700, 180)...]
input_stream_list = []
for start, duration in scene_list:
input_stream = ffmpeg.input('input.mp4', ss=start, t=duration)
input_stream_list.extend([input_stream.video, input_stream.audio])
concatenated_stream = ffmpeg.concat(*input_stream_list, v=1, a=1, unsafe=True)
output_stream = ffmpeg.output(concatenated_stream, 'output.mp4')
ffmpeg.run(output_stream)
めちゃくちゃ良い!
まとめ
エロい男は ffmpeg 使いが上手ということですね。