ffmpegの-abオプションのビットレートはkbit/sではなくbit/sで指定する
本編
いままでずっと
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余談
- 上記の「キロ(k)」は1024ではなく1000です*2。
- -yオプションは上書きOKのしるし。Rubyスクリプトで使うときに入れておくと便利。
- スクリプトで使うときには標準出力と標準エラー出力とを捨てておく。
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 (もうちょっと詳しく書く予定。)