ffmpeg徹底ガイド ― マルチメディア編集の万能ツールを使いこなす
これまで何度も、マルチメディア編集を行う場面に遭遇してきました。音声、動画、名前を付ければきりがありません。YouTubeチャンネル用のクリップを作ったり、音楽を抽出・変換したり、字幕を埋め込んだり。そのたびに、コマンドラインでffmpegを使うことになり、いつも作業を楽しみながら、この地味なプログラムの驚くべき能力に密かに感嘆させられてきました。
そこで考えたのが、ffmpegについてより包括的なガイドを書くということです。さまざまなタスクや機能を一覧化し、それらを実例やユースケースとともに紹介します。2008年のFlash編集チュートリアルで初めてffmpegに触れて以来、そろそろ新しく最新の記事を書くべきタイミングです。コマンドライン中心で、かなりマニアックな内容になりますが、同時に楽しいものにするつもりです。それでは始めましょう。
基本操作
ffmpegはほぼすべてのLinuxディストリビューションで利用可能で、Windows版やMac版のビルドも存在します。何ができるのかを知りたい場合は、引数なしでffmpegを実行するか、オプションとして-hide_bannerフラグを付けて実行すれば、その機能一覧を確認できます。また、メインプログラムだけでなく、多数あるサブコマンドそれぞれに対してもhelpオプションを使用できます。膨大な機能の数々は最初は圧倒されるかもしれませんが、焦らず着実に進めていきましょう。そして忘れてはいけないのが、非常に充実している公式ドキュメントです。
変換とトランスコード
最も一般的なタスクの一つが、ファイルをある形式から別の形式へ変換することです。FLVクリップから音声ファイルを抽出する例を覚えていますか?あれと同じことです。カメラで撮影した動画をMP4に変換したい場合や、OGGファイルをMP3に変換したい場合などもあるでしょう。シナリオは無限にあり、ffmpegがサポートするモードやフォーマットもまた無限と言えるほど豊富です。基本的には次のように行います:
- 入力ファイルを指定する
- 希望する映像・音声のコーデックを指定する
- 出力ファイルを指定する
映像ストリームを操作したくない場合は、copyコーデックを使用できます。音声も同様です。このオプションは、実際のエンコード内容を変えずにコンテナだけを変更したい場合、たとえばMOVからMP4へ変換する際などに便利です。
ffmpeg -i MVI_1348.MOV -c:v copy -c:a copy new.mp4
注意点として、すべてのフォーマットがすべてのコーデックやオプションに対応しているわけではないため、必ずしもすべてのケースで動作するとは限りません。例えば以下のようなエラーが出ることがあります:
[mp4 @ 0x55a21519fb20] Could not find tag for codec vp8 in stream #0, codec not currently supported in container
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Last message repeated 1 time
特定のストリームだけ(音声、映像、字幕、データなど)を抽出したい場合は、他のストリームの処理を抑制できます(処理時間とCPUサイクルの節約になります)。例えば、音声と映像が混在したメディアファイルから音声だけを取り出したいなら、-vn(映像なし)オプションを使います。
ffmpeg -i MVI_1348.MOV -vn -ar 44100 -ab 192k sound-only.mp3
この優れたユーティリティは、作業のやり方において大きな柔軟性を与えてくれます。例えば、codec:v、vcodec、c:vはすべて同一の意味を持ち、どれを使っても構いません。上記のように音声のみを出力したい場合、ffmpegは意図を汲んで-vnも指定されたものと判断します。-fフラグで出力フォーマットを強制指定することもできますが、こちらもツール側がコマンドから結果を推測しようとします。例えば-f mp3やacodec mp3のような指定が可能です。
コーデックごとに利用できるオプションは異なります。音声ファイルであれば、サンプリングレートやビットレート、チャンネル数などを指定できます。一部のオプションを省略すると、コマンドが失敗するか、デフォルト値が使用されます。
スケーリングと品質
もう一つのよくあるタスクが、動画のサイズ(解像度)やストリームの品質を変更することです。ffmpegでは複数の方法でこれを実現できます。アスペクト比を無視して比率を強制することもできれば、縦か横の値に特殊な修飾子を付けて元の比率を維持することも可能です。動画の境界をクロップしたり、ストリームを再エンコードしたりすることもできます。具体例を見てみましょう。
ffmpeg -i input.avi -c:v mpeg4 -vtag xvid -qscale:v 3 -c:a libmp3lame -qscale:a 4 output.avi
ここでは何をしているのでしょうか?AVI入力ファイルを、品質3(qscale)に設定したMPEG4映像ストリームでトランスコードしています。一部のコーデックでは品質範囲が1〜31で、1が最高品質です。いくつかの汎用的な入力ファイルでテストしたところ、最高品質ではファイルサイズが約2倍になり、3や4では約20〜30%削減されました。vtag xvidはMPEG-4固有のオプションです。同様に、音声にはLAMEを使用しています。
ffmpeg -i MVI_1348.MOV -vfilters scale=1280:-1 -c:a copy scaled.mp4
この例は動画のスケーリングを示しています(-vfまたは-vfiltersが使用可能)。アスペクト比は-1という修飾子によって維持されます。ストリームの品質は変更せず、音声ストリームは単に出力コンテナへコピーされます。元の動画が指定解像度より高ければダウンスケーリングになり、低ければアップスケーリングになります。
画像の抽出・結合・GIF作成
ffmpegはメディアユーティリティですが、画像も扱えます。でも考えてみれば、画像もメディアであり、動画とは動く画像のことですよね!やりたいタスクとしては、動画からフレームを抽出してサムネイル(高品質なものも)を作成することが挙げられます。手動で動画を一時停止しながらスクリーンショットを撮る必要はありません。逆の操作、つまり静止画をつなぎ合わせてストップモーション動画(あるいは本格的な動画)を作ることもできます。さらに、動画をアニメーションGIFに変換することも可能で、これはWeb上のミーム文化において非常に便利です。ここでも、いくつかの実例でデモンストレーションしてみましょう。
ffmpeg -i input.mp4 -r 1 -f image2 thumb-%3d.png
入力ファイルを指定し、レートを指定し(この場合は1秒あたり1枚の画像)、フォーマット(image2)を指定し、出力形式を指定しています。ここで少し賢いことをしています。C言語のコードを見たことがあれば馴染みがあるでしょう。サムネイルの番号付けを3桁にしたいのです。桁数は自由に選べますが、理想的には抽出予定の画像数より多い桁数にしておくとよいでしょう。

次に、画像を結合して動画にするのは非常に似た方法で行えます:
ffmpeg -f image2 -i thumb-%3d.png stopmotion.mp4
レートを指定することもできます(動画は24や30FPS程度が一般的でしょう)。これについては、このガイドの後半で動画の再生速度を遅く/速くする話題の際にもう少し詳しく触れます。画像の話が出たので、リサイズもできることを紹介しておきます:
ffmpeg -i thumb-004.png -vf scale=400:-1 test.png
アニメーションGIFは本当に興味深い存在です。しかも作成はかなり簡単です。入力ファイルを指定し、出力にgif拡張子を設定するだけです。ffmpegが残りを自動的に推測し、高品質なアニメーションGIFを作成してくれます。
ffmpeg -i MVI_6654.MOV test.gif

最後に、GIFとは逆のパターンとして、単一の画像で構成される動画――つまり固定のプレビュー画面に、BGMやポッドキャストなどの音声を流す――を作りたい場合もあるでしょう。ffmpegでは巧妙なトリックでこれが実現できます。
ffmpeg -loop 1 -i thumb-001.png -i sound-only.mp3 -c:v libx264 -shortest video-static-image.mp4
ここでは2つの入力を与え、最初の画像をループ設定にしています。映像も再エンコードしています。しかし画像は無限にループするように設定されているため、shortestオプションも必要になります。これにより、最も短いクリップが終了した時点で処理が終了します。このケースでは、それが音声ファイルということになります。
動画の分割と結合
これも便利なシナリオです。非常に長いクリップを持っていて、そのうちの数分や数秒だけが必要な場合、ffmpegは必要な部分を切り出せます。同様に、複数のファイルを1つのストリームに結合することもできます(映像も音声も)。ffmpegでは開始と終了のタイムスタンプを自由に選べるので、タスクの処理方法に多くの余地があります。
-t duration 音声/映像を「duration」秒間記録またはトランスコード
-to time_stop 記録またはトランスコードの終了時刻
-fs limit_size ファイルサイズの上限をバイト単位で設定
-ss time_off 開始時刻のオフセットを設定
-sseof time_off EOFからの相対的な開始時刻オフセットを設定
-seek_timestamp -ssによるタイムスタンプシークの有効/無効化
-timestamp time 記録タイムスタンプを設定('now'で現在時刻)
例えば、次のようなコマンドを試してみてください:
ffmpeg -i MVI_1348.MOV -ss 4 -t 4 spliced.mp4
このコマンドは、入力クリップの4秒目から4秒間を抽出します。短い表記(4は秒を意味する)でも、hh:mm:ss.mmm形式の完全な表記でも指定できます。これによりミリ秒単位の精度が得られ、実用上は十分すぎるほどです。
一方、ファイルの結合は少し複雑です。正式には連結(concat)と呼ばれ、切り出しとは仕組みが異なります。結合したい部分をコマンドラインで指定するのではなく、特定の記法に従ってテキストファイルに記述し、そのファイルをffmpegに読み込ませます。例えば:
ffmpeg -f concat -i list.txt -codec copy joined.mp4
list.txtファイルの中身は次のようになります:
file 'part-1.mp4'
file 'part-2.mp4'
file 'part-3.mp4'
「file」というキーワードとシングルクォーテーションの使い方に注意してください。絶対パスと相対パスのどちらも使用できます。ファイル形式を間違えると、次のようなエラーが表示されます:
[concat @ 0x555ca89c38c0] Line 1: unknown keyword 'part-1.mp4'
list.txt: Invalid data found when processing input
テキストファイルではなく、コマンドラインで直接ファイルリストを渡そうとすると:
part-1.mp4: Invalid data found when processing input
字幕の埋め込みと抽出
VLCと字幕に関する記事を覚えていますか?コマンドラインに抵抗がなければ、同じことはffmpegでも可能です。簡単な例として、別々の音声ファイルと字幕ファイルがあるとしましょう。追加の処理なしで、映像フィルタリングオプションを使うだけで済みます:
ffmpeg -i input.avi -vf subtitles=subtitle.srt output.avi
より複雑なユースケースとして、以下のコマンドは別々のMP4ファイルと字幕ファイルを受け取り、映像をトランスコードしながら1つの出力ファイルに統合します。-mapオプション(2回登場していますが、誤りではありません)は、ストリームが出力へマッピングされる順序を定義します。しかし、そこには賢くやや紛らわしいコーデック指定があります。複数のストリームがあるため、操作したいのは映像部分だけで、音声や字幕はそのままにしたいのです。
そのために、-c copyですべてのコーデックをコピーするよう指定し、その後-c:vでこのオプションを上書きして、映像ストリームだけをトランスコードします。libx264コーデックを使用しているため、可変ビットレートのためのConstant Rate Factor(CRF)オプションも23に設定し(範囲はロスレスの0から最低品質の51まで)、veryfastプリセットを使用して比較的小さな出力ファイルを生成しています。
ffmpeg -i input.mp4 -i subtitle.srt -map 0 -map 1 -c copy -c:v libx264 -crf 23 -preset veryfast output.mp4
字幕の抽出は次の形式で行います:
ffmpeg -txt_format text -i input.file out.srt
動画の高速化とスロー再生
これも興味深いユースケースです。誰しも、手持ちの動画を2倍速にしてベニー・ヒルのテーマ曲を流したくなることがありますよね。逆にアクションをスローにして、さらに滑らかな補間を加え、カクカクした印象をなくすこともできます。
例えば、15〜20枚ほどのサムネイルだけで作られたストップモーション動画は、再生時間がわずか1秒程度しかありません。これを5秒に引き伸ばしたいけれど、そうすると各フレームが5倍の時間表示されてしまいます。代わりに、追加フレームを「挿入」して滑らかなスローモーションに見せる方法があります。以前、インテリアデザインギャラリーの動画でこれを行ったことがあり、当時はAviSynthとVirtualDubを使用しました。
動画速度フィルターは、各フレームの表示タイムスタンプ(PTS)を変更することで機能します。端的に言えば、1未満の分数値は動画を速くし、1より大きい倍率は遅くします。速度を上げるとffmpegはフレームを間引きますが、より高いフレームレートを指定することで対応できます。元の状態を保ちたい場合は、入力のFPSに使用中のPTSの逆数を掛けます。つまり、24FPSのクリップを2倍速にするなら、48FPSのレートを使用すべきです。
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" output.mp4
ffmpeg -i input.mp4 -r 96 -filter:v "setpts=0.25*PTS" output.mp4
ffmpeg -i input.mp4 -filter:v "setpts=2*PTS" output.mp4
動画のスムージングはもう少し複雑です。私自身、ドキュメントを参照する必要がありました。要するに、5倍にスローした動画(元の5倍の長さ)に対しては、映像補間を使って滑らかさを実現します。ここでもFPSを追加する必要があり、ffmpegが中間フレームを推測するのに十分なデータを与えます。私の例では5倍スローなので、5×24FPS(元の速度)、つまり120FPSが必要です。
ffmpeg -i input.mp4 -filter:v "minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=120'" output.mp4
これはCPU負荷の高い処理で、完了までに時間がかかることがあります。ffplayで動画をプレビューしながら確認しましたが、結果は妥当なものでした。ただし、無から有を生み出す魔法ではないので、欠落データが少量の場合(2秒ごとに1フレーム欠けているような極端なケースではない場合)にうまく機能します。
音声についてはatempoを使用できます。このオプションの範囲は0.5〜2.0で、最大でも半速または2倍速ですが、複数のatempoフィルターを連鎖させることで、さらなる速度変更が可能です。以下のような例です:
ffmpeg -i input.mp4 -filter:a "atempo=2.0,atempo=2.0" -vn output.mp4
以上で、このチュートリアルは終わりです。
まとめ
この記事が有益で楽しく、役立つものであったことを願っています。ffmpegはLinuxにおける音声・映像編集の主力ツール――いや、騎兵隊全体と言ってもいいでしょう――であり、あまりにも多くの実用的なツール、オプション、設定が存在するため、初心者にとっては混乱や圧倒を感じやすいかもしれません。しかし、このチュートリアルを読み終えた頃には、そんな感情は消え去っているはずです。
今回は、変換とトランスコード、スケーリングと品質調整、画像の抽出・結合・GIF作成、動画の分割と結合、字幕の抽出と埋め込み、動画の高速化・スロー化などについて取り上げました。しばらくは楽しんで作業に励める内容だと思います。ffmpegに関するリクエストや質問があれば、お気軽にお寄せください。メールはクリック一つで届きます。最後に、このチュートリアルが本当に役立ったと思えたら、ぜひ愛を返していただけると嬉しいです。なぜなら、そうする理由になるのですから。
それでは、また。
-
【解決法】オーディオレンダラーエラー「コンピューターを再起動してください」の直し方
YouTube動画の再生中に「オーディオレンダラーエラーが発生しました。コンピューターを再起動してください」というメッセージが表示されて困っていませんか? 多くのWindowsユーザーから同様の報告が寄せられています。このエラーは特定のWindowsバージョンやブラウザに限定されたものではなく、iTunesや標準のオーディオプレーヤー使用時にも発生することがあります。そのため、状況に応じて複数の対処法を試す必要があります。 まず試すべきなのは、オーディオデバイス(ヘッドホンやスピーカー)の抜き差しです。それでも改善しない場合は、破損または不具合のあるドライバーが原因である可能性が高いため、ドラ
-
PC内のオーディオファイルを簡単に検索する方法!Disk Analyzer Pro活用ガイド(2022年最新版)
あらゆるものがデジタル化された現在、画像、書籍、ドキュメント、音声、動画などはすべてパソコン上に保存されるようになりました。しかし、数万件にも及ぶファイルの中から目的のオーディオファイル(MP3など)を探し出すのは、意外と手間がかかるものです。この記事では、Disk Analyzer Proを使ってPC内のオーディオファイルを効率的に検索する方法を詳しく解説します。 Disk Analyzer Proならオーディオファイルもラクラク検索 Disk Analyzer Proは、Systweak Softwareが開発した高機能ディスク解析ソフトです。PCに接続されたハードディスクの中身を調査で