Help us understand the problem. What is going on with this article?

動画処理の定番ツール「FFmpeg」ことはじめ

More than 5 years have passed since last update.

はじめに

YouTubeやFacebookでも利用されているという噂のFFmpegは、開発が非常に活発で、ここ1年だけでもバージョン1.0から2.1まで上がっています。

ちょっと前まではFFmpegでエンコードした動画をストリーミングに対応させるのは一手間かかったのですが、今では-movflags faststartオプションを付けるだけで対応できるようになりました。(…というのも新しい機能のほんの一部で、他にもたくさんあります)

ここでは、FFmpegの簡単な使い方をメモします。
内容は基本的なことですが、実運用で得たTipsもできるだけ混ぜていきたいと思います。
また、内容に誤りなどあれば、是非ご指摘頂けると有難いです。

インストール

インストールについては公式サイトに丁寧な解説があるので、そちらをご参照ください。
https://trac.ffmpeg.org/wiki/CompilationGuide

基本的には書いてある通りに進めば問題なく動きますが、動画エンコード時に使うフィルタによっては、configure時に何らかのオプションを付ける必要があります。

例えば、映像内に文字を書き込むにはdrawtextというフィルタを使いますが、これを利用するためにはconfigure時に--enable-libfreetypeオプションを追加する必要があります。

※ビデオフィルタに関するドキュメント
http://ffmpeg.org/ffmpeg-filters.html

使い方

FFmpegは豊富なエンコードオプションが用意されていますが、何も指定しなくても十分に使えます。

H.264でmp4形式に変換する

H.264でのエンコードは、以下のように行います。

ffmpeg -i [元動画] -movflags faststart -vcodec libx264 -acodec libfaac [新しい動画]

[元動画]は、FFmpegが対応しているものであれば自動判別してくれます。

ちなみに、H.264はWebでの動画配信では非常に多く利用されている動画コーデックです。ライセンスの問題があり、ブラウザによっては採用されていないのですが(その場合でもFlash経由なら使える)、つい先日CiscoがH.264のオープンソース化を発表し、それに伴ってFirefoxもH.264をサポートすることを発表しました。

※CiscoとMozilla、H.264のオープンソース化とFirefoxでのサポートを発表
http://www.itmedia.co.jp/news/articles/1310/31/news064.html

特定の時間帯を切り出す

特定の時間帯を切り出すのも簡単です。

ffmpeg -ss [開始位置(秒数)] -i [元動画] -t [切り出す秒数] [新しい動画]

なお、動画の切り出し方は複数パターンあり、基本的にはスピードと精度のトレードオフになっています。このあたりについてはFFmpegで素早く正確に動画をカットする自分的ベストプラクティスという実験メモも書いておりますので、もしよろしければご参考ください。

特定の範囲を切り出す

動画の隅などに不要なものが映っていたりして、特定の範囲だけ切り取りたいこととかありますよね。

ffmpeg -i [元動画] -vf crop=x=[切り取りを開始するx座標]:y=[切り取りを開始するy座標]:w=[切り取る範囲の幅]:h=[切り取る範囲の高さ] [新しい動画]

ビデオフィルタをかける:ぼかし処理

何か隠したいものがあることってありますよね。

ffmpeg -i [元動画] -vf boxblur=2:1 [新しい動画]

ビデオフィルタをかける:文字を入れる

字幕を入れたいこととかありますよね。

ffmpeg -i [元動画] \
 -vf drawtext="[TrueTypeフォントのパス]: \
 text='あのイーハトーヴォのすきとおった風': \
 x=0: y=0: fontsize=20: box=1: boxcolor=white@0.7" [新しい動画]

冒頭にも書きましたが、drawtextを使うためにはffmpegコンパイル時に--enable-libfreetypeオプションが必要です。

動画から画像を切り出す

サムネイル画像とか作ることもありますよね。

ffmpeg -ss [切り出し位置(秒数)] -i [元動画] -vframes 1 -f [切り出す画像]

音声部分をを取り出す

音声部分だけ加工したい(ノーマライズなど)こともありますよね。
FFmpegはノーマライズはできないので、音声ファイルだけ取り出して別ツールで処理する必要があります。
以下の例では、16bitのwavファイルに切り出しています。

ffmpeg -i [元動画] -acodec pcm_s16le [取り出す音声]

映像と音声を結合する

バラバラの映像と音声を結合するには以下のようにします。

ffmpeg -i [元映像] -i [元音声] -map 0:0 -map 1:0 \
-movflags faststart -vcodec libx264 -acodec libfaac [新しい動画]

-mapの「0:0」や「1:0」は、どのファイルを何番目のストリームに配置するのかを指定しています。

なお、この時に映像や音声のコーデックを変換する必要がない場合、-vcodec copyや-acodec copyのように値にcopyを指定すると再エンコードする必要がないため余計な処理が走りません。(ncaqさんコメントありがとうございます!)

動画のメタデータを確認する

動画の長さや、サイズ、ビットレート、動画や音声などトラックごとの情報などを表示します。

ffprobe [元動画]

以上、基本的な使い方の部分をご紹介いたしました。

本家のドキュメントも充実しているので、是非あわせてご覧ください。
http://ffmpeg.org/documentation.html

その他の記事

admin-guild
「Webサービスの運営に必要なあらゆる知見」を共有できる場として作られた、運営者のためのコミュニティです。
https://admin-guild.slack.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away