2010/09/23

XBMCで音が出ない動画をffmpegでどうにかしたメモ


いつからかわからないんですが、以前はちゃんと再生できてたモノラル音声かつサンプリングレート48kHz以外の動画ファイルをXBMCで再生しようとすると、音が出ないことに気づきました。どっちが悪いのか切り分けてませんが、この2つの条件が重なると”failed to initialize audio device”ってエラーが出たりして(出ないパターンもあるので難解。。)音が出ない。つってもかなり昔にエンコードしたようなファイルだけなので実害は無いのですが、なんか嫌なのでForumで質問したり.asoundrcいじったり色々してみましたが、全然改善しないので発想を変えて再エンコードしてみました。その時のメモ。

携帯動画変換君とか使えばいいのかなと思いましたが、自宅サーバ上で一気にやりたかったのでffmpegを使ってやってみました。便利ですねffmpeg。めっちゃ便利。ubuntu10.04でやった。

  1. ffmpegが入ってなければaptitudeで入れる。
  2. 音声をmp3で再エンコードしたいので、libmp3lameを入れる。単にlibmp3lameと指定しても見つからないけど、以下のパッケージを入れると使える。
    # aptitude install libavcodec-unstripped-52
  3. 対象の動画の音声だけを2chにしてサンプリングレートを48kHzにして書き出す。ビットレートは適宜(デフォルト64kb/s)。
    # ffmpeg -i hoge.avi -vcodec copy -acodec libmp3lame -ab 128k -ar 48000 -ac 2 hoge.mod.avi
    -vcodec copy: ビデオは同じ設定で書き出す。
    -acodec libmp3lame: 音声コーデック指定。
    -ab: 音声ビットレート指定。kをつける。
    -ar: 音声サンプリングレート指定。
    -ac: 音声チャンネル数指定。2chに。
これでできました。あとは以下の感じでディレクトリ無いの全aviファイルを一気に処理して完了。
# for i in *.avi ; do ffmpeg -i $i -vcodec copy -acodec libmp3lame -ab 128k -ar 48000 -ac 2 $i.mod.avi ; done
実は最初はこうやって一発でできるってわからなくて、一度mp3だけ設定変えて書き出し→音声消した動画だけ書き出し→両者を結合、とか3回も処理させてました。なんでかって、まずmp3だけ書き出し→元の動画と結合、ってやってみたら元の動画の音声がそのままになっちゃったからでした。じゃあ一度音消して結合すればいいや、というわけですね。色々試してみたら、先に読み込ませた方の音声が有効になる(?)みたいでした。つまり、音の入っている動画ファイルに音声かぶせるときは、
# ffmpeg -i hoge.avi -vcodec copy -i hoge.mp3 -acodec copy hoge.mod.avi
だとダメで、
# ffmpeg -i hoge.mp3 -acodec copy -i hoge.avi -vcodec copy hoge.mod.avi
だとOK。なんだかそういう事みたい。ふーん。紆余曲折っと。

とりあえずこれで特に音ズレとかも無しでXBMCから再生できる動画になりました。ホントffmpeg便利なのねえ。

Related Posts Plugin for WordPress, Blogger...