FFmpeg
は動画を変換、編集などできるフリーソフトでターミナルで動かします。
動画の切り取り、トリミング、クロップ、形式変換、速さを変える、画像を合成、などコマンドを使いこなせさえすれば基本的に幅広く可能です。
読み方は「エフエフエムペグ」と読みます。
今回はFFmpeg
の使い方をまとめていきます。
Contents
FFmpegのインストール方法
インストール方法に関してはOSごとに別の記事でまとめているので、インストールしてない人はこれらの記事を参考にしてください。
このように様々なOSで使えるのがFFmpeg
のメリットで、フリーソフトの場合は1つのOSにしか対応してないこともよくあるので、ありがたい点ですね。
他にもAWS Lambda
でFFmpeg
を使用する手順に関してもこちらの記事でまとめています。
使い方
ここからはFFmpeg
の使い方をまとめていきます。
基本構文
FFmpeg
のコマンドは大方このような構成になっています。
ffmpeg (入力オプション) -i (入力ファイル名) (出力オプション) (出力ファイル名)
では具体的な例を挙げながら説明していきます。
動画の形式を変換する
動画にはいろいろな形式があります。
例えば、mp4
,mov
,avi
など、新しいものだとGoogleが開発したwebm
だったり、様々なものがあります。
しかし環境によっては再生されないものもあったりするので、そういう場合に必要になるかと思います。
ffmpeg -i input.mov output.mp4
上記のように入力ファイル名と出力ファイル名から拡張子を判断して、そのフォーマットに変換してくれるようになっています。
対応しているフォーマットを確認するには以下のコマンドで確認できます。(めちゃめちゃ多いです)
ffmpeg -formats
変換する際に、コーデック、ビットレート、フレームレート、オーディオ形式、サンプリングレート、音声ありなしなど、出力オプションで設定もすることができます。
変換に関して コーデック
ビットレート
フレームレート
オーディオ形式
サンプリングレート
等について指定があれば、出力オプションに追加する。
# ビデオコーデックをH.264にする
ffmpeg -i input.mp4 -vcodec libx264 output.mp4
# オーディオコーデックをAACにする
ffmpeg -i input.mp4 -acodec libfdk_aac output.mp4
# ビデオのビットレートを1000kbpsにする
ffmpeg -i input.mp4 -b:v 1000k output.mp4
# オーディオのビットレートを1000kbpsにする-b:a 100k
ffmpeg -i input.mp4 -b:a 100k output.mp4
# フレームレートを30Hzにする
ffmpeg -i input.mp4 -r 120 output.mp4
# サンプリングレートを48000Hzにする
ffmpeg -i input.mp4 -ar 48000 output.mp4
# 音声のチャンネル数を1にする(2=ステレオ,1=モノラル)
ffmpeg -i input.avi -ac 1 output.mp4
# 音声を無効化する
ffmpeg -i input.mov -an output.mov
上記の例では出力オプションを1つずつ指定していますが、複数組み合わせることも可能なので、指定したいものが複数あるときは同時に指定しましょう。
動画をgif画像にする
先程は動画から動画の変換を紹介しましたが、動画からgif画像に変換することもできます。
そのまま変換してしまうと、フレームレートがそのままで変換されてしまい、容量が大きくなりすぎてしまうので、フレームレートを指定して変換するのが良いかと思います。
フレームレートはパラパラ漫画みたいなイメージで1秒間あたりのコマ数です。多いとよりなめらかになりますが、その分容量も大きくなります。
フレームレートを半分にしたら容量も半分になります。
# gifに変換
ffmpeg -i input.mp4 output.gif
# フレームレート10でgifに変換
ffmpeg -i input.mp4 -r 10 output.gif
動画をリサイズする
# 横1280px×縦720pxにリサイズ
ffmpeg -i input.mp4 -s 1280×720 output.mp4
# アスペクト比を維持しつつ横1280pxにリサイズ
ffmpeg -i input.mp4 -vf scale=1280:-1 output.mp4
# アスペクト比を維持しつつ縦720pxにリサイズ
ffmpeg -i input.mp4 -vf scale=-1:720 output.mp4
動画のコーデックによっては縦と横の長さがnの倍数
の必要がある場合があります。その場合には、-vf
の-1
の部分を-n
にすることでリサイズの結果をnの倍数
にすることができます。
# アスペクト比を維持しつつ縦720pxにリサイズし、縦と横のサイズを2の倍数(偶数)にする
ffmpeg -i input.mp4 -vf scale=-2:720 output.mp4
他にも入力ファイルのサイズに対して指定するやり方もあります。
(iw = input width, ih = input height)
# 横幅を2倍、縦をそのままにリサイズ
ffmpeg -i input.mp4 -vf scale=iw*2:ih output.mp4
# 縦と横を半分にリサイズ
ffmpeg -i input.mp4 -vf "scale=iw*.5:ih*.5" output.mp4
ffmpeg -i input.mp4 -vf "scale=iw/2:ih/2" output.mp4
サイズが小さすぎる場合に場合に拡大したくないというときにmin関数
を使うこともできます。
ffmpeg -i input.mp4 -vf "scale='min(320,iw)':'min(240,ih)'" output.mp4
動画をトリミングする
開始時間から終了時間を指定または開始時間から何秒間と指定することができます。
ミリ秒単位まで指定することができます。
# 10秒のところから20秒間切り出す
ffmpeg -i input.mp4 -ss 10 -t 20 output.mp4
ffmpeg -i input.mp4 -ss 00:00:10.000 -t 00:00:20.000 output.mp4
# 10秒のところから20秒のところまで切り出す
ffmpeg -i input.mp4 -ss 10 -to 20 output.mp4
ffmpeg -i input.mp4 -ss 00:00:10.000 -t 00:00:20.000 output.mp4
連番画像を作成
動画になっていたものをパラパラマンガみたいに1枚1枚の画像に分解するイメージです。
ffmpeg -i input.mp4 image_%03d.png
動画を圧縮する
-crf
で圧縮率を指定します。
数字が大きくなるほど圧縮率が高くなります。
ffmpeg -i input.mp4 -crf 10 output.mp4
動画をクロップする
クロップというのは、以下の画像の赤枠の部分を取り出す操作になります。
元の動画の長方形の左上の頂点を起点として、赤枠の長方形の左上の座標と赤枠の長方形の縦と横の長さを指定します。
ffmpeg -i input.mp4 -vf crop={width}:{height}:{x}:{y} output.mp4
動画の情報を調べる
FFmpeg
をインストールするとffprobe
コマンドも使用することができます。
$ ffprobe -i input.mp4
ffprobe version 4.1.2 Copyright (c) 2007-2019 the FFmpeg developers
built with Apple LLVM version 10.0.0 (clang-1000.11.45.5)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.1.2 --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags='-I/Library/Java/JavaVirtualMachines/openjdk-11.0.2.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/openjdk-11.0.2.jdk/Contents/Home/include/darwin' --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libmp3lame --enable-libopus --enable-librubberband --enable-libsnappy --enable-libtesseract --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-videotoolbox --disable-libjack --disable-indev=jack --enable-libaom --enable-libsoxr
libavutil 56. 22.100 / 56. 22.100
libavcodec 58. 35.100 / 58. 35.100
libavformat 58. 20.100 / 58. 20.100
libavdevice 58. 5.100 / 58. 5.100
libavfilter 7. 40.101 / 7. 40.101
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 3.100 / 5. 3.100
libswresample 3. 3.100 / 3. 3.100
libpostproc 55. 3.100 / 55. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.20.100
Duration: 00:00:07.13, start: 0.000000, bitrate: 178 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 398x312 [SAR 1:1 DAR 199:156], 39 kb/s, 60 fps, 60 tbr, 15360 tbn, 120 tbc (default)
Metadata:
handler_name : Core Media Video
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 127 kb/s (default)
Metadata:
handler_name : Core Media Audio
フォーマット情報のみを抜き出す場合は以下のようにします。
$ ffprobe -i input.mp4 -loglevel quiet -show_format -print_format json
{
"format": {
"filename": "input.mp4",
"nb_streams": 2,
"nb_programs": 0,
"format_name": "mov,mp4,m4a,3gp,3g2,mj2",
"format_long_name": "QuickTime / MOV",
"start_time": "0.000000",
"duration": "7.134000",
"size": "159408",
"bit_rate": "178758",
"probe_score": 100,
"tags": {
"major_brand": "isom",
"minor_version": "512",
"compatible_brands": "isomiso2avc1mp41",
"encoder": "Lavf58.20.100"
}
}
}
まとめ
今回はFFmpeg
の使い方に関してまとめていきました。たくさんの機能があったかと思います。
しかし、今回紹介したのは基本的な機能で、紹介しきれなかった機能もたくさんありますし、紹介した機能でもさらに詳細なオプションを設定してより細かく設定することもできます。
動画を扱う場合はぜひともマスターできるといいのではないかなと思います。