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