【问题标题】:libavcodec video decoding not workinglibavcodec 视频解码不起作用
【发布时间】:2013-01-16 20:26:54
【问题描述】:

我正在尝试解码使用 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)初始化为其他方法。

请帮我找出解决办法。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 是的,它正在解码帧,因为 got_frame 总是返回 1,但是当我试图在窗口上绘制它时,它总是显示一个扭曲的帧。
    • 你在看什么样的失真?如果可能的话,举个例子。
    • 我在 ffmpeg 论坛中问过同样的问题,链接是 ffmpeg.zeranoe.com/forum/viewtopic.php?f=7&t=949 请看图片。
    • 省去编码和解码的步骤,确保您的转换功能和显示工作正常。没有完整的代码,很难理解什么是不正常的。
    • 编码器工作正常,因为我能够将编码帧写入文件并且可以使用 vlc 播放。但是在解码器代码中,如果我评论 avcodec_decode_video2() 那么帧将获得相同的垃圾值。似乎在分配 avframe 时,框架正在从某个地方获取垃圾数据。
    猜你喜欢
    • 2013-12-09
    • 2015-03-08
    • 2019-01-21
    • 2012-11-12
    • 2019-04-07
    • 2012-11-15
    • 2011-03-30
    • 2020-04-27
    • 1970-01-01
    相关资源
    最近更新 更多