2
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ffmpeg-python で中間ファイルを作らずに動画を切り貼りする

Last updated at Posted at 2022-05-22

皆さん

パソコンでエロいことをする時に欠かせないものといえば?

そう 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 使いが上手ということですね。

2
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?