それFFmpegで出来るよ!


※この記事は、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 入力ファイル名 出力オプション 出力ファイル名

オプションはなくてもいい(ツールが自動で認識してくれる)

MP4動画をAVI動画に変換する
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.movDuration(長さ): 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があれば大丈夫

ただ 単純 に動画を変換するだけなら拡張子を変えるだけ

FLV形式の動画をMP4形式に変換する
ffmpeg -i input.flv output.mp4
MP4形式の動画をAVI形式に変換する
ffmpeg -i input.mp4 output.avi

拡張子から自動で判別してくれるのはありがたい。
変換に関して コーデック ビットレート フレームレート オーディオ形式 サンプリングレート等について指定があれば、出力オプションに追加する。

MP4形式の動画をコーディックH.265のMP4形式の動画に変換する
ffmpeg -i input.mp4 -vcodec libx265 output.mp4
MP4形式の動画をビットレート340kbpsのMP4形式の動画に変換する
ffmpeg -i input.mp4 -vb 340k output.mp4
MP4形式の動画をフレームレート120fpsのMP4形式の動画に変換する
ffmpeg -i input.mp4 -r 120 output.mp4

ケース3:連番画像から動画を作りたい

image001.png image002.png image003.pngimageXXX.png と連番の画像から動画ファイルを作りたいときもFFmpeg

一番簡単なのは次のコマンド

連番ファイルから動画をつくる
ffmpeg -i image%03d.png output.mp4

数字が連番になっているところを%03dみたいなので置換する。
数字が0埋めされていなければ%d
0埋めされていれば%0桁数dにする

ただ、これだとmacOSのQuick Playerで開けないので、

出力オプションに-pix_fmt yuv420pを加える

連番ファイルからmacで再生できる動画をつくる
ffmpeg -i image%03d.png -pix_fmt yuv420p output.mp4

自分の環境では、デフォルトで h264 (High 4:4:4 Predictive) になるのですがコーデックを指定したい場合は出力オプションに -vcodec libx264など形式を指定してあげる。

連番ファイルからH.264コーディックの動画をつくる
ffmpeg -i image%03d.png -vcodec libx264 output.mp4

ただ、連番画像が何枚で1秒かっていうのはFFmpegに教えてあげないといけないので
連番画像が60枚で1秒だった場合はこうだ!

60fpsの連番ファイルから動画をつくる
ffmpeg -r 60 -i image%03d.png output.mp4

ケース4:動画から連番画像を作りたい

ケース3:連番画像から動画を作りたい ですね。
入力ファイル名に動画を指定して、出力ファイル名に画像の拡張子を指定すればいいですね。

動画から連番ファイルをつくる
ffmpeg -i input.mp4 image%03d.png

このままだと、動画1秒あたりフレームレートの枚数分画像が生成するので、1秒あたり何枚かは -r 動画一秒あたりの枚数 で指定すればよい

動画から1秒あたり60枚の連番ファイルをつくる
ffmpeg -i input.mp4 -r 60 image%03d.png

ケース5:動画をgif画像にしたい

Webページに載せたりTwitterに上げたりするときgif画像って便利
FFmpegならgifを動画からつくるのは簡単

動画をgifに変換する
ffmpeg -i input.mp4 output.gif

たったこれだけで出来るのですが、問題はそのままのサイズ、フレームレートでgifを作ってしまうため、めちゃくちゃ大きくて重いgifができてしまいます

なのでサイズとフレームレートを指定しなければなりません。
フレームレートは -r XX
サイズは -s 横幅ピクセルx縦幅ピクセル
アスペクト比固定で変えるなら
-vf scale=横幅ピクセル:-1
-vf scale=-1:縦幅ピクセル
で指定できるので出力オプションに加えてあげます

動画をアスペクト比を保ったまま横幅640ピクセルにリサイズ、フレームレートは10fpsでgifに変換
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 を加えてあげれるだけ

動画を横幅1920ピクセル縦幅1080ピクセルにリサイズする
ffmpeg -i input.mp4 -s 1920x1080 output.mp4

ただ、横幅ピクセル数・縦幅ピクセル数を動画のアスペクト比によって計算しないといけないのは面倒なので
アスペクト比を維持してサイズを変える場合は、-vfオプションを使い横幅か縦幅を -1 にします(ケース5にかかれたとおりですね)
アスペクト比を保ったまま横幅320ピクセルにリサイズなら -vf scale=320:-1
アスペクト比を保ったまま縦幅720ピクセルにリサイズなら -vf scale=-1:720

ケース7:動画から音声を抜きだしたい

GUIソフトを起動して映像部分を消して音声ファイルで書き出しよりFFmpegなら少ない手順でできます。

動画からmp3形式で音声ファイルを生成する
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 を加えることで変換することができます

MP4形式の動画を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 になってることがわかります

最後に

マルチメディアを扱う人なら覚えておきたい一品だと思います