0

FFmpeg SDK を使用して、プログラムで動画を mp3 に変換しています。

この方法でビデオのオーディオ フレームを読み取ります。

while(av_read_frame(pFromCtx, &pkt) >= 0) 
{
    if(pkt.stream_index == audioStreamIndex) 
    {        
        avcodec_get_frame_defaults(frame);
        got_frame = 0;              
        ret = avcodec_decode_audio4(pCodecCtx, frame, &got_frame, &pkt);                
        if (ret < 0) {
            av_log(NULL, AV_LOG_ERROR, "Error decoding audio frame.\n");            
            continue;
        }

        if(got_frame) 
        {                    
          // Write the decoded audio frame           
          write_audio_frame(pToCtx, pToCtx->streams[pToCtx->nb_streams-1], frame);                    
        }                        
    }
    av_free_packet(&pkt);     
}

入力ビデオ ファイルからのオーディオのデコードは正常に機能します。この問題は、mp3 フレームをエンコードしようとすると発生します。

static void write_audio_frame(AVFormatContext *oc, AVStream *st, AVFrame *frame)
{
  AVCodecContext *enc = st->codec;
  AVPacket pkt;
  int got_packet = 0; 
  int ret = 0; 
  av_init_packet(&pkt);
  pkt.data = NULL; 
  pkt.size = 0; 

  ret = avcodec_encode_audio2(enc, &pkt, frame, &got_packet);

  if (ret < 0) {
      // PROBLEM    
      fprintf(stderr, "Error encoding audio frame. \n");
      exit(1);
  }     
}

次のコンソール出力が得られます。

[libmp3lame] inadequate AVFrame plane padding

これは .flv ファイルでのみ発生し、コードは .mp4 ファイルで正常に動作します。エラーメッセージが何を意味するのか手がかりはありますか?

ありがとう

4

1 に答える 1

0

エラー メッセージを含むソース コードは次のとおりです: http://ffmpeg.org/doxygen/trunk/libmp3lame_8c-source.html。関連する情報源は次のように述べています。

if (frame->linesize[0] < 4 * FFALIGN(frame->nb_samples, 8)) {
    av_log(avctx, AV_LOG_ERROR, "inadequate AVFrame plane padding\n");
    return AVERROR(EINVAL);
}

FFALIGN は次のように定義されます。

#define FFALIGN (x,a)(((x)+(a)-1)&~((a)-1))
于 2013-05-13T17:56:38.247 に答える