※この記事は、mast Another Advent Calendar 2018 の8日目の記事です。
紹介
動画や音声を加工するのに強力で万能な簡単ツールFFmpegについて便利すぎるのでいつも使っているものをまとめようと思います。
FFmpegを使えるようになれば、用途ごとにフリーソフトをインストールしたり、重いGUIソフトを立ち上げる必要が無くなるかも?
※このツールは基本的にコマンドラインインターフェースから使うのでコマンドラインインターフェースが苦手無理って人のために、GUIで扱えるものあります。
インストール
FFmpegのいいところは WindowsでもmacOSでもUbuntuでも使えるところ
便利フリーソフトはだいたい限られたOSでしか使えないこと思えば、どのOSでも使えることは大きい。
macOSでのインストールはターミナルをひらいてこんな感じ(筆者はのPCはmacOSなので...)
brew install ffmpeg
-bash: brew: command not found
になる場合はこちら
WindowsとLinuxについては公式ページを参照してください。
https://trac.ffmpeg.org/wiki/CompilationGuide
基本的な使い方
FFmpegの基本的な使い方はこんな感じ
ffmpeg 入力オプション -i 入力ファイル名 出力オプション 出力ファイル名
オプションはなくてもいい(ツールが自動で認識してくれる)
ffmpeg -i input.mp4 output.avi
ケース1:動画のサイズやコーディックを知りたい
この動画のサイズ(縦横何ピクセル)や長さ(時間)を単純に知りたいときってあるよね
あとは、この動画なんか再生できないんだけどコーディックなんだろうとか
そんなときはこれ
ffmpeg -i 入力ファイル名
$ ffmpeg -i input.mov
ffmpeg version 3.4.2 Copyright (c) 2000-2018 the FFmpeg developers
built with Apple LLVM version 9.0.0 (clang-900.0.39.2)
configuration: --prefix=/usr/local/Cellar/ffmpeg/3.4.2 --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --disable-jack --enable-gpl --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --enable-videotoolbox --disable-lzma
libavutil 55. 78.100 / 55. 78.100
libavcodec 57.107.100 / 57.107.100
libavformat 57. 83.100 / 57. 83.100
libavdevice 57. 10.100 / 57. 10.100
libavfilter 6.107.100 / 6.107.100
libavresample 3. 7. 0 / 3. 7. 0
libswscale 4. 8.100 / 4. 8.100
libswresample 2. 9.100 / 2. 9.100
libpostproc 54. 7.100 / 54. 7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mov':
Metadata:
major_brand : qt
minor_version : 0
compatible_brands: qt
creation_time : 2018-12-05T21:48:56.000000Z
com.apple.quicktime.make: Apple
com.apple.quicktime.model: MacBookPro13,3
com.apple.quicktime.software: Mac OS X 10.13.4 (17E199)
com.apple.quicktime.creationdate: 2018-12-06T06:47:52+0900
Duration: 00:00:14.02, start: -0.016667, bitrate: 1509 kb/s
Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 1832x1680 [SAR 1:1 DAR 229:210], 1481 kb/s, 59.65 fps, 60 tbr, 6k tbn, 12k tbc (default)
Metadata:
creation_time : 2018-12-05T21:48:56.000000Z
handler_name : Core Media Data Handler
encoder : H.264
At least one output file must be specified
どうやら input.mov
はDuration(長さ): 00:00:14.02
サイズ:1832x1680
コーディック:H.264
フレームレート:59.65 fps
ビットレート:1481 kb/s
の動画であることがわかった。
ただ At least one output file must be specified
これは良くないので 下のが推奨
ffprobe -i 入力ファイル名
ケース2:動画を変換したい
macOSのQuick Playerでは再生できるのに、WindowsのWindows Media Playerでは再生できないとか、動画をMP4形式で提出してくださいだの動画の形式を変換しないといけないことって生きていればあるよね、でもFFmpegがあれば大丈夫
ただ 単純 に動画を変換するだけなら拡張子を変えるだけ
ffmpeg -i input.flv output.mp4
ffmpeg -i input.mp4 output.avi
拡張子から自動で判別してくれるのはありがたい。
変換に関して コーデック
ビットレート
フレームレート
オーディオ形式
サンプリングレート
等について指定があれば、出力オプションに追加する。
ffmpeg -i input.mp4 -vcodec libx265 output.mp4
ffmpeg -i input.mp4 -vb 340k output.mp4
ffmpeg -i input.mp4 -r 120 output.mp4
ケース3:連番画像から動画を作りたい
image001.png
image002.png
image003.png
… imageXXX.png
と連番の画像から動画ファイルを作りたいときもFFmpeg
一番簡単なのは次のコマンド
ffmpeg -i image%03d.png output.mp4
数字が連番になっているところを%03d
みたいなので置換する。
数字が0埋めされていなければ%d
0埋めされていれば%0桁数d
にする
ただ、これだとmacOSのQuick Playerで開けないので、
出力オプションに-pix_fmt yuv420p
を加える
ffmpeg -i image%03d.png -pix_fmt yuv420p output.mp4
自分の環境では、デフォルトで h264 (High 4:4:4 Predictive)
になるのですがコーデックを指定したい場合は出力オプションに -vcodec libx264
など形式を指定してあげる。
ffmpeg -i image%03d.png -vcodec libx264 output.mp4
ただ、連番画像が何枚で1秒かっていうのはFFmpegに教えてあげないといけないので
連番画像が60枚で1秒だった場合はこうだ!
ffmpeg -r 60 -i image%03d.png output.mp4
ケース4:動画から連番画像を作りたい
ケース3:連番画像から動画を作りたい の 逆 ですね。
入力ファイル名に動画を指定して、出力ファイル名に画像の拡張子を指定すればいいですね。
ffmpeg -i input.mp4 image%03d.png
このままだと、動画1秒あたりフレームレートの枚数分画像が生成するので、1秒あたり何枚かは -r 動画一秒あたりの枚数
で指定すればよい
ffmpeg -i input.mp4 -r 60 image%03d.png
ケース5:動画をgif画像にしたい
Webページに載せたりTwitterに上げたりするときgif画像って便利
FFmpegならgifを動画からつくるのは簡単
ffmpeg -i input.mp4 output.gif
たったこれだけで出来るのですが、問題はそのままのサイズ、フレームレートでgifを作ってしまうため、めちゃくちゃ大きくて重いgifができてしまいます
なのでサイズとフレームレートを指定しなければなりません。
フレームレートは -r XX
サイズは -s 横幅ピクセルx縦幅ピクセル
アスペクト比固定で変えるなら
-vf scale=横幅ピクセル:-1
-vf scale=-1:縦幅ピクセル
で指定できるので出力オプションに加えてあげます
ffmpeg -i input.mp4 -vf scale=640:-1 -r 10 output.gif
- アスペクト比を維持してサイズを変える場合は、横幅か縦幅を
-1
にします
アスペクト比を保ったまま横幅320ピクセルにリサイズなら-vf scale=320:-1
アスペクト比を保ったまま縦幅720ピクセルにリサイズなら-vf scale=-1:720
筆者はいつも ここ を参考にしている
ケース6:動画をリサイズする
動画のピクセルサイズを変更するのもFFmpegならおてのもの、 出力オプションに -s
を加えてあげれるだけ
ffmpeg -i input.mp4 -s 1920x1080 output.mp4
ただ、横幅ピクセル数・縦幅ピクセル数を動画のアスペクト比によって計算しないといけないのは面倒なので
アスペクト比を維持してサイズを変える場合は、-vf
オプションを使い横幅か縦幅を -1
にします(ケース5にかかれたとおりですね)
アスペクト比を保ったまま横幅320ピクセルにリサイズなら -vf scale=320:-1
アスペクト比を保ったまま縦幅720ピクセルにリサイズなら -vf scale=-1:720
ケース7:動画から音声を抜きだしたい
GUIソフトを起動して映像部分を消して音声ファイルで書き出しよりFFmpegなら少ない手順でできます。
ffmpeg -i input.mp4 output.mp3
余裕ですね、ファイルの拡張子を変えるだけ
ただ、これだと動画コンテナに入っている音声にはエンコードがかかる場合があるので
動画コンテナに保存されている音声をエンコードせずに抜き出したい場合は一旦中の音声形式を調べて
ffmpeg -i input.mp4
#---省略---#
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 317 kb/s (default)
Metadata:
creation_time : 2018-05-15T15:48:22.000000Z
handler_name : #Mainconcept MP4 Sound Media Handler
この場合は AAC形式
なので拡張子は m4a
ですね。出力オプションに -acodec copy
加えて
ffmpeg -i input.mp4 -acodec copy output.m4a
ちなみに、動画から音を消す場合は -an
のオプションを使います
ffmpeg -i input.mp4 -vcodec copy -an output.mp4
ケース8:動画を連結したい
ケース9:動画をクロップ(トリミング)したい
ケース10:動画の特定の時間範囲を取り出したい
番外編1:DVD-Video形式の動画に変換したい
DVDに書き込まれる動画形式にFFmpegなら出力オプションに -target ntsc-dvd
を加えることで変換することができます
ffmpeg -i input.mp4 -target ntsc-dvd -aspect 16:9 output.mpg
他にも出力オプションに -target pal-dvd
などにがあるので詳しいことは、公式ドキュメント を見てください
DVDに書き込まれる動画の形式は、 MPEG-2
で解像度が主に 720x480
になります
実際に変換された動画のメタ情報をみると
Output #0, dvd, to 'output':
Metadata:
major_brand : mp42
minor_version : 1
compatible_brands: mp41mp42isom
encoder : Lavf58.20.100
Stream #0:0(eng): Video: mpeg2video (Main), yuv420p, 720x480 [SAR 32:27 DAR 16:9], q=2-31, 6000 kb/s, 29.97 fps, 90k tbn, 29.97 tbc (default)
形式が mpeg2video
で解像度が 720x480
になってることがわかります
最後に
マルチメディアを扱う人なら覚えておきたい一品だと思います