热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ffmpeg解码出现问题,v1.2.1版本,v2.1版本有问题,v0.6.0版本没有问题

1)当Live555收到的数据中连续来两个I帧,然后P帧,ffmpeg解码有问题;解决办法:当presntationTime不同时候&#

1)当Live555收到的数据中连续来两个I帧,然后P帧,ffmpeg解码有问题;

解决办法:

      当presntationTime不同时候,将以前存的buffer(已经是完整一帧)传给avcodec_decode_video2解码; 根据时间戳组帧将sps pps I 帧 I帧的组成一帧,交个ffmpeg解码,搞定;

 

2) 通过live555将阿波罗的相机的h264码流录制成avi,然后通过ffmpeg转成.h264,在用live555的testDemandRtspServer例子做服务器,然后通过testRtspClient做客户端进行接收,实时解码,发现前面一个GOP的数据解码不出来;前面一个GOP也是有sps pps I帧,然后若干P帧的,但是过了一个GOP后,解码就正常了。诧异!

avcodec_decode_video2返回值=-1;got_picture=0;

错误如下:

 

第一个Gop的第一个I帧 的sps,pps,I帧 的包是分别丢给解码器的,ffmpeg提示错误是no frame!

 

后面接着的一个P帧,就解码不出来,提示错误Missing reference picture. default is 0

 

第2个P帧开始的P帧提示错误:non-existing PPS 0 referenced.

 

调试记录:

1)根据时间戳不同组包,交给ffmpeg,也是前面一个Gop解码不出来;

2)后面尝试第一次从SDP从获取sps和pps信息,即第一帧数据是sps pps sps pps I帧,然后是若干个P帧,接着sps pps I帧,这样也是第一个GOP不能解码;

3)将第一帧的I帧反复交给ffmpeg,是可以解码的;

 

 

解决方案:

1)原因ffmpeg v1.2.1 版本,换成老的ffmpeg V0.6.0解决;

为什么会有问题,还需要分析ffmpeg v1.2.1版本的源码,是不是它需要缓冲多少帧,造成前面的一个GOP的图像解码不出来。

继续定位发现:v1.2.1 版本的第一个I帧解码 avcodec_decode_video2返回值为一帧数据的size,但是

len = avcodec_decode_video2(DecodecContext, m_pFrame, &got_picture,&avpkt);

gop_picture的值=0;

 

 

环境搭建:

1)  live555 做服务器;客户端使用live555接收数据流;然后将接收到的数据帧插入到一个队列;另外一个显示线程从队列中取一帧数据进行解码,显示;

2)  从2个队列做缓冲区,首先是一个空的队列,在上面分配内存,形成一个链表;收到一帧数据后,从链表的头取一个节点,将一帧数据拷贝到该个节点上,然后插入到另外一个H264数据帧队列,一定要记得到H264数据帧队列的尾部;

3)  显示线程从H264队列的头取一个节点(一定要从头开始取节点);然后解码显示;

 

 

出现过的问题:

1)  插入H264队列时,插入到队列的头,取H264帧的时候也从头开始取,这样造成后来的数据显取了,解码出错;

 

现象:

Live555 sink 的afterGettingFrame函数中进行数据组帧,入队列操作,由于live555已经将rtp包头丢掉了,得到的一帧的数据,有可能有4种包,sps pps I 帧,p帧;

 

组帧策略:

按时间组帧,首先将时间戳相同的数据包组成一帧,然后插入到队列;

直接在数据到帧前加00 00 00 01 头后,插入到队列;

 

 

结论:

两种方法,ffmpeg都可以解码;使用的是ffmpeg 1.2.1 的版本;但是前面有一个GOP不能解码,原因不详;换成v0.6.0版本的ffmpeg库进行测试;解码正常!

有谁知道是什么原因的,麻烦告诉我下,谢谢!

 

今天又下载了一个最新的版本V2.1进行测试,还是发现前面一个GOP的图像解码失败,难道要用回老的版本v0.6.0

 

问题搞定:

      是初始化解码器的分辨率和实际图像的分辨率不一致的问题;本来解码器是讲H264数据解码成Yuv数据的,但是我将yuv数据转换到RGB了,给RGB分配了内存,在解码器初始化函数里面:


#ifdef OUTPUT_RGB

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

 int numBytes=avpicture_get_size(PIX_FMT_RGB24, DecodecContext->width, DecodecContext->height);
 m_Rgbbuffer=new uint8_t[numBytes];   

 // Assign appropriate parts of buffer to image planes in pFrameRGB
 avpicture_fill((AVPicture *)m_pFrameRGB, m_Rgbbuffer, PIX_FMT_RGB24, DecodecContext->width, DecodecContext->height);

 img_convert_ctx = sws_getContext(DecodecContext->width, DecodecContext->height, DecodecContext->pix_fmt,
  DecodecContext->width, DecodecContext->height, PIX_FMT_BGR24, SWS_BICUBIC, NULL, NULL, NULL);

 if(img_convert_ctx == NULL)
 {
  fprintf(stderr, "Cannot initialize the conversion context!\n");
  return false;
 }

 iDecodeWidth=DecodecContext->width;
 iDecodeHeight=DecodecContext->height;

#endif

 

实际上,如果不转RGB是跟分辨率没有关系的,转RGB后分配的内存和分辨率有关系,所以在解码后,判断分辨率和我设置的分辨率不一致时,有调用了反解码器函数,释放ffmpeg的资源,然后在重新调用解码器初始化函数,这样就出现了前面一个GOP不能解码的问题;

 

 


推荐阅读
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 本文介绍了使用数据库管理员用户执行onstat -l命令来监控GBase8s数据库的物理日志和逻辑日志的使用情况,并强调了对已使用的逻辑日志是否及时备份的重要性。同时提供了监控方法和注意事项。 ... [详细]
author-avatar
729453686_5be5b9
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有