FFmpegを使って動画編集をする

FFmpegというフリーソフトを最近知りまして、大変便利だったのでご紹介します。

自分用のコマンドメモでもある。

FFmpeg(エフエフエムペグ)とは?

f:id:sotoogre:20200412023701p:plain
FFmpeg logo

動画・音声を編集できるフリーソフトです。FFmpegのサイトで配布されています。

Mac OSでもWindowsでもUbuntuでも利用できます。

コマンドラインから実行するCUIアプリなためターミナルを使い慣れていない方には少しとっつきにくいという部分はありますが、軽いですし大抵の編集が可能です。 動画編集ソフトで完全無料かつ制限なく色々なことができるソフトも少ないですのでインストールしておいて損はないのでは…?と思います。

FFmpegでできること

あまりに多岐に渡るのですが、大抵のことは可能です。

  • 拡張子の変換(mp4→gifやmov→mp4など)
  • 圧縮
  • 音声の抜き出し
  • 回転
  • 動画をフレームで切り出して静止画にする(フレームレート指定可)
  • 静止画を動画にする(フレームレート指定可)
  • 音量を大きく、または小さくする

など。

FFmpegのインストール方法

私が使用しているのがMacなためMacでのダウンロード方法のみです。

HomeBrewを使用してインストールしていきます。 HomeBrewをインストールしていない方は先にインストールを終わらせてから進めてください。

FFmpegのインストール方法は至って簡単です。

以下のコマンドを実行します。

brew install ffmpeg

FFmpegのコマンドを実行してみてエラーが出なかったらインストール成功です。

以下のコマンドでインストールしたFFmpegのバージョンが確認できます。(バージョンが表示されていればインストールが完了しています。)(ffmpeg -vでいけるかと思ったけど無理でした。)

ffmpeg -version

試しに動画情報をみるコマンドを紹介しておきます。

ffprobe sample.gif

以下gifアニメの場合の実行結果です。

ffprobe version 4.2.2 Copyright (c) 2007-2019 the FFmpeg developers
  built with Apple clang version 11.0.0 (clang-1100.0.33.17)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.2.2_2 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --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-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --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-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
Input #0, gif, from 'sample.gif':
  Duration: 00:00:05.90, start: 0.000000, bitrate: 5090 kb/s
    Stream #0:0: Video: gif, bgra, 500x313, 10 fps, 10 tbr, 100 tbn, 100 tbc

※ちなみにインストール後に同じコマンドを打つと、アップデートがある際にはそのままアップデートをしてくれます。

FFmpegの使い方

やっとここまできました。実際にコマンドを紹介します。

基本的な使い方としては以下です。

ffmpeg -i 変換前のファイル オプション 変換後のファイル名

よく使いそうなものを抜粋します。

動画の拡張子(フォーマット)を変換

$ ffmpeg -i original_file.mov output_file.mp4

この方法でmp4に変換するとMacQuickTimeでは開けなくなるそう。 -pix_fmt yuv420pなどのオプションが必要みたいです。

$ ffmpeg -i original_file.mov -pix_fmt yuv420p output_file.mp4

動画のフレームレートを変更

$ ffmpeg -i original_file.avi -r 10 output_file.avi

出力先の拡張子を変えればフォーマットの変換も同時にできます。

動画のサイズを変更

アスペクト比を維持したままリサイズする

:横幅1280px、縦幅はアスペクト比を維持したまま自動で計算。

$ ffmpeg -i original_file.mp4 -vf scale=1280:-1 output_file.mp4

:縦幅720px

ffmpeg -i original_file.mp4 -vf scale=-1:720 output_file.mp4

16:9の解像度

通称 width(px) height(px) FFmpegのオプション
8K 7680 4320 -s 7680x4320
4K 3840 2160 -s 3840x2160
WQHD 2560 1440 -s 2560x1440
FHD 1920 1080 -s 1920x1080
WXGA++ 1600 900 -s 1600x900
HD 1280 720 -s 1280x720
1024 576 -s 1024x576
768 432 -s 768x432
640 360 -s 640x360
480 270 -s 480x270
320 180 -s 320x180
160 90 -s 160x90

動画を回転させる

$ ffmpeg -i original_file.mp4 -vf "transpose=1" output_file.mp4
番号 説明
1 90度 時計まわりに回転
2 90度 時計反まわりに回転
3 90度 時計まわり回転後、上下を反転
0 90度 時計反まわり回転後、上下を反転

動画の音声を消す

$ ffmpeg -i original_file.mp4 -an output_file.mp4

動画の音声を抽出する

例:original_file.mp4という動画から音声を抽出、music.aacで保存

$ ffmpeg -i original_file.mp4 -vn -acodec copy music.aac

元の動画ファイルで使用されている音声コーデックはffprobeを使用することで確認できます。

$ ffprobe original_file.mov 
ffprobe version 4.2.2 Copyright (c) 2007-2019 the FFmpeg developers
  built with Apple clang version 11.0.0 (clang-1100.0.33.17)
#省略
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/soto/Downloads/original_file.mov':
  Metadata:
    major_brand     : qt  
    minor_version   : 512
    compatible_brands: qt  
    encoder         : Lavf58.29.100
  Duration: 00:00:03.42, start: 0.000000, bitrate: 597 kb/s
    Stream #0:0: Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x360 [SAR 1:1 DAR 16:9], 478 kb/s, 24 fps, 24 tbr, 12288 tbn, 48 tbc (default)
    Metadata:
      handler_name    : Core Media Video
      encoder         : Lavc58.54.100 libx264
    Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 127 kb/s (default)
    Metadata:
      handler_name    : Core Media Audio

下から3行めのところにあるAudio: aacが音声コーデックです。

音声コーデックを変換して保存する(音声フォーマットをこちら側で指定する)

$ ffmpeg -i orignal_file.mp4 -f mp3 -ab 192000 -vn music.mp3
オプション 内容
-f 音声コーデックを指定する 例:-f mp3
-ab 音声コーデックのビットレートを指定する。例:-ab 192000(192000 = 192kbps)

動画を圧縮する

$ ffmpeg -i original_file.mp4 -crf 30 output_file.mp4

数値が大きくなるほど圧縮率が上がります。 スマートフォンなどで撮った動画だと30程度で半分程度の圧縮率のようです。

連番画像を動画に変換する

: img_001.png img_002.png Img_003.png.....

のような連番画像を例にします。

フレームレートは30に指定。

$ ffmpeg -framerate 30 -i img_%03d.png -vcodec libx264 -pix_fmt yuv420p output_file.mp4

:画像が30枚として、5回繰り返して5秒の動画を作りたい場合。

フレームレートを2度指定します。

$ ffmpeg -framerate 30 -i img_%03d.png -vcodec libx264 -pix_fmt yuv420p -r 150 output_file.mp4

コマ落ち回避

以上の2つの例では1回目のフレームレートオプションを-rではなく-framerateで指定しています。 2度-rを使用するとコマ落ちしてしまうことがあるそうです。

参考:saveVideo: ffmpeg drops frames (use -framerate on input)(github)

連番画像から逆再生動画を作成

-vf reverseオプションを追加 数値の大きいものから読み込んで動画にします。

$ ffmpeg -framerate 30 -i img_%03d.png -vcodec libx264 -pix_fmt yuv420p -vf reverse -r 60 output_file.mp4

動画から連番画像を作成

特に指定がない場合、フレームレートは元動画にしたがう。

pngの連番画像を出力

例:pngで出力。30秒、10fpsの動画を300枚の画像にする。

$ ffmpeg -i original_file.mp4 -vcodec png img_%03d.png

jpgの連番画像を出力

例:jpgで出力。30秒、30fpsの動画を10fps300枚の画像にする。

オプションは-vcodec mjpegにする

$ ffmpeg -i original_file.mp4 -vcodec png -r 10 img%03d.png

FLACAACに高音質のまま変換

-aac_coder twoloopを指定。

ffmpeg -i original_file.flac -b:a 192k -aac_coder twoloop output_file.m4a

一般亭なエンコーダはtwoloopfastになっている。twoloopにするとエンコーダの精度が上がる。

【番外・超応用】動画の隅に別の動画を小さく入れる

$ ffmpeg -i main_file.mp4 -i sub_file.mp4 -filter_complex "[1]scale=iw/2:ih/2 [pip]; [0][pip] overlay=main_w-overlay_w-20:main_h-overlay_h-20" -profile:v main -level 3.1 -b:v 440k -ar 44100 -ab 128k -s 1920x1000 output_file.mp4

他オプションの確認

$ ffmpeg -h full

コーデック一覧

映像コーデック

コーデック名 形式
libx264 MPEG-4,x264(.mp4)
h264 MPEG-4,H.264(.mp4)
hevc H.265(.mp4)
flv1 Flashムービー(.flv)
mjpeg Motion JPEG(.jpeg)
mpeg1video MPEG-1 Video(.mpg)
mpeg2video MPEG-2 Video(.m2ts、.vob)
msvideo1 Microsoft Video(.avi)
vp3 VP3(.avi、.mov、.mkv)
vp6 VP6(.avi、.mkv、.tc7)
vp6a VP6(Flash用、アルファチャンネル対応) (.flv)
vp6f VP6(Flash用) (.flv)
vp7 VP7(.avi)
vp8 VP8(.webm、.avi)
vp9 Google VP9
wmv1 Windows Media Player 7向け
wmv2 Windows Media Player 8向け
wmv3 Windows Media Player 9向け

音声コーデック

コーデック名 形式
libmp3lame MPEG audio layer 3
aac Advanced Audio Coding
alac Apple Lossless
flac Free Lossless Audio Codec
on2
mp1 MPEG audio layer 1
mp2 MPEG audio layer 2
mp3 MPEG audio layer 3
opus Opus(webm)
pcm_s16le PCM 16bit(WAVファイル)
pcm_s24le PCM 24bit(WAVファイル)
vorbis Vorbis(OGGファイル)
wmav1 Windows Media Audio 1(WMAファイル)
wmav2 Windows Media Audio 2(WMAファイル)

なんでもできる。。。