2012-06-24 82 views
1

我花了一些時間看ffmpeg庫並設置了一些東西,我打開一個.flv文件。閱讀和解碼和幀,現在我試圖編碼到MP4,但我的數據包最終變空。使用ffmpeg庫編碼失敗

我的代碼如下

int main(){ 

    avformat_open_input(&pFC, "c://wav//test2.flv", NULL, NULL); 

    po = av_find_stream_info(pFC); 

    //ADD LOGIC TO FIND VIDEO STREAM 
    pCodecC = pFC->streams[0]->codec; 

    decoder = avcodec_find_decoder(pCodecC->codec_id); 
    encoder = avcodec_find_encoder(pCodecC->codec_id); 
    po = avcodec_open(pCodecC, decoder); 

    pCodecE = avcodec_alloc_context3(encoder); 
    /* put sample parameters */ 
    pCodecE->bit_rate = 400000; 
    /* resolution must be a multiple of two */ 
    pCodecE->width = 352; 
    pCodecE->height = 288; 
    /* frames per second */ 
    pCodecE->time_base.den = 25; 
    pCodecE->time_base.num = 1; 
    pCodecE->gop_size = 10; /* emit one intra frame every ten frames */ 
    pCodecE->max_b_frames=1; 
    pCodecE->pix_fmt = PIX_FMT_YUV420P; 

    if(pCodecC->codec_id == CODEC_ID_H264) 
     av_opt_set(pCodecE->priv_data, "preset", "slow", 0); 

    po = avcodec_open2(pCodecE, encoder, NULL); 

    AVFrame *pFrame; 
    // Allocate an AVFrame structure 



    // Allocate video frame 
    pFrame=avcodec_alloc_frame(); 
    int frameFinished = 0; 
    int frame = 0; 
    int gotpacket = 0; 

    while(av_read_frame(pFC, &packet) >= 0) 
    { 
     if(packet.stream_index==0) //the video stream is 0 
     { 
      int len = avcodec_decode_video2(pCodecC, pFrame, &frameFinished, &packet); 
      if(frameFinished) 
      { 
       printf("frame # %i", frame); 

       po =avcodec_encode_video2(pCodecE, &spacket, pFrame, &gotpacket); 
       if(gotpacket) 
       { 
        printf("packet recieved"); 
       } 
       frame++; 
      } 
     } 
     av_free_packet(&packet); 
    } 


    printf("encoding done"); 

    return 0; 
} 

基本上一切工作長達

po =avcodec_encode_video2(pCodecE, &spacket, pFrame, &gotpacket); 

&gotpacket返回0,在一個空架。

不知道我在做什麼錯。

回答

0

正如文檔所述。幀可能會在內部緩衝。在這種情況下,您將有gotpacket == 0。當你繼續寫圖像,你會在某些時候有gotpacket != 0

我想你也可以嘗試通過爲幀刷新NULL來刷新編碼器。我沒有嘗試過這個想法。

祝你好運。

0

我發現增加pFrame中的pts(每個編碼之後)可以解決這個問題。

pFrame->pts += av_rescale_q(1, video_st->codec->time_base, video_st->time_base); 

其中video_st是輸出流。