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

相关文章

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

SpringBoot返回文件让前端下载的几种方式

《SpringBoot返回文件让前端下载的几种方式》文章介绍了开发中文件下载的两种常见解决方案,并详细描述了通过后端进行下载的原理和步骤,包括一次性读取到内存和分块写入响应输出流两种方法,此外,还提供... 目录01 背景02 一次性读取到内存,通过响应输出流输出到前端02 将文件流通过循环写入到响应输出流

SpringBoot项目整合Netty启动失败的常见错误总结

《SpringBoot项目整合Netty启动失败的常见错误总结》本文总结了SpringBoot集成Netty时常见的8类问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、端口冲突问题1. Tomcat与Netty端口冲突二、主线程被阻塞问题1. Netty启动阻

C# WebAPI的几种返回类型方式

《C#WebAPI的几种返回类型方式》本文主要介绍了C#WebAPI的几种返回类型方式,包括直接返回指定类型、返回IActionResult实例和返回ActionResult,文中通过示例代码介绍的... 目录创建 Controller 和 Model 类在 Action 中返回 指定类型在 Action

SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)

《SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)》本文总结了SpringBoot项目整合Kafka启动失败的常见错误,包括Kafka服务器连接问题、序列化配置错误、依赖配置问题、... 目录一、Kafka服务器连接问题1. Kafka服务器无法连接2. 开发环境与生产环境网络不通二、序

Vue3视频播放组件 vue3-video-play使用方式

《Vue3视频播放组件vue3-video-play使用方式》vue3-video-play是Vue3的视频播放组件,基于原生video标签开发,支持MP4和HLS流,提供全局/局部引入方式,可监听... 目录一、安装二、全局引入三、局部引入四、基本使用五、事件监听六、播放 HLS 流七、更多功能总结在 v

Java 中编码与解码的具体实现方法

《Java中编码与解码的具体实现方法》在Java中,字符编码与解码是处理数据的重要组成部分,正确的编码和解码可以确保字符数据在存储、传输、读取时不会出现乱码,本文将详细介绍Java中字符编码与解码的... 目录Java 中编码与解码的实现详解1. 什么是字符编码与解码?1.1 字符编码(Encoding)1

Django HTTPResponse响应体中返回openpyxl生成的文件过程

《DjangoHTTPResponse响应体中返回openpyxl生成的文件过程》Django返回文件流时需通过Content-Disposition头指定编码后的文件名,使用openpyxl的sa... 目录Django返回文件流时使用指定文件名Django HTTPResponse响应体中返回openp

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

SpringBoot整合Dubbo+ZK注册失败的坑及解决

《SpringBoot整合Dubbo+ZK注册失败的坑及解决》使用Dubbo框架时,需在公共pom添加依赖,启动类加@EnableDubbo,实现类用@DubboService替代@Service,配... 目录1.先看下公共的pom(maven创建的pom工程)2.启动类上加@EnableDubbo3.实