音声に写真をくっつけることができたので、今夜は、動画+動画をくっつけることに挑戦!
FFmpegで複数の動画ファイルを結合する方法
はじめに
動画編集において、複数の動画ファイルを1つに結合する作業は頻繁に発生します。今回は、FFmpegのconcatフィルターを使用して、効率的に動画ファイルを結合する方法を解説します。
前提知識
FFmpegとは
FFmpegは、動画・音声ファイルの変換、編集、ストリーミング配信などを行うことができるオープンソースのマルチメディアフレームワークです。コマンドライン上で動作し、様々な形式の動画・音声ファイルを扱えます。
concatフィルターとは
concatフィルターは、FFmpegが提供する複数のメディアファイルを連結(結合)するための機能です。『concat』は『concatenate』の略で、『連結する』という意味です。
実際の作業手順
- ファイルリストの作成
まず、結合したい動画ファイルのリストを作成します。
echo "file '001.mp4'" > filelist.txt
echo "file '002.mp4'" >> filelist.txt
コマンドの解説
echo: 指定した文字列を出力するコマンドです
> リダイレクト演算子。出力をファイルに書き込みます(上書き)
>> リダイレクト演算子。出力をファイルに追記します
filelist.txt: 結合対象のファイル一覧を記述するテキストファイルです
2. ファイルリストの確認
作成したファイルリストの内容を確認します。
cat filelist.txt
コマンドの解説
cat: ファイルの内容を表示するコマンドです(『concatenate』の略でもあります)
3. FFmpegによる動画結合
ffmpeg -f concat -safe 0 -i filelist.txt -c copy merged_output.mp4
オプションの詳細解説
-f concat: 入力フォーマットをconcatに指定します
-safe 0: ファイルパスの安全性チェックを無効化します(相対パスや特殊文字を含むファイル名でも処理可能)
-i filelist.txt: 入力ファイルとしてファイルリストを指定します
-c copy: エンコードを行わず、ストリームをそのままコピーします(高速処理が可能)
merged_output.mp4: 出力ファイル名です
この方法のメリット
- 高速処理
-c copyオプションにより再エンコードを行わないため、処理時間が大幅に短縮されます。 - 品質劣化なし
再エンコードを行わないため、動画の品質が劣化しません。 - 大量ファイルの処理
ファイルリストを使用することで、多数の動画ファイルを一度に処理できます。
ファイル形式の統一
結合する動画ファイルは、同じコーデック、解像度、フレームレートである必要があります。異なる場合は再エンコードが必要となります。
ファイルパスの記述
ファイルリスト内では、ファイル名をシングルクォートで囲む必要があります。スペースや特殊文字を含むファイル名でも正しく処理されます。
応用例
より多くのファイルを処理する場合
応用例 より多くのファイルを処理する場合
# 複数ファイルを一度にリストに追加
for i in {001..010}; do
echo "file '$i.mp4'" >> filelist.txt
done
異なる形式のファイルを結合する場合
# 再エンコードありの結合
ffmpeg -f concat -safe 0 -i filelist.txt -c:v libx264 -c:a aac merged_output.mp4
まとめ
FFmpegのconcatフィルターを使用することで、複数の動画ファイルを効率的に結合できます。特に-c copyオプションの使用により、高速かつ品質劣化のない処理が可能です。動画編集作業において、このテクニックは非常に有用です。
pk desktop % cat filelist.txt
file '001.mp4'
file '002.mp4'
pk desktop % ffmpeg -f concat -safe 0 -i filelist.txt -c copy merged_output.mp4
ffmpeg version 7.1.1 Copyright (c) 2000-2025 the FFmpeg developers
built with Apple clang version 17.0.0 (clang-1700.0.13.3)
configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/7.1.1_3 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags='-Wl,-ld_classic' --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libharfbuzz --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-audiotoolbox --enable-neon
libavutil 59. 39.100 / 59. 39.100
libavcodec 61. 19.101 / 61. 19.101
libavformat 61. 7.100 / 61. 7.100
libavdevice 61. 3.100 / 61. 3.100
libavfilter 10. 4.100 / 10. 4.100
libswscale 8. 3.100 / 8. 3.100
libswresample 5. 3.100 / 5. 3.100
libpostproc 58. 3.100 / 58. 3.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x14c810760] Auto-inserting h264_mp4toannexb bitstream filter
Input #0, concat, from 'filelist.txt':
Duration: N/A, start: 0.000000, bitrate: 5611 kb/s
Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 50 kb/s
Metadata:
creation_time : 2025-07-21T14:13:40.000000Z
vendor_id : [0][0][0][0]
Stream #0:1(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080, 5560 kb/s, 30 fps, 30 tbr, 3k tbn
Metadata:
creation_time : 2025-07-21T14:13:42.000000Z
vendor_id : [0][0][0][0]
encoder : JVT/AVC Coding
Stream mapping:
Stream #0:1 -> #0:0 (copy)
Stream #0:0 -> #0:1 (copy)
Output #0, mp4, to 'merged_output.mp4':
Metadata:
encoder : Lavf61.7.100
Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080, q=2-31, 5560 kb/s, 30 fps, 30 tbr, 12k tbn
Metadata:
creation_time : 2025-07-21T14:13:42.000000Z
vendor_id : [0][0][0][0]
encoder : JVT/AVC Coding
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 50 kb/s
Metadata:
creation_time : 2025-07-21T14:13:40.000000Z
vendor_id : [0][0][0][0]
Press [q] to stop, [?] for help
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x14c810750] Auto-inserting h264_mp4toannexb bitstream filter
[out#0/mp4 @ 0x14b72b210] video:80715KiB audio:909KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: 0.154392%
frame= 3531 fps=0.0 q=-1.0 Lsize= 81750KiB time=00:01:57.63 bitrate=5693.1kbits/s speed= 694x
pk desktop %