2013年6月24日月曜日

ffmpegで色々する


おはようございます。
今回の記事は研究と直接関係無いんですけど、便利なんでみんなに知ってもらおうと思って書きます。
タイトルにある通りffmpegというツールについてのお話です。

ffmpegは情強を自負している人は当然知っているであろうツールで、何ができるかというと動画像、音楽、画像の相互変換やファイル形式の変換が簡単にできるものです。
例えば動画像を連続した静止画やgifアニメーションにしたり、動画像データから音声データを抜き出したり、flvをmp4にしたり、mp3からaacやアップルロスレスへの変換などメディアファイルの変換は大抵なんでもできます。

インストール

ffmpegを使ったGUIソフトはたくさん出まわってますが、そんなものに頼らなくても上述したことはターミナルから出来ます。
インストールはhomebrewやMacPortsを使えば簡単です。
方法は以下などを参考にしてください。
Mac Ports で ffmpegのインストール
Macのhomebrewでffmpegのインストール
インストールしてみると分かりますが、lameなど一緒にたくさんのオープンソースなライブラリがインストールされます。
多分ffmpegは巷で出回っているメディア系のライブラリをオールインワンした感じなんだと思います。

使い方

動画像から音声データの抜き出し

 今mezon.mp4という動画ファイルから最初の3秒目から50秒目までの音声データを抜き出したいとします。
まず、どういう形式のファイルで音声データが格納されているかを知りたいので以下のコマンドを入力します。
ffmpeg -i mezon.mp4
で、これで音声データがmp3で格納されていると分かったとしたら以下のコマンドで抜き出すことができます。
ffmpeg -y -i mezon.mp4 -acodec copy -ss 3 -t 00:00:50 mezon.mp3
-yオプションは出力ファイルが既に存在していたら上書きするということです。
-acodecはここでは元の音声ファイルと同じ形式にしたのでcopyを指定しましたが、libaacなどと指定するとaacで出力できたりします。
-abオプションってのもあって128kとかでビットレートを指定できたりします。

音楽データのファイル形式の変換

今回の記事のメインはメゾンではなくここです。
上述したようにffmpegを使うと音楽ファイルのファイル形式の変換も簡単にできます。
ffmpegではMicrosoftが開発したwma形式にも対応しています。
筆者がまだ学部生だった頃Windowsしか使っておらず、何を思ったか所有している3、400枚ほどのCDを全部wmaで取り込んでしまい、今のメインで使ってるMacではVLCプレーヤーなどを使わないとそれらを再生することができない状況に陥りました。
 iTunesでwmaファイルを読みこんでくれるプラグインがあれば一番良かったのですがそれも見つからず、かといって自分で作るにしてもAPIとか出まわってなさそうなのでそれはあきらめました。
なので持っているwmaファイルを全てiTunesで読み取ってもらえるアップルロスレス形式に変換することを決心しました。

そこでシェルスクリプトの出番です。
ファイル内のサブディレクトリにまで渡って全てのwmaファイルをそれと同じフォルダにアップルロスレスのm4a形式として出力するやり方は以下のようになります。
find . -name "*.wma" | while read FILE
do
    ffmpeg -y -i "$FILE" -acodec alac "${FILE%.wma}.m4a"
done
alacってのがアップルロスレスを指定するオプションです。

が、実はこの方法ではいくつか問題が起きました。
まず、アップルロスレスではファイルサイズがでか過ぎてwmaファイルの20倍くらいになってしまうということです。
全ファイルにやるとwmaだけで40GBくらいあるのにアップルロスレスにすると800GBくらいに膨れ上がるのでウザいです。
なのでmp3の320kbpsでやります。
しかも、ffmpeg一回すると分かるのですが色んな情報が標準出力に出力されて、40GB分とかになると大量のログデータが残ってしまいます。
なのでログとして出力する情報をエラーが起きたときのみに変更します。
さらに、上記の方法では日本語ファイルの変換が何故かうまくいきませんでした。
スペースが存在するのが原因かもしれませんがechoでファイル名表示させるのは上手くいくので、ファイル名が長すぎたりするとダメなのかもしれません。

そこで別の方法を取ります。
xargsというコマンドを使うと、findの引数をいい感じにしてくれるみたいなんでそれを使います。
いい感じというのは、findの結果が大量にあった場合に小出しにして次のコマンドに送ってくれるらしいです。
具体的には以下のコマンドになります。
find . -name "*.wma" -print0 | perl -pe 's/\.wma\0/\0/g' | xargs -0 -I{} ffmpeg -y -i {}.wma -acodec mp3 -ab 320k -loglevel error {}.mp3
perlなんちゃらの部分でファイル名から.wmaを取り除いた文字列を取得してxargsに渡しています。
findの-print0オプションはスペースを含んだファイルも扱えるようにするものでxargsの-0オプションと一緒に使うのが定石っぽいです。
これをさっきのに入れたら良かったのかもしれませんが試してません。
xargsの部分ではwhileループを書く必要がなく、入力文字列を{}に入れてffmpegを実行しています。
ffmpegのオプションは上で説明したものを指定しています。
>> log.txtなどと付け加えるとログをテキストデータで保存できます。

以上長々と便利ツールffmpegの使い方を紹介しましたが、情強の方は多分これくらい余裕なのかもしれませんが自分用の備忘録としても書いておきました。

0 件のコメント :

コメントを投稿