avcodec_decode_video 解码失败,got_picture返回0

2024-01-13 01:38

本文主要是介绍avcodec_decode_video 解码失败,got_picture返回0,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

//H264解码器初始化
bool H264DecodeInit(void)
{
        //
        int  numBytes;

        avcodec_init();
        /* register all the codecs */
        avcodec_register_all();

        codecContext= NULL;

        /* find the mpeg1 video decoder */
        codec = avcodec_find_decoder(CODEC_ID_H264);

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

        codecContext= avcodec_alloc_context();

        codecContext->width=800;
        codecContext->height=600;
        codecContext->sample_fmt=SAMPLE_FMT_S16;

        codecContext->pix_fmt=PIX_FMT_YUV420P;

        m_pFrame= avcodec_alloc_frame();

        if (m_pFrame==NULL)
        {
                return false;
        }

        m_pFrameRGB = avcodec_alloc_frame();
        if(m_pFrameRGB == NULL)
        {
                return false;   
        }

        if(codec->capabilities&CODEC_CAP_TRUNCATED)
                codecContext->flags|= CODEC_FLAG_TRUNCATED;                /* we do not send complete frames */

        /* For some codecs, such as msmpeg4 and mpeg4, width and height
                MUST be initialized there because this information is not
        available in the bitstream. */

        /* open it */

        if (avcodec_open(codecContext, codec) < 0) {
                fprintf(stderr, "could not open codec\n");
        }

        numBytes=avpicture_get_size(PIX_FMT_RGB24, 800, 600);
        m_buffer=new uint8_t[numBytes];   

        // Assign appropriate parts of buffer to image planes in pFrameRGB
        avpicture_fill((AVPicture *)m_pFrameRGB, m_buffer, PIX_FMT_RGB24, 800 ,600);

        return true;
}



//H264 解码函数
void H264DecodeProcess(struct buffer_desc desc)
{
       
        int got_picture,len;

        len = avcodec_decode_video(codecContext, m_pFrame, &got_picture,
                (uint8_t *)desc.buffer, desc.valid_len);      //Rtp码流已经解包放在desc.buffer中,buffer的长度为desc.valid_len  调用这个函数got_picture=0;

        if (len != desc.valid_len) {
                printf("decode error\n");
        }
       
        img_convert((AVPicture *)m_pFrameRGB, PIX_FMT_BGR24,(AVPicture*)m_pFrame,codecContext->pix_fmt, codecContext->width,codecContext->height);

        //显示图像
       
        return;
}

如果我将Rtp码流解包后,直接丢给解码模块,实时解码,发现//Rtp码流已经解包放在desc.buffer中,buffer的长度为desc.valid_len  第一次调用avcodec_decode_video

这个函数got_picture=0;第2次调用avcodec_decode_video这个函数就可以得到正确的值,即我的每解码一帧要调用avcodec_decode_video,2次,很诧异,有路过的高手指点下。

我的码流中只有IDR帧和P帧,对Rtp包解码后,对sps和pps,idr,p帧前面都加了00 00 00 01开始标记

这篇关于avcodec_decode_video 解码失败,got_picture返回0的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/599829

相关文章

SpringBoot中使用Flux实现流式返回的方法小结

《SpringBoot中使用Flux实现流式返回的方法小结》文章介绍流式返回(StreamingResponse)在SpringBoot中通过Flux实现,优势包括提升用户体验、降低内存消耗、支持长连... 目录背景流式返回的核心概念与优势1. 提升用户体验2. 降低内存消耗3. 支持长连接与实时通信在Sp

统一返回JsonResult踩坑的记录

《统一返回JsonResult踩坑的记录》:本文主要介绍统一返回JsonResult踩坑的记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录统一返回jsonResult踩坑定义了一个统一返回类在使用时,JsonResult没有get/set方法时响应总结统一返回

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI

Python函数返回多个值的多种方法小结

《Python函数返回多个值的多种方法小结》在Python中,函数通常用于封装一段代码,使其可以重复调用,有时,我们希望一个函数能够返回多个值,Python提供了几种不同的方法来实现这一点,需要的朋友... 目录一、使用元组(Tuple):二、使用列表(list)三、使用字典(Dictionary)四、 使

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

前端下载文件时如何后端返回的文件流一些常见方法

《前端下载文件时如何后端返回的文件流一些常见方法》:本文主要介绍前端下载文件时如何后端返回的文件流一些常见方法,包括使用Blob和URL.createObjectURL创建下载链接,以及处理带有C... 目录1. 使用 Blob 和 URL.createObjectURL 创建下载链接例子:使用 Blob

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定