ターミナル

FFmpegで動画変換!各OSごとのインストール方法と使い方まとめ

FFmpegは動画を変換、編集などできるフリーソフトでターミナルで動かします。
動画の切り取り、トリミング、クロップ、形式変換、速さを変える、画像を合成、などコマンドを使いこなせさえすれば基本的に幅広く可能です。

読み方は「エフエフエムペグ」と読みます。

今回はFFmpegの使い方をまとめていきます。

FFmpegのインストール方法

インストール方法に関してはOSごとに別の記事でまとめているので、インストールしてない人はこれらの記事を参考にしてください。

HomebrewでMacにFFmpegをインストールする方法と使い方FFmpegは動画を変換、編集などできるフリーソフトでターミナルで動かします。この記事ではMacOSにHomebrewを使ってFFmpegをインストールする方法とFFmpegの使用方法を紹介します。...
CentOS 6系,7系にFFmpegをインストールする手順FFmpegは動画を変換、編集などできるフリーソフトでターミナルで動かします。今回はFFmpegをCentOS6系、CentOS7系にインストールする方法をまとめていきます。...
【windows】FFmpegをインストールする手順FFmpegは動画を変換、編集などできるフリーソフトでコマンドプロンプトで動かします。この記事ではこのFFmpegをWindowsにインストールする手順を1つずつスクショも交えながら紹介していきます。...

このように様々なOSで使えるのがFFmpegのメリットで、フリーソフトの場合は1つのOSにしか対応してないこともよくあるので、ありがたい点ですね。

他にもAWS LambdaFFmpegを使用する手順に関してもこちらの記事でまとめています。

AWS Lambda(Node.js)+FFmpegでS3の動画を編集するこの記事ではAWSのサービスの1つである、AWS Lambda内でFFmpegを使用して、S3内の動画ファイルを加工する方法に関してまとめていきます。実際に手を動かして実装していただきやすいように、1つ1つ手順をスクショや実際のコードを交えながら説明していきます。...

使い方

ここからは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の使い方に関してまとめていきました。たくさんの機能があったかと思います。

しかし、今回紹介したのは基本的な機能で、紹介しきれなかった機能もたくさんありますし、紹介した機能でもさらに詳細なオプションを設定してより細かく設定することもできます。

動画を扱う場合はぜひともマスターできるといいのではないかなと思います。