*同梱ffmpegのlameエンコードの不具合 [#s142a025]

** このページは一時的なものです [#m6123016]

このページは一利用者が Craving Explorer 内蔵の ffmpeg について作者さんへ
とある提案をするために一時的に作成したものです。
あくまで暫定的なもので今後削除・凍結等される可能性もあります。
また、ここに質問やこのページで書いている内容に関係しない不具合報告をしても
スルーされる可能性が高いです。
一般的な質問・不具合報告・提案等はここではない然るべき場所へ書いてください。

- 正式リリース版に関しては [[サポート掲示板:http://www.crav-ing.com/bbs.html]] へ
- テストリリース版に関しては、この Wiki 内の [[最新テストリリース:http://wiki.crav-ing.com/index.php?%E3%83%86%E3%82%B9%E3%83%88%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%201.0.0%20RC%202b]] のページへ


** 同梱ffmpegのlameエンコードの不具合 [#fd98bb4e]

現行の ffmpeg に lame 3.98-2 をリンクして -acodec libmp3lame で音声をエンコードすると

+ 音声ストリームの終端で
[libmp3lame @ 0x15641f0]lame: output buffer too small (buffer index: 8064, free bytes: 576)
というバッファ不足のエラーが出る
というようなバッファ不足のエラーが出る
+ 上記のエラーリターンのため以下の svn コミット
=======================================================================
r16538 | michael | 2009-01-12 01:15:34 +0900 (月, 12 1 2009) | 2 lines
Check the return of audio and video encoders.
=======================================================================
より後のビルドだと音声のエンコードが正常に完了しない
+ 同一音声ソースをエンコードした場合でも、指定した音声ビットレートによってエンコードされた mp3 のフレーム数が異なる
具体的には指定ビットレートが低いほど、フレーム数が水増しされて再生時間が微妙に長くなっていく

という状況になります。
自分で svn 最新版をビルドしたものと、CE 内蔵の ffmpeg の両方で確認しているので多分 ffmpeg 側の不具合と思われます
(CE 内蔵のは r16538 以前なのでエンコード自体は完了して正常に再生できるファイルになりますが、1と3の問題は発生します)。
自分で svn 最新版をビルドしたものと、CE 1.0.0 RC2 以降に同梱の ffmpeg の両方で確認しているので多分 ffmpeg 側の不具合と思われます
(CE 内蔵のは r16538 以前なのでエンコード自体は完了して再生できるファイルにはなりますが、1と3の現象は発生しています)。

とりあえず応急処置的に以下の修正を libavcodec/libmp3lame.c に加えたところ問題が出なくなったようなので、
もし今回新しくテストリリース用にビルドした ffmpeg で同じ問題が起きているようなら試してみていただけませんでしょうか。

 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) {

よろしくお願いします。

トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS