热门标签 | 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不能解码的问题;

 

 


推荐阅读
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 移动端常用单位——rem的使用方法和注意事项
    本文介绍了移动端常用的单位rem的使用方法和注意事项,包括px、%、em、vw、vh等其他常用单位的比较。同时还介绍了如何通过JS获取视口宽度并动态调整rem的值,以适应不同设备的屏幕大小。此外,还提到了rem目前在移动端的主流地位。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
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社区 版权所有