ubuntu 9.10のパッケージででインストールできるffmpegを使ってFLVをMP3にコンバートしようとしてみた記録。
「ffmpeg -i input.flv -acodec mp3 -ar 44100 -ab 192k output.mp3」とかしてみた。
結果的にmp3のコーデックが無いと怒られました。
また、「ffmpeg -i input.flv -acodec copy output.mp3」としてmp3データをそのまま取り出ししてみると
再生時間がぜんぜん違う。1時間の動画データなのに10分程度しかデータが無い…。
なんか変だ。ubuntu 9.10のffmpegパッケージ変だ 。
よくよく調べてみると、ubuntu9.10のffmpegパッケージはライセンスの問題から、多くのコーデックが無効になっている模様。
ここが問題なのかどうかわかんないけどとりあえず。
mediubuntuの物をと思ったがubuntu8.10のころからかffmpeg自体が存在しない模様…。
うげ。ffmpegコンパイルせなあかんのや…。
で、
ffmpegとコーデックをソースからビルドするには – Ubuntu Japanese Wiki
をそのままコンパイル。
今回コンパイルに使用した各ライブラリーのバージョン
- opencore-amr-0.1.2.tar.gz
- liboil-0.3.16.tar.gz
- opencore-amr-0.1.2.tar.gz
- liboil-0.3.16.tar.gz
- openjpeg_v1_2.tar.gz
- dirac-1.0.2.tar.gz
- lame-398-2.tar.gz
- libraw1394-2.0.3.tar.gz
- schroedinger-1.0.7.tar.gz
- faad2-2.7.tar.gz
- libao-0.8.8.tar.gz
- libtheora-1.1.1
- libdc1394-2.1.2
- libtheora-1.1.1.tar.bz2
- libdc1394-2.1.2.tar.gz
- libvorbis-1.2.3.tar.gz
- gsm-1.0.13.tar.gz
- libogg-1.1.4.tar.gz
- xvidcore-1.2.2.tar.gz
- git clone git://git.videolan.org/x264.git
- svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg
./configure –enable-gpl –enable-nonfree –enable-pthreads –disable-debug –disable-ffserver –disable-ffplay –enable-libdirac –enable-libschroedinger –enable-libdc1394 –enable-libfaac –enable-libfaad –enable-libgsm –enable-libmp3lame –enable-libtheora –enable-libvorbis –enable-libx264 –enable-libxvid –enable-zlib –enable-bzlib –enable-libopencore-amrnb –enable-libopencore-amrwb –enable-version3 –enable-avfilter –enable-avfilter-lavf && make && sudo make install
時間はかかりましたが確実に動くものができました。
と、言いたいところですが、flvをmp3に変換途中で
「lame: output buffer too small」とかエラーが出てコンバートできない。
で、同梱ffmpegのlameエンコードの不具合
を参考にffmpeg のconfigure前にlibavcodec/libmp3lame.cを修正。
Index: libavcodec/libmp3lame.c =================================================================== --- libavcodec/libmp3lame.c (リビジョン 16716) +++ libavcodec/libmp3lame.c (作業コピー) @@ -34,6 +34,7 @@ int stereo; uint8_t buffer[BUFFER_SIZE]; int buffer_index; + int buffer_flushed; } Mp3AudioContext; static av_cold int MP3lame_encode_init(AVCodecContext *avctx) @@ -73,6 +74,8 @@ avctx->coded_frame= avcodec_alloc_frame(); avctx->coded_frame->key_frame= 1; + s->buffer_flushed = 0; + return 0; err_close: @@ -166,13 +169,15 @@ BUFFER_SIZE - s->buffer_index ); } - }else{ + }else if(data == NULL && s->buffer_flushed == 0){ lame_result= lame_encode_flush( s->gfp, s->buffer + s->buffer_index, BUFFER_SIZE - s->buffer_index ); - } + s->buffer_flushed = 1; + }else + lame_result = 0; if(lame_result < 0){ if(lame_result==-1) {
コンパイル後確認OK
やっとまともに動くffmpegができたはず…。
ためしに「ffmpeg -i input.flv -acodec copy output.mp」を実行。
おー、直ってるよこれ。結局 ffmpegのソースコードに含まれてるlibmp3lameがバグもちだったことに由来した現象だったと勝手に思い込んでる。
にしても、svnに上がってるffmpegのソースコードいつ直るんだろ?