ffmpegの-abオプションのビットレートはkbit/sではなくbit/sで指定する

バージョン

ffmpeg version 1.2.1 Copyright (c) 2000-2013 the FFmpeg developers

でのお話。

本編

いままでずっと

ffmpeg -y -i input.flv -ab 128 output.mp3

というような形式で書いていた。
先ほど、ffmpegからこのように怒られているのに初めて気付いた。

[libmp3lame @ 0x101877c00] Bitrate 128 is extreemly low, did you mean 128k
The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s

ビットレート128って小さすぎ、128kのことか?bits/sで指定しろよ、kbits/sじゃなくて」と。
じゃあ馬鹿なユーザに配慮して128を128kと解釈して128kbit/sで変換してくれているのか、というとそんなことはなく、なぜか64kbit/sで変換していたりするw*1 しかも、他のソフトだと56kbit/sと誤認識するためにファイル長(時間)が短く表示されてしまう。
ということで64kbit/sにしたい場合には

ffmpeg -y -i input.flv -ab 64k output.mp3

と書きましょう。品質を高くしたい場合には128kだの256kだのに上げて指定してください。

-abオプションの位置

-iオプションよりも後に置きましょう。というか、-iオプションはできるだけ前に置きましょう。-iオプションよりも前に置いた他のオプションが無視される場合があります。

ffmpeg余談

ffmpeg -y -i input.flv -ab 128 output.mp3 >/dev/null 2>&1
  • -abオプションのビットレートは1チャンネル当たりの値です(これは感覚と合致するのでありがたい、けど昔は合計ビットレートを指定していたらしい)。
  • -acodecオプションを指定しなくてもだいたい適切なコーデックを使ってくれます。なのでmp3へ変換するときに"-acodec libmp3lame"と付ける必要は無いです。
  • -metadataオプションを使うとID3タグを書き込める。このサイトが詳しい。How To: Create/Write ID3 tags using ffmpeg (もうちょっと詳しく書く予定。)

*1:最低ビットレートなのかな?

*2:キロを1024で使うときには大文字Kを使う派閥に属している私としてはフツーでありがたい