2012.04.30作成
以前の記事を作成して以後、サーバーやOS等の環境が変わったためか、
エンコード後のmp4ファイルに音飛びが発生するようになった。
このページでは新たに発生した音飛びという課題を解決する方法をまとめた。
以前の記事でまとめたエンコードの方法で作成したmp4ファイルをVLCで再生すると、
たまに音飛びが発生するようになった。
音飛びが発生すると、VLCのメッセージウィンドウに以下のようなログが出力される。
main warning: audio drift is too big (-129292), clearing out main warning: timing screwed, stopping resampling main warning: mixer start isn't output start (-62166) main debug: audio output is starving (446805), playing silence
また、QuickTime Playerで再生すると、音飛び箇所以後音声と映像がずれてしまう。(音飛びは生じない)
複数のプレーヤー(QTとVLC)で音声の再生に不具合が出ること、mp4作成時に音声のエンコードを
行わず、元のcodecのままmp4を作成すると不具合は出ないことから、ffmpeg内蔵のfaacに何らかのバグか
不具合が含まれていると推測される。
不具合が含まれている可能性が高いffmpeg内蔵のfaacを用いずに、音声のエンコードを別のプログラムを用いてエンコードすることにする。
ffmpegを自分でコンパイルする方法も解決策として挙げられるが、ffmpegをコンパイルするまでに他のプログラムをコンパイルする必要があり、それだけでも手間がかかるし、コンパイルの失敗などで別のトラブルが発生しないとも限らないので、ffmpegのコンパイルは見送る。
今回も、最小の労力で問題を解決する事を心がける。
faacはaacへエンコードするプログラムで、単品でコンパイルできるため、簡単に導入できる。今回はfaacを音声のエンコードに採用する。
sourceforgeからfaac-1.28をダウンロードする。sourceforge.jp
configure, makeと進めるが、エラーが出て終了した場合、ソースファイルの以下の箇所をコメントアウトする。
vi common/mp4v2/mpeg4ip.h #ifdef __cplusplus extern “C” { #endif char *strcasestr(const char *haystack, const char *needle); #ifdef __cplusplus } #endif ↓コメントアウト /* #ifdef __cplusplus extern “C” { #endif char *strcasestr(const char *haystack, const char *needle); #ifdef __cplusplus } #endif */
makeが通ったら、sudo make installを実行し、インストール完了。通常、/usr/local/bin内にfaacプログラム本体がインストールされる。
音声はfaacを使用するが、映像はこれまで通りffmpegを使用する。音声と映像で別プログラムでエンコードするため、エンコードの手順はやや増加してしまい、以下の手順でエンコードを実施する。
1.元となる動画ファイルから音声を分離する 条件:元動画の音声チャンネルが1の場合
ffmpeg -i 元動画 -y -f wav -vn -acodec pcm_s16le -ar 48000 -map 0.1 音声.wav`;
2.分離した音声ファイルからaacファイルを生成する。
faac -q 100 --no-midside --mpeg-vers 4 -o AACファイル.m4a 音声.wav`
3.元となる動画ファイルから映像をエンコードしつつ、aacファイルを音声としてくっつける(mux) 条件:x264エンコードの設定ファイルがPRESET、元動画の映像チャンネルが0の場合
ffmpeg -i 元動画 -i AACファイル.m4a -y -f mp4 -vcodec libx264 -fpre PRESET -r 30000/1001 -aspect 16:9 -s 720x540 -bufsize 10M -maxrate 10M -vsync 1 -acodec copy -map 0.0 -map 1.0 完成.mp4
4.不要になったファイルを削除する
rm -f 音声.wav AACファイル.m4a
自動化への対応 以前作成したスクリプトを改造し、音声の分離から合成、不要ファイルの削除までを自動実行するスクリプトを作成した。
拡張子.txtはダウンロード後に削除して使用する。
まとめ ffmpeg内蔵のaacエンコーダは音飛びが発生する事がある。(パッケージやバージョンによる?) faacでのエンコードは、wavファイルを生成する必要がある。
参考ページ http://fkob.net/blog/2012/02/centos-faacライブラリのコンパイルエラー/