過去に変換した動画がAndroid端末で再生できなくて困ったので再変換してみた
今回の問題
Android端末で、通常なら再生できそうなDVD解像度のMP4(H264)で再生できないファイル群が存在した。
試した端末のCPUは以下
- AllWinner A10
- Amlogic8726-M6
- Tegra 3
- Snapdragon S4 MSM8660A
動画に強いCPUから、処理能力が高いCPUまで全部ダメ。
状況としては、カクついて、動画が1fps(1秒に1枚の絵)程度になっている感じ。音声もダメ。
なお、再生はDLNA経由で行っています。
PCでは普通に再生できます。
今回は、問題を解決しつつ、時間と労力と電力をかけないことを目指してみました。
まずは前提知識
Android端末でmp4などを再生する場合は、動画ファイル内のメタデータの配置方法が重要となります。
一般的にWeb Optimizedなファイルと呼ばれているものが適しています。
コーデックなどの違いではなく、動画に関する情報(メタデータ)のファイル内での配置位置・配置方法が異なります。
Web Optimizedな状態というのは、簡単に説明すると、動画全体を読み込まなくても動画をスムースに再生できる状態にあります。
ストリーミングを意識したファイル形式という認識でおkです。
まず Web Optimize してみた
ファイルをWeb Optimizeするには、いくつかのtoolが提供されています。
まずは、Adobeのエバンジェリストの方が提供しているQTIndexSwapper2を使用してみました。
このツールの場合は、上記の通り、動画ファイル内の配置を変えるだけなので、ファイルをコピーする程度の時間で処理が終わります。
ツールをインストールし、実行してみたところ、動画変換(再配置)は無事に終わりましたが、動画再生は完全に失敗。
次に、HandBrake で再変換してみた
ご存知、動画変換ツール(ffmpegラッパー)のHandBrakeを使い、Web Optimized にチェックを入れ変換。
当然ながら、変換に時間がかかります。
再生は成功。ただ、時間と電力が無駄にかかります。
更に、ffmpeg で入出力してみた
興味本位で 動画変換ツールのffmpegを使用して、色々試していたのですが、
コーデックの再利用を行い、単純に入出力してみたところ、あっさりとAndroidで再生できました。
コマンドは下記のような感じ。
ffmpeg -i "${infile}" -vcodec copy -acodec copy "${outfile}"
また、これも基本的にファイル内の配置替えをしているだけですので、コピー程度の時間で処理が終わります。
なお、ファイルサイズは1%未満で変化しました。
まとめ
再生できそうな動画ファイルが再生できないときは、まずは ffmpeg で入出力してみては如何でしょうか?