前置き
さまざまな音楽配信サービスのファイルやネットで配布された音楽ファイルなどを保存していくと PC 内にいろんな形式のファイルが乱雑に転がってしまっている状態になると思います。PC でこれらのファイルの再生するときは VLC などの高機能な万能プレイヤーを使えばファイル形式について気にする必要はありません。
しかしスマートフォンや音楽プレイヤーに移すと再生できないファイルも出てきてしまいます。こうしたときにファイルを一括して特定の圧縮形式にエンコードしてしまいたいのではないでしようか。
本記事はFFmpeg を用いて一発で大量の音声ファイルを変換するコマンドをご紹介いたします。
大本命は超高圧縮率でライセンスの心配がいらないオープンソースな音声圧縮形式「Opus」なのですが、いかんせん普及が全然進んでいません。対応してるプレイヤーがほとんどないのです。YouTube の音声データによくOpusは使われるようになってきたのですが、音楽ファイルとして広まるかどうかはまだ未知数で今後に期待したいところです。
現在広く使われている圧縮形式と言えば、 mp3 と m4a (mp4)になります。今回この2つから選んでいくことにします。
また、 Linux には高性能な AACエンコーダに対応した GUI ソフトウェアがないので FFmpeg を用いて変換します。
m4a(AAC) へ変換
Linux の場合選択肢は以下の5つのエンコーダがあります。
- Wine 経由で Apple AAC
- Nero AAC
- FFmpeg 内蔵の AAC
- Fraunhofer AAC
Wine を使って Apple AAC エンコーダを使えなくもないですが変換が遅かったり色々問題もあるようです。
Nero AACは10年以上メンテナンスされておらず、ライセンスも商用利用不可です。
今回の目的を果たしてくれそうなエンコーダは FFmpeg のコマンドラインが使える下の2つになります。
FFmpeg内蔵のAACエンコーダはGPLライセンスでどのようにも利用できますが出来はあまり良いとは言えません。帯域によってはMP3にも劣る音質です。
libfdk_aac
が音質良いですよ、と FFmpeg 公式でおすすめされているので Linux で AAC にエンコードしたい場合は Fraunhofer FDK AAC ほぼ一択のようです。Android にも導入されている高性能で実績のあるコーデックです。FraunhoferはMP3フォーマットを開発した研究所でもあります。
Fraunhofer FDK AAC コーデックによるエンコード
FDK AAC はオープンソース・ソフトウェアではありますが GPL とは違ったライセンスの元でリリースされているので FFmpeg にマージされておらず、自分でビルドしなければなりません。
少々面倒ですが FFmpeg が公式でビルドする方法を載せてくれているので比較的簡単に導入できます。
Arch Linux ならばフル装備の FFmpeg を AUR 経由で簡単にビルドできます。
コマンド
$ ffmpeg -i "hogehoge.hoge" -c:a libfdk_aac -vn -b:a 256k "hogehoge.m4a"
少し解説すると -c:a
オプションでオーディオコーデックを指定します。 -vn
は動画が混じってた場合に取り除いてくれるコマンドオプションです。 -b:a
は固定ビットレート(CBR)です。
応用編
上記のコマンドを応用して現在いるディレクトリ下に outputs というサブディレクトリを作成し、FFmpeg で読み込めそうなファイルを全部読み込んで m4a (AAC) 256Kbps へとエンコードし、 outputs に放り込むコマンドを作りました。エンコードしたいファイルが置かれているディレクトリまで移動したあとに下のコマンドを実行します。 .bashrc にコマンドを alias を使って登録しておくと便利です。
$ mkdir -p outputs && for f in *.*; do ffmpeg -i "$f" -c:a libfdk_aac -vn -b:a 256k "outputs/${f%.*}.m4a"; done
ハイファイマニアでもないし、128Kbps の AAC でも全然聴けてしまう耳なのですが、今回は再エンコードしてしまうので念のために 2倍の 256 Kbps にしました。スマートフォンなどの携帯ストレージでも大容量化が進んでこの程度の容量は痛くも痒くもなくなったというのもあります。
FFmpeg ネイティブエンコーダを使う
今後改善されるかもしれないので念の為に FFmpeg のネイティブ AAC エンコーダの利用方法も載せます。2016年に安定版がリリースされ、他の AAC エンコーダと遜色ない性能だと公式に発表してますが、冒頭で述べた通り自分が使った限りでは FDK AAC よりかなり音質が劣ります。
特に、 64Kbps でそれぞれ比較すると露骨に音質の差がわかります。おすすめはしませんがなにかをインストールしたり特別な設定が必要なく使えるので便利ではあります。
コマンド
エンコーダ・ライブラリの名前が変わっている以外 FDK AAC と同じです。
$ ffmpeg -i "hogehoge.hoge" -c:a aac -vn -b:a 256k "hogehoge.m4a"
下記のコマンドはさきほどの変換できそうなファイルを変換してフォルダに放り込むコマンドのFFmpeg内蔵AACエンコーダ版です。
$ mkdir -p outputs && for f in *.*; do ffmpeg -i "$f" -c:a aac -vn -b:a 256k "outputs/${f%.*}.m4a"; done
VBR (可変ビットレート)も使えますが、このエンコーダではまだ試験段階らしく、 CBR よりも音質が悪くなってしまう可能性があります。
mp3 へと変換する
MP3 で音楽や音声を管理するのも手です。 いまさらこんな時代遅れの圧縮形式を使うのか、と考える方もおられると思いますがMP3は互換性が高く様々な機器で再生することができます。これは非常に大きなメリットです。
Amazon Musicなどのサービスもまだ MP3 で音楽ファイルの販売を行っておりますので、現役で一番使われている圧縮形式だと思います。
AAC は Apple が開発に大きく関わっていたということもあり、同じ AAC でも機器によっては再生できないこともあるなど、互換性に難を抱えています。
それに MP3 256 Kbps と AAC 256 Kbps を聴き比べてみましたが、自分の耳では聞き分けることができませんでした。エンコーダによっては AAC の方が劣っているということもあり得るので音質の面でも必ずしも MP3 が弱いとは限りません。
下記のブログ様で音声圧縮形式の比較検証を載せています。
iTunes の MP3 エンコーダの出来はあまり良くないので LAME エンコーダの使用をおすすめします。
コマンド
ffmpeg -i "hogehoge.hoge" -c:a libmp3lame -vn -b:a 256k "hogehoge.mp3"
応用編
$ mkdir -p outputs && for f in *.*; do ffmpeg -i "$f" -c:a libmp3lame -vn -b:a 256k "outputs/${f%.*}.mp3"; done
先程のコマンドラインのコーデックと出力する拡張子を改変しただけです。
LAME本家のエンコーダを使う
FFmpeg に内蔵されている LAME エンコーダは微妙に本家とは挙動が違うと聞いたので、 FFmpeg でファイルを読ませてLAMEエンコーダにパイプ(橋渡し)するコマンドも載せました。
コマンド
$ ffmpeg -i "hogehoge.hoge" -f wav - | lame - "hogehoge.mp3"
以下ディレクトリ内のファイルを一括変換するコマンド。更に高音質にする設定を加えました。ビットレートが320kps固定で最高音質設定なので変換が遅いです。
$ mkdir -p outputs && for f in *.*; do ffmpeg -i "$f" -f wav - | lame --preset insane - "outputs/${f%.*}.mp3"; done
fdkaac
でもこの方法を試してみましたが下記のようなエラーが出て出力できませんでした。残念ですがおそらくバグかと思われます。
av_interleaved_write_frame(): Broken pipe
Error writing trailer of pipe:: Broken pipe
以上になります。
コメント
初めまして。
調べてみたところ、同じビットレートなら音質がaac>mp3ですから、aacで出力したいです。FFmpeg でaacに変換できますか。
詳しいご解説ありがとうございます。