&color(red){2012.04.30作成};&br; #contents *はじめに [#se18a5ee] 以前の記事を作成して以後、サーバーやOS等の環境が変わったためか、 エンコード後のmp4ファイルに音飛びが発生するようになった。 このページでは音飛び問題を解決する方法をまとめた。&br; **環境 [#d539c9b2] ***エンコード [#jc54fc67] --NEC Express5800 GT110b --Scientific Linux 6.1 --ffmpeg version 0.6.5, Copyright (c) 2000-2010 the FFmpeg developers&br; built on Jan 29 2012 17:52:15 with gcc 4.4.5 20110214 (Red Hat 4.4.5-6)&br; (rpmforgeからffmpeg-develをインストール) ***再生環境 [#n7ccce07] --mac mini(mid 2009) --Mac OS X バージョン10.6.8 --VLC media player Version 1.0.5 Goldeneye --QuickTime Player バージョン 10.0 (131) *音飛びについて [#a98067cd] 以前の記事でまとめたエンコードの方法で作成したmp4ファイルをVLCで再生すると、 たまに音飛びが発生するようになった。 音飛びが発生すると、VLCのメッセージウィンドウに以下のようなログが出力される。&br; 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で再生すると、音飛び箇所以後音声と映像がずれてしまう。(音飛びは生じない)&br; 複数のプレーヤー(QTとVLC)で音声の再生に不具合が出ること、mp4作成時に音声のエンコードを 行わず、元のcodecのままmp4を作成すると不具合は出ないことから、ffmpeg内蔵のfaacに何らかのバグか 不具合が含まれていると推測される。 *音飛びしないエンコードの方法 [#k1008da1] 不具合が含まれている可能性が高いffmpeg内蔵のfaacを用いずに、音声のエンコードを別のプログラムを用いてエンコードすることにする。&br; ffmpegを自分でコンパイルする方法も解決策として挙げられるが、ffmpegをコンパイルするまでに他のプログラムをコンパイルする必要があり、それだけでも手間がかかるし、コンパイルの失敗などで別のトラブルが発生しないとも限らないので、ffmpegのコンパイルは見送る。&br; 今回も、最小の労力で問題を解決する事を心がける。 *faacの入手とコンパイル [#l2b42d1a] faacはaacへエンコードするプログラムで、単品でコンパイルできるため、簡単に導入できる。今回はfaacを音声のエンコードに採用する。&br; sourceforgeからfaac-1.28をダウンロードする。[[sourceforge.jp>http://en.sourceforge.jp/projects/sfnet_faac/releases/]]&br; 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を用いたエンコード方法 [#q713c093] 音声はfaacを使用するが、映像はこれまで通りffmpegを使用する。音声と映像で別プログラムでエンコードするため、エンコードの手順はやや増加してしまい、以下の手順でエンコードを実施する。 +元となる動画ファイルから音声を分離する&br; 条件:元動画の音声チャンネルが1の場合 ffmpeg -i 元動画 -y -f wav -vn -acodec pcm_s16le -ar 48000 -map 0.1 音声.wav +分離した音声ファイルからaacファイルを生成する&br; faac -q 100 --no-midside --mpeg-vers 4 -o AACファイル.m4a 音声.wav +元となる動画ファイルから映像をエンコードしつつ、aacファイルを音声としてくっつける(mux)&br; 条件: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 +不要になったファイルを削除する&br; rm -f 音声.wav AACファイル.m4a *自動化への対応 [#o5ee3947] 以前作成したスクリプトを改造し、音声の分離から合成、不要ファイルの削除までを自動実行するスクリプトを作成した。&br; #ref(tsencode2.pl.txt) 拡張子.txtはダウンロード後に削除して使用する。 *まとめ [#zab4a5cc] -ffmpeg内蔵のaacエンコーダは音飛びが発生する事がある。(パッケージやバージョンによる?) -ffmpegとfaacを用いることで、音飛びが発生しないmp4ファイルへのエンコードが可能になる。 -faacでのエンコードは、wavファイルを生成する必要がある。 *参考ページ [#ye32b652] [[ぺちぱーとまとの忘備録>http://fkob.net/blog/2012/02]]&br; *コメント欄 [#kf02d719] #pcomment_nospam(,10,avobe)