Ubuntuで音が出ないWMV(Windows Media Video)を音が出るフォーマットに変換する

問題編

手元のUbuntu 10.04はWMV形式の動画を再生できるようにしてあるのだけど、時々コーデックの関係か音声が再生されないファイルがある。大概は音声コーデックとしてWMAWindows Media Audio)9が使われていて、ライセンスの関係でUbuntuにはこれ用のコーデックが無い為に音のみデコードできない。

同じWMVの動画でも音声付きで再生できるものがある。手元のファイルでは音声コーデックとしてWMA 2を使っていることが多いようだ。

一応Windows PCも持っているので、WindowsでMedia Playerを使えば正しく再生できる。しかしB5ノートPCなので画面は大きくないし内蔵スピーカーでは音もしょぼい。

一方でUbuntuを入れてるサブPCはIntel純正のAtom 330マザーボードを積んでいてビデオもサウンドオンボード機能を使っているにも関わらず、ディスプレイは無駄にRDT232WX*1だしライン出力の接続先はXENYX 1002FX + ATH-CM700Tiという謎の構成で、DVDやBDの再生には無理がある*2けどネットで動画を見るには申し分ない環境だ。

このRDT232WX + XENYX 1002FX + ATH-CM700Tiの構成にノートPCを含めたい所だけど、置き場所の都合で無理がある。UbuntuからノートPCにリモートデスクトップ接続する方法もあるけど、その場合はリモート画面上でWindows Media Playerを使った時に何故か全画面表示できず、非常に迫力のない映像になってしまう。

ということで、ローカルにファイルとして保存したWMV(WMA 9使用)ぐらいはUbuntuで音付きで再生できるようにしたい。

解決編

WMAについてはWMA Losslessを除けばFFmpegでデコードできるようだ。なのでWMA 9あたりをサポートする構成でビルドしたFFmpegのコーデックライブラリを使う動画再生ソフトがあればUbuntuWMA 9を使った動画ファイルを再生できると思う。思うけど調査を含めて準備が面倒そうなのでパス。

次善の策としてFFmpegで動画の形式を変換してしまうことにした。FFmpegでは動画/音声の片方のみ変換することができるので、WMA 9を使っているWMVファイルを入力として、動画部分は変換せずに音声のみWMA 9からWMA 2に変換して出力すればよいはずだ。

FFmpegは対応コーデックの関係で自前でビルドすることになりそうで、それすら面倒なのでWindows用のバイナリを拾ってきて使うことにした。UbuntuからノートPCにリモートデスクトップ接続して、Windows上でFFmpegでファイルを変換するのだ。ファイル転送にはNASが使えるので問題ない。

変換時の具体的なオプションはこんな感じ。変換元のファイルはsample.wmvだ。

ffmpeg -i sample.wmv -vcodec copy -acodec wmav2 sample_wmav2.wmv

コーデックとして `copy' を指定すると、エンコードせずに変換元ファイルのでーたをそのまま使うようだ。ここでは -vcodec に `copy' を指定して、動画部分のデータをエンコードせずに変換元ファイルのものをそのまま使うように指示している。その一方、音声については -acodec に `wmav2' を指定してWMA 2に変換している。

手元の2〜3のファイルで試した限り、この方法で変換したWMAUbuntu上で音声付きで再生することができた。

ただ毎回ffmpegのコマンドを叩くのは面倒だ。指定するオプションは毎回同じなので、こんな内容のバッチファイルをffmpeg.exeと同じフォルダに置くことにした。

@echo off
for %%I in (%*) do (
    "%~dp0ffmpeg.exe" -i %%I -vcodec copy -acodec wmav2 "%%~dpnI_wmav2%%~xI"
)

変換したいWMVファイルをこのバッチファイルにドラッグ&ドロップすると、元のファイル名に `_wmav2' を付け足した名前で変換したファイルを生成する。出力先は変換元ファイルと同じフォルダだ。

一度に複数のファイルを変換できるようにしてあるけど、ファイル数が多いとコマンドプロンプトの長さの制限に引っかかるかもしれない。あと変換に失敗したファイルがあった場合のことは考慮していない*3

*1:もっともアナログVGA接続だけど。

*2:比較対象はPS3。ディスプレイとHDMIで接続しているので余計に画質の差を感じてしまう。

*3:多分、変換に失敗したら次のファイルの変換にスキップするはず。ただ「終了時にどのファイルが変換失敗したか一覧表示する」といった洒落た機能は無い。