2013-05-13 110 views
0

我使用FFmpeg SDK以編程方式將視頻轉換爲mp3。使用FFmpeg SDK將.flv轉換爲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);  
} 

解碼音頻從輸入視頻文件的正常工作。

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); 
    }  
} 

我得到以下控制檯輸出:當我嘗試編碼MP3幀中出現的問題

[libmp3lame] inadequate AVFrame plane padding 

唯一與FLV的文件發生,代碼工作正常.mp4文件。任何線索錯誤信息的含義?

由於

回答

0

包含錯誤消息的源代碼是在這裏:http://ffmpeg.org/doxygen/trunk/libmp3lame_8c-source.html。相關知情人士表示:作爲

#define FFALIGN (x,a)(((x)+(a)-1)&~((a)-1)) 
+0

謝謝

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定義。這是否意味着.flv的解碼器會產生無法用libmp3lame編碼的音頻樣本?我是否需要先解碼爲另一種格式? – cpa9000 2013-05-13 18:19:06

+0

'這是否意味着.flv的解碼器會產生無法用libmp3lame編碼的音頻樣本?' - 似乎很明顯,.flv解碼器不能滿足這種特殊期望。 「我需要先解碼到另一種格式嗎?」 - 這可能會奏效。 – 2013-05-13 18:23:13