iOS VideoToolBox decoder解码失败(-12909和-12911)问题解决
对于任何H.264解码器而言,都要将SPS和PPS信息传递给解码器。FFmpeg内部做了设置,所以没有显示设置。但是对于硬件解码器来讲,开发者必须手动设置。另外,使用FFmpeg解码出来的视频帧是以YUV格式存储于内存中的,但是对于硬件解码器来讲,一般都是直接解码到显存,便于后续的处理与渲染。H.264有两种封装格式,一种是Annexb封装,另外一种是mp4(AVCC)封装。输入数据给解码器时需要特定的格式。VTB decoder要求的是mp4(AVCC)格式的输入,而MediaCodec要求的是Annexb格式的输入。但是FFmpeg解封装出来的AVPacket通常是AVCC格式的。
最近被拉去解决一个iOS VTB解码失败的问题,现象是省流模式下DecodeFrame时返回-12911,callback里返回-12909,标清以上没有这个问题。
问题分析:
1. 视频源有没有问题?省流模式下H.264的profile是baseline,是否跟这个有关系?
iOS系统播放器播放正常,所以跟baseline无关;PC VLC播放正常,所以视频源没有什么问题。
2. 是否是SPS/PPS等参数设置有问题?
仔细查看SPS/PPS设置的字节数和内容,其中H.264的extradata的格式有做转换,但是仔细分析,确实没有问题。另外如果有问题,标清模式以上应该也有这个问题。
3. 传入的数据包有无区别?
最开始分析的是省流和标清模式传递的数据包有无区别,仔细分析后,发现一切正常,传入的字节数跟具体内容都是正确的。
网上搜索-12909和-12911提示的都是传入的数据包有误,但是分析下来,确实没发现什么问题。这时候只能对比其他开源软件的做法了。编译了ijkplayer的demo,传入省流的url,断点分析其VTB代码逻辑。这里主要是因为VTB有几套API,我们的程序跟ijkplayer用的API还不完全一致,一开始以为是API调用错误导致的,后来对其API后,问题还是没有解决。然后接着分析了SPS/PPS传递逻辑和传递的第一个数据包,注意,一定要是第一个AVPacket,才能排除其他外界因素的干扰。
问题定位:
对比ijkplayer,我们送入的第一个AVPacket要比ijkplayer多了十几个字节,这十几个字节实际上存储了MPEG格式的streamID。但是ijkplayer调用了av_packet_split_side_data将读取到的pkt的最后的side_data去除了,而我们的程序没有去除side_data。去除side_data后,首帧解码成功,问题解决。
思考:
这个问题的诡异就在于同样的程序标清以上解码是ok的,省流解码就有问题,导致一开始查问题的思路偏了,猜测这应该与VTB的内部实现有关。另外一点就是问题总是能解决的,不仅仅是不断试错,还需要不断克服一次次试错时的沮丧心理。
iOS VideoToolBox decoder解码失败(-12909和-12911)问题解决的更多相关文章
- H.264格式,iOS硬编解码 以及 iOS 11对HEVC硬编解码的支持
H.264格式,iOS硬编解码 以及 iOS 11对HEVC硬编解码的支持 1,H.264格式 网络表示层NAL,如图H.264流由一帧一帧的NALU组成: SPS:序列参数集,作用于一系列连续的编码 ...
- iOS VideoToolbox硬编H.265(HEVC)H.264(AVC):2 H264数据写入文件
本文档为iOS VideoToolbox硬编H.265(HEVC)H.264(AVC):1 概述续篇,主要描述: CMSampleBufferRef读取实际数据 序列参数集(Sequence Para ...
- iOS VideoToolbox硬编H.265(HEVC)H.264(AVC):1 概述
本文档尝试用Video Toolbox进行H.265(HEVC)硬件编码,视频源为iPhone后置摄像头.去年做完硬解H.264,没做编码,技能上感觉有些缺失.正好刚才发现CMFormatDescri ...
- 遇到一个json解码失败的问题
今日批量导入游戏, 从别人接口拉去的字符串json_decode总是失败, 但是把log里面记录的解码失败的字符串copy出来单独解析,却可以成功. 排除了是字符编码的问题后, 还是不行, 百思不得其 ...
- (原)从mp4,flv文件中解析出h264和aac,送解码器解码失败
转载请注明出处:http://www.cnblogs.com/lihaiping/p/5285166.html 今天在做本地文件解码测试,发现从mp4,flv文件中读出来的帧数据,h264和aac帧直 ...
- ios Base64编解码工具类及使用
为了避免明码传递http内容,可以用base64编码后传输,收到方再解码,也方便了2进制数据的字符串式传输. 对于ios来说,google给提供了一个很好的工具类,方便进行base64编解码,当然也可 ...
- iOS网络模块优化(失败重发、缓存请求有网发送)
iOS开发中,一般都是通过AFN搭建一个简易的网络模块来进行与服务器的通信,这一模块要优化好没那么简单,需要花费很多时间与精力,仅仅根据这几年来的填坑经验,总结下这一块的需要注意的地方,也是给自己梳理 ...
- burp suite 之 Decoder(解码) Comparer(比较器) Extender(扩展)
Decoder模块 将原始数据转换成各种编码和哈希表的简单工具,它能够智能地识别多种编码格式 Decoder as..解码 Encode as...编码 Hash : 哈希值计算 Smart deco ...
- 小程序https Android 安卓可以发request请求,IOS 苹果 发请求失败问题
如果一个机器可以发送成功,一个机器发送失败,那多半是是域名的https支持的问题 那就用腾讯云的这个ssl测试工具检测下 https://www.qcloud.com/product/ssl#user ...
随机推荐
- VMware虚拟机安装黑苹果MacOS Mojave系统详细教程
更多资源请百度搜索:前端资源网 欢迎关注我的博客:www.w3h5.com 最近遇到一个H5页面的 iPhone X 刘海兼容问题.查到一个 XCode 编辑器,可以模拟 iPhone X 环境运行. ...
- 3.1 - Apps or metadata that mentions the name of any other mobile platform will be rejected
3.1 - Apps or metadata that mentions the name of any other mobile platform will be rejected3.1 Detai ...
- PeopleSoft面试题...
Q1:PS发出的邮件附件名字中中文字符乱码在哪设置? A1: 分为APP和PROCESS两个配置文件,分别在psprcs.cfg 和 psappsrv.cfg 中 SMTP Settings设置. 评 ...
- chrome浏览器使用chrome://inspect调试app 网页,打开空白的问题
使用chrome浏览器,输入chrome://inspect可以调试android app里面的网页,如果inspect的时候,是空白, 问题截图: 那就在C:\Windows\System32\dr ...
- windows下react-native android环境搭建注意事项
1.使用了genymotion建立模拟器(新增时模拟器时记得选网络,如下图) 与android stuido搭配使用教程:http://jingyan.baidu.com/article/915fc4 ...
- CSS 小结笔记之图标字体(IconFont)
本篇主要介绍一种非常好用的图标大法——图标字体(IconFont). 什么是图标字体?顾名思义,它是一种字体,只不过这个字体显示的并不是具体的文字之类的,而是各种图标. 网站上经常会用到各种图标,之前 ...
- 互联网,IT,大数据,机器学习,AI知识tag云
互联网基础: tcp/ip网络,linux运维,DNS,ipv6 web前端: javascript, es6, 组件化开发, vuejs, angularjs, react html5, css3, ...
- Oracle EBS 自治事务
自治事务程序主要是自主性,那就是,独立于主要的事务.之所以独立,或者提交之后会影响其他事务处理,本质在于它本身符合编译指令的规则,也就是说它属于在编译阶段就执行的指令,而不是在运行阶段执行的. 当自治 ...
- poj_3253 Fence Repair
Fence Repair Description Farmer John wants to repair a small length of the fence around the pasture. ...
- SQL Server Management Studio记住的密码丢失的问题
不知道各位经常使用SSMS的时候有没有碰到过这样的烦恼: 记住的密码总是丢失: 步骤如下: 登陆时,选择记住密码 在任何一个存储过程上点击右键,选择修改 这时候再次连接对象资源管理器时,刚刚记住的密码 ...