FFmpegを使って動画や音声の処理を行う

2023年10月13日 Posted 野々瀨(フロントエンドエンジニア)

今回は、FFmpegを使った動画や音声の処理について軽くご紹介しようと思います。なお、ここではWindowsを基本に説明します。

FFmpegとは

FFmpegとは、動画や音声を記録や変換、再生、情報の取得などが行えるソフトウェアです。無料で利用でき、Linux、Windows、Mac OSに対応しています。また、さまざまな動画・音声形式に対応しています。

インストール

Download FFmpegページへアクセスし、「Get packages & executable files」見出しから、中央のWindowsマークにカーソルをのせます。「Windows EXE Files」見出しにある何れかのリンクを押します。どちらでも問題ありませんが、ここでは「Windows builds by BtbN」を押したこととします。

Assetsの中から「ffmpeg-master-latest-win64-gpl.zip」リンクを押し、ダウンロードします。

ダウンロードした「ffmpeg-master-latest-win64-gpl.zip」ファイルを任意の場所へ展開します。

環境変数のPathへ解凍した先のbinディレクトリーまでのパスを追加します。例えば"C:\ffmpeg-master-latest-win64-gpl"として解凍した場合は、"C:\ffmpeg-master-latest-win64-gpl\bin"を追加する感じです。なお、環境変数への追加方法については割愛します。

コマンドプロンプトなどコマンドラインツールを起動し、次のコマンドを実行します。

ffmpeg -version

次のような内容が表示されたら完了です。

含まれるソフトウェア

処理したい内容によって実行するソフトウェアが異なります。FFmpegは次のソフトウェアが含まれています。

ソフトウェア名(コマンド名)説明
ffmpeg 動画や音声を記録・変換するためのソフトウェア
ffprobe 動画や音声の情報を取得するためのソフトウェア
ffplay 動画や音声を再生するためのソフトウェア

使い方

FFmpegはコマンドラインインターフェイス(CLI)でさまざまな操作を行います。基本的には次のような構文でコマンドを入力して実行します。

コマンド名 オプション 出力ファイル名

共通するオプション

全コマンドに共通するオプションは主に次のとおりです。

オプション説明構文入力例
-i 処理する対象ファイルのファイル名を指定します。 -i ファイル名 ffmpeg -i input.mp4 output.mkv
-y 出力するファイルが既に存在している場合、上書きします。 -y ffmpeg -y -i input.mp4 output.mkv
-n 出力するファイルが既に存在している場合、上書き・処理せずに直ちに処理を終了します。 -n ffmpeg -n -i input.mp4 output.mkv

形式の変換

形式の変換を行う場合は、-iオプションで変換元のファイル名して、出力ファイル名を指定することで行うことができます。例えば、次のコマンドを実行しますと、MP4形式からWebM形式へ変換します。

ffmpeg -i input.mp4 output.webm

出力形式を明示的に指定

通常、出力形式は拡張子から推測して処理を行います。-fオプションを付与することで、形式を明示的に指定することができます。なお、入力形式はファイルそのものから自動的に検出されます。

ffmpeg -i input.mp4 -f WebM output.foo

ビットレート(bps)を変更

動画または音声のビットレートを変更する場合は、-b:vまたは-b:aオプションを指定します。動画は-b:vオプションを指定し、音声は-b:aオプションを指定します。指定する値は、単位を含めたビットレート数を指定します。

ffmpeg -i input.mp4 -b:v 64k output.webm

フレームレート(fps)を変更

フレームレートを変更する場合は、-rオプションを指定します。指定する値は、ビットレート数kと単位を含めてい指定します。指定する値は、フレームレート数を指定します。

ffmpeg -i input.mp4 -r 24 output.webm

コーデックを変更

動画または音声のコーデックを変更する場合は、-c:vまたは-c:aオプションを指定します。動画は-c:aオプションを指定し、音声は-c:aオプションを指定します。指定する値は、コーデックの種類を小文字で指定します。

ffmpeg -i input.mp4 -c:v vp9 output.webm

なお、指定できるコーデックは、ffmpeg -codecsで確認できます。

時間の範囲を指定して切り出す

時間の範囲を指定して切り出すには次のオプションを使用して行います。

オプション説明構文入力例
-ss 切り出す開始時間を指定します。 -ss 開始時間 ffmpeg -i input.mp4 -ss 00:12 output.mp4
-t 切り出す範囲を指定します。 -t 範囲時間 ffmpeg -i input.mp4 -ss 00:12 -t 00:34 output.mp4
-to 切り出す終了時間を指定します。 -to 終了時間 ffmpeg -i input.mp4 -ss 00:12 -to 00:34 output.mp4

これらのオプションは-ssのみ、-ss-tの組み合わせ、-ss-toの組み合わせで指定します。また、指定可能な時間の書式は次のとおりです。

書式構文入力例
時:分:秒 hh:mm:ss ffmpeg -i input.mp4 -ss 00:00:03.0 -t 00:00:05.0 output.mp4
時:分:秒.ミリ秒 hh:mm:ss.ms ffmpeg -i input.mp4 -ss 00:00:03 -t 00:00:05 output.mp4
分:秒 mm:ss ffmpeg -i input.mp4 -ss 00:03 -t 00:05 output.mp4
s ffmpeg -i input.mp4 -ss 3 -t 5 output.mp4

次の例では開始12分のところから、5秒を切り抜きます。

ffmpeg -i input.mp4 -ss 00:12:00.0 -t 00:00:05.0 output.webm

次の例では開始5秒のところから、終了10秒までを切り抜きます。

ffmpeg -i input.mp4 -ss 00:05 -to 00:10 output.webm

なお、時間の指定はそろえなくても問題ありません。

動画や音声を結合

動画や音声を結合するにはまず、結合する元となるファイルのリストをテキストファイルで作成します。

file input-1.mp4
file input-2.mp4
file input-3.mp4

上記を例えばlist.txtとして保存した場合、次のコマンドを実行することで結合することができます。

ffmpeg -f concat -i list.txt output.mp4

また上記の場合は再エンコードされますが、-c copyオプションを付与すると、再エンコードせずに結合することができます。なお、結合する元のファイルのコーデックなどが一致している必要があります。

ffmpeg -f concat -i list.txt -c copy output.mp4

動画から音声を抽出

動画から音声を抽出するには、-vnオプションを付与することで行うことができます。このオプションは動画を出力しないようにするためのオプションです。

ffmpeg -i input.mp4 -vn output.aac

また上記の場合は再エンコードされますが、-acodec copyオプションを付与しますと、再エンコードせずに結合することができます。

ffmpeg -i input.mp4 -vn -acodec copy output.aac

音声付き動画から動画のみを抽出(動画から音声を削除)

音声付き動画から動画のみを抽出(動画から音声を削除)するには、-anオプションを付与することで行うことができます。このオプションは動画を出力しないようにするためのオプションです。

ffmpeg -i input.mp4 -an output.mp4

また上記の場合は再エンコードされますが、-vcodec copyオプションを付与しますと、再エンコードせずに結合することができます。

ffmpeg -i input.mp4 -an -vcodec copy output.mp4

動画から静止画を書き出し

動画から静止画を書き出しするには、形式の変換と同じ方法で行います。ただし、出力するファイル名は書式(パターン)で指定する必要があります。

ffmpeg -i input.mp4 output_%02d.png

また、通常は動画のフレームレートの分だけ画像が出力されますが、-rオプションを付与することで制御することができます。

ffmpeg -i input.mp4 -r 2 output_%02d.png

動画や音声の情報を取得

次のコマンドを実行することで、動画や音声の情報を取得することができます。

ffprobe sample.mp4

ライブラリ情報の非表示

ライブラリの情報を表示したくない場合は、-hide_bannerオプションを指定します。

ffprobe -hide_banner sample.mp4

カテゴリーごとの情報を取得

次のように各オプションを指定しますと、カテゴリーごとの情報を取得することができます。

オプション説明入力例
-show_format 書式やサイズといった情報を取得します。 ffprobe -show_format sample.mp4
-show_frames フレーム関連の情報を取得します。各フレームごとの情報が大量に表示されますので、ご注意ください。 ffprobe -show_frames sample.mp4
-show_streams コーデックなど、ストリームに関する情報を取得します。 ffprobe -show_streams sample.mp4
-show_chapters チャプター関する情報を取得します。 ffprobe -show_chapters sample.mp4

カテゴリーごとの情報を部分的に取得

カテゴリーごとの情報を部分的に絞って表示したい場合は、-show_entriesオプションを指定します。情報はカテゴリー名ごとに分かれていて、カテゴリー名=プロパティ名で取得したい情報を得ることができます。また、プロパティ名はコンマ区切りで指定することで複数の情報を得ることができます。

カテゴリー名説明入力例
format -show_formatオプションの内容を限定して取得することができます。 ffprobe -show_entries format=bit_rate,size,duration sample.mp4
frame -show_framesオプションの内容を限定して取得することができます。 ffprobe -show_entries frame=media_type sample.mp4
stream -show_streamsオプションの内容を限定して取得することができます。 ffprobe -show_entries stream=width,height,codec_name,codec_type,r_frame_rate sample.mp4
chapter -show_chaptersオプションの内容を限定して取得することができます。 ffprobe -show_entries chapter=start_time,end_time sample.mp4

複数指定すると、次のようになります。

ffprobe -show_entries format=bit_rate,size,duration:stream=width,height,codec_name,codec_type,r_frame_rate sample.mp4

表示する形式を変更

-print_formatオプションを指定することで、表示する形式を変更することができます。例えば次のように"json"を指定すると、JSON形式で表示します。

ffprobe -print_format json sample.mp4

形式は次のような種類があります。

形式(設定値)説明入力例
default 初期値で、特に出力形式を指定しません。 ffprobe sample.mp4
compact プロパティ名=値という形式で表し、各項目をパイプライン(|)で区切って表示します。 ffprobe -print_format compact sample.mp4
flat **カテゴリー名s.カテゴリー名.0.プロパティ名="値"**という形式で表して表示します。 ffprobe -print_format flat sample.mp4
ini INI形式で表示します。 ffprobe -print_format ini sample.mp4
xml XML形式で表示します。 ffprobe -print_format xml sample.mp4
csv CSV形式で表示します。 ffprobe -print_format csv sample.mp4
json JSON形式で表示します。 ffprobe -print_format json sample.mp4

ログの出力レベルを設定

-loglevelオプションで、出力するログレベルを設定することができます。レベルは+記号で区切ることで複数のレベルを指定することもできます。

レベル入力列
quiet ffprobe -loglevel quiet sample.mp4
panic ffprobe -loglevel panic sample.mp4
fatal ffprobe -loglevel fatal sample.mp4
error ffprobe -loglevel error sample.mp4
warning ffprobe -loglevel warning sample.mp4
info ffprobe -loglevel info sample.mp4
verbose ffprobe -loglevel verbose sample.mp4
debug ffprobe -loglevel debug sample.mp4
trace ffprobe -loglevel trace sample.mp4

なお、-hide_bannerオプションを組み合わせて-loglevel errorを付与しますと、最小限の情報のみを表示することもできます。

ffprobe -hide_banner -loglevel error -print_format json -show_entries format=bit_rate,size,duration:stream=width,height,codec_name,r_frame_rate sample.mp4