2012-12-31 33 views
1

我们知道,一个AVPacket包含一个AVFrame,我们可以使用ffmpeg - avcodec_decode_video2如何工作?

int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame, 
          int *got_frame_ptr, const AVPacket *avpkt) 

解码包帧,如果它的工作原理,got_frame_ptr将与非零设置,否则,它是零。

int len = avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet); 
if (len < 0) 
{ 
    fprintf(stderr, "Problems decoding frame\n"); 
    return 1; 
} 

fprintf(stderr, "len = %d\n", len); 

// Did we get a video frame? 
if(frameFinished) { 
    dosomething(); 
} 

它将如何失败(got_frame_ptr为0)? AVPacket我们受到了损坏或其他什么?

回答

2

有2倍主要的原因(除了误差)

  1. 当前帧是将来P帧,因此该cannont被retured(显示)现在。在序列中出现B帧的情况下会发生这种情况。

  2. 当前数据包不是一个完整的可解码帧。

+0

使用多线程解码时也会发生延迟。关于B帧,它们的存在并不是必需的:对于h264流来说,在avcodec_decode_video2()中声明“max b-frames = 3”导致3帧延迟就足够了 –