libavcodec视频解码无法正常工作

时间:2013-02-01 13:50:31

标签: c++ ffmpeg h.264 video-processing libavcodec

我正在尝试解码用H264编码的视频。我正在将AVPacket的数据及其大小发送给解码器代码。在那里我试图解码框架并将其显示在GUI上。问题是当我解码帧时,它返回相同数量的帧字节,因为数据包的大小意味着它没有解压缩数据。任何人都可以告诉问题是什么。我的编码程序工作正常。

这里是编码的代码

  static struct SwsContext *img_convert_ctx;
  pkt.data = NULL;   
  pkt.size = 0; 


  avpicture_fill((AVPicture *)srcFrame, frame,AV_PIX_FMT_BGR24, 640, 480);
 if(img_convert_ctx == NULL) {
  int w = 640;
  int h = 480;
  img_convert_ctx = sws_getContext(w, h, 
      AV_PIX_FMT_BGR24, c->width, c->height, PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL);
   if(img_convert_ctx == NULL) {
    fprintf(stderr, "Cannot initialize the conversion context!\n");
  }
}
  sws_scale(img_convert_ctx, srcFrame->data, srcFrame->linesize, 0,480,picture->data, picture->linesize);


  fflush(stdout);

  picture->pts=counter;


  ret = avcodec_encode_video2(c, &pkt, picture, &got_output);
    if (ret < 0) {
        fprintf(stderr, "Error encoding frame\n");
    }

    if (got_output) {

        vdec.decode_frame(pkt.data ,pkt.size);

        av_free_packet(&pkt);
    }

解码器代码......

    int len ,got_frame;

avpkt.size = data_length;

avpkt.data = frame_buffer;

if(!frame_buffer){

return "frame buffer empty\n";

}

len = avcodec_decode_video2(avctx ,frame ,&got_frame ,&avpkt);

if( len < 0){

    return "error while decoding\n";

}

if( got_frame ){

static struct SwsContext *img_convert_ctx;  

 if(img_convert_ctx == NULL) {

  img_convert_ctx = sws_getContext(w, h, 
      PIX_FMT_YUV420P, avctx->width,
      avctx->height, PIX_FMT_BGR24, 
      SWS_BICUBIC, NULL, NULL, NULL);

   if(img_convert_ctx == NULL) {

    return  "Cannot initialize the conversion context!\n";

  }

}

j=sws_scale(img_convert_ctx, 
    frame->data , frame->linesize ,
    0, h ,picture->data,
    picture->linesize );

if(j==0){

exit(1);

}

我正在将所有其他代码(如AVCodecContext和Codec)初始化为其他方法。

请帮我找到解决方案。

1 个答案:

答案 0 :(得分:0)

avcodec_decode_video2函数应该返回处理的字节数,而不是结果图片的字节数。您只需检查got_frame的值,即可在解码完整帧时查找。