2010-12-20 14 views
4

私はffmpegには新しく、api-example.cを使ってwmaファイルをデコードしようとしました。しかし、プログラムを実行すると、エラーメッセージが表示されました。ffmpegでWmaをデコードする

"frame_len overflow"誰もがこのエラーを修正する方法を知っていますか?

extern "C" { 
#include <avcodec.h> 
#include "../libavcodec/avcodec.h" 
#include <avformat.h> 
} 

#include <iostream> 
#include <assert.h> 
#include <windows.h> 
#include <mmsystem.h> 
#define INBUF_SIZE 4096 
#define AUDIO_INBUF_SIZE 20480 
#define AUDIO_REFILL_THRESH 4096 

int main(int argc, char *argv[]) { 
    avcodec_init(); 
    avcodec_register_all(); 
    //avdevice_register_all(); 
    av_register_all(); 

    AVCodec *codec; 
    AVCodecContext *c= NULL; 

    AVCodec *ocodec; 
    AVCodecContext *oc= NULL; 

    int out_size, len,out_size2; 
    FILE *f, *outfile; 
    uint8_t *outbuf; 
    uint8_t inbuf[AUDIO_INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE]; 

    AVPacket avpkt; 
    char* outfilename="test.wma"; 
    char* filename="Beethoven's.wma"; 
    AVFormatContext *pFormatCtx; 

    WAVEFORMATEX* wfx=new WAVEFORMATEX; 

    int ret; 
    ret=av_open_input_file(&pFormatCtx, filename, NULL, 0, NULL); 

    if(ret!=0) 
    { 
     std::cout<<"cannot open file!"<<std::endl; 
     exit(1); 
    } 

    if(av_find_stream_info(pFormatCtx)<0) 
    { 
     std::cout<<"cannot find stream!"<<std::endl; 
     exit(1); 
    } 

    int audioStream; 
    AVCodecContext *pCodecCtx; 
    // Find the first video stream 
    audioStream=-1; 
    for(int i=0; i<pFormatCtx->nb_streams; i++) 
     if(pFormatCtx->streams[i]->codec->codec_type==CODEC_TYPE_AUDIO) 
     { 
      audioStream=i; 
      break; 
     } 
    if(audioStream==-1) 
    { 
     std::cout<<"cannot find audio!"<<std::endl; 
    } 

    // Get a pointer to the codec context for the audio stream 
    pCodecCtx=pFormatCtx->streams[audioStream]->codec; 
    av_init_packet(&avpkt); 

    printf("Audio decoding\n"); 

    /* find the suitable audio decoder */ 
    codec = avcodec_find_decoder(pCodecCtx->codec_id); 

    if (!codec) { 
     fprintf(stderr, "codec not found\n"); 
     exit(1); 
    } 

    if(codec->capabilities & CODEC_CAP_TRUNCATED) 
     pCodecCtx->flags|=CODEC_FLAG_TRUNCATED; 

    //open the codec (for decoding) 
    int test = avcodec_open(pCodecCtx, codec); 
    if (test < 0) { 
     fprintf(stderr, "could not open codec\n"); 
     exit(1); 
    } 

    //find mp3 encoder 
    ocodec = avcodec_find_encoder(CODEC_ID_MP3); 
    if (!ocodec) { 
     fprintf(stderr, "codec not found\n"); 
     exit(1); 
    } 

    //allocate context 
    oc= avcodec_alloc_context(); 
    /* put sample parameters */ 
    oc->bit_rate = 64000; 
    oc->sample_rate = 44100; 
    oc->channels = 1; 
    /* open it */ 
    if (avcodec_open(oc, ocodec) < 0) { 
     fprintf(stderr, "could not open encoding codec\n"); 
     exit(1); 
    } 

    //buffer 
    outbuf = (uint8_t*)malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE); 

    //open inputfile 
    f = fopen(filename, "rb"); 
    if (!f) { 
     fprintf(stderr, "could not open %s\n", filename); 
     exit(1); 
    } 

    //open outputfile 
    outfile = fopen(outfilename, "wb"); 

    if (!outfile) { 
     av_free(c); 
     exit(1); 
    } 

    /* decode until eof */ 
    avpkt.data = inbuf; 
    avpkt.size = fread(inbuf, 1, AUDIO_INBUF_SIZE, f); 

    //while there is still data 
    while (avpkt.size > 0) { 
     std::cout<<"decoding..."<<std::endl; 
     out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE; 
     //decode 
     len = avcodec_decode_audio3(pCodecCtx, (short *)outbuf, &out_size, &avpkt); 

     if (len < 0) { 
      fprintf(stderr, "Error while decoding\n"); 
      exit(1); 
     } 

     if (out_size > 0) { 
      /* if a frame has been decoded, output it */ 
      std::cout<<"1 frame decoded!"<<std::endl; 
      out_size2 = avcodec_encode_audio(oc, outbuf, out_size, (short*)outbuf); 
      fwrite(outbuf, 1, out_size2, outfile); 
     } 

     //subtract data from whatever decode function returns 

     avpkt.size -= len; 

     avpkt.data += len; 

     if (avpkt.size < AUDIO_REFILL_THRESH) { 

      /* Refill the input buffer, to avoid trying to decode 

      * incomplete frames. Instead of this, one could also use 

      * a parser, or use a proper container format through 

      * libavformat. */ 

      memmove(inbuf, avpkt.data, avpkt.size); 

      avpkt.data = inbuf; 

      len = fread(avpkt.data + avpkt.size, 1, 

         AUDIO_INBUF_SIZE - avpkt.size, f); 

      if (len > 0) 

       avpkt.size += len; 

     } 



    } 

    fclose(outfile); 

    fclose(f); 

    free(outbuf); 

    avcodec_close(c); 

    av_free(c); 



} 

私はかなり長い間、この上で立ち往生されています:

は、ここに私のコードです。私を助けてください。 誰も私のコードで何が間違っているのか知っていますか?

おかげで、

Izak

+0

適切なインデントと空白を使用して、読みやすいようにしてください... "frame_len overflow"はどこで取得できますか? – ronag

+0

プログラムを実行すると、 "frame_len overflow"というエラーが返されます。 – Izak

+0

主にWMAをデコードするか、ffmpegの使用方法を習得しますか? WMAの場合、Windows上で実行している場合、ffmpegに代わる素晴らしい方法があります。 –

答えて

0

使用デバッグメッセージを障害点を決定します。 私は、同じバッファとそれぞれのバッファサイズを使用しているため、エンコーディング中にこのエラーが発生するとの強い意見があります。

関連する問題