ffmpeg

FFmpegことはじめ

More than 1 year has passed since last update.

FFmpegとは

すっげぇ統合的でクラスプラットフォームで動作する動画・音声を扱うツール
動画からサムネイルを作成するときにも使える
動画や音声を切り分けたり、逆に結合してやったりできる。

こんな人向け

  • FFmpeg使いたいけどよく分からない人(全部読んで)
  • 動画を撮影したもののサイズが大きいのでアップロードできない!!品質をある程度確保しつつ、ファイルサイズをなるべく抑えたい人(映像オプションへGO)
  • インターネット上のファイルをインプットにできることを知らない人(httpインプットへGO)

インストール

とりあえずMacのhomebrewでのインストール方法、個人的にはlibfaacとlibx264が入っていれば最低限の動作はすると思っている。
実際には他にもオプション付けまくってインストールしているから下記のサンプルで動かなかったらごめんなさい

$ brew install ffmpeg --with-faac --with-fdk-aac --enable-libx264 --enable-libxvid

他の環境の人はビルドするのが吉だと思いますが、下記2点をインストールした状態で--enable-faacと--enable-libx264オプションを付けてビルドするのかな。

  • x264
  • faac

基本

$ ffmpeg -y -i input.mov -f mp4 output.mp4

基本形、mp4にフォーマットしてエンコードする
原則いろいろなオプションを組み合わせる事ができるのでいろいろ例とともにいろいろ試してみて
ただし、後述のビデオビットレートと映像品質など併用できないオプションも存在する

  • i - インプットファイル
  • f - フォーマット、mp4とかflvとか
  • y - 強制上書きオプション

映像オプション

$ ffmpeg -i  input.mp4 -vcodec libx264 -b:v 5000k -r 24 output.mp4 

ビデオコーデックやビットレートを決めています

  • vcodec - ビデオコーデック
  • b:v - ビデオビットレート、ケツに単位を付与できるようです
  • r - fps、1秒間のフレーム数

音声オプション

$ ffmpeg -i input.mp4 -acodec libfaac -b:a 256k -ar 44100 output.mp4
  • acodec - オーディオコーデック
  • b:a - オーディオビットレート、同じくケツに単位を付与できるようです
  • ar - サンプリングレート・サンプル周波数、44100か48000が一般的

品質オプション

$ ffmpeg -i input.mp4 -crf 20 output.mp4
  • crf - 映像品質、20前後を境に明らかな劣化が分かる。値が低いほど品質が高いので注意

サムネイル切り抜き

$ ffmpeg -ss 20.5 -i input.mp4 -vframes 1 -vf select='eq(pict_type\,I)' -s 320x180 out.jpg
  • ss - 開始時間、iオプションの前に指定しないと全編エンコード後に開始時間を探しにいくのでほとんどの場合はiオプションの前に置くものと考えて良い。単位は秒
  • vframes - 何フレーム分か
  • s - サイズ指定、[幅]x[高さ]とスペースを入れずに指定する。xは小文字のエックス
  • vf - ビデオフィルター、使い道はいろいろありますが上述での使い方ではキーフレームを切り出すことになる

キーフレームとは連続するフレームの中で、ガバッと画面が変わっているフレームのこと。動画ファイルはあまり映像に動きの無いところは直前のキーフレームとの差分を記録することで容量を圧縮しているとかしていないとか。

$ ffmpeg -ss 10 -i input.mp4 -r 8 -vframes 20 %02d.jpg

開始時間10秒から20フレーム切り取る、なお1秒間に8フレームとして切り抜くのでちょうど2.5秒分のサムネイルとなると思う。outputでは連番フォーマットを指定し、01~20.jpgが作成される。

http[s]インプット

$ ffmpeg -ss 20 -i http://anyfile.com/sample.mp4 -vframes 1 out.jpg

httpのパスは架空です

インターネット上のファイルを直接インプットに指定出来る。しかもファイルはすべてダウンロードされずに高速。指定秒数でエンコードや画像切り取りを行う場合はcurlでダウンロードしてFFmpegをパイプするより明らかに高速。
1GBとかのファイルでも目的の箇所のみをダウンロードしているようでサムネイル切り取りなら1秒もかからない。
以前httpsは扱えないようなことを書いていましたが、SSLを扱えるようにFFmpegをビルドすれば扱えました。申し訳ないです。

2pass

$ ffmpeg -i input.mp4 -pass 1 -an output.mp4 && \
  ffmpeg -i input.mp4 -pass 2 -b:a 256k -y output.mp4
  • an - 音声なし、2passの一回めでは解析を行うだけなので音声情報は圧倒的に不要のため
  • pass - 2を指定した場合、1回めの解析情報を元にエンコードを行う。動きの少ない部分のビットレートを落とすなどしているのかと思う。1pass(通常のエンコード)に比べてファイルサイズを落としつつ、品質を保つ事ができる。ただしエンコード時間が2倍とまでいかないものの増える