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 ...
随机推荐
- 【代码笔记】iOS-在导航栏中显示等待对话框
一,效果图. 二,代码. ViewController.m #import "ViewController.h" @interface ViewController () @end ...
- phpstudy集成下Apache配置部署https安全证书
一..先申请到安全证书.(腾讯云或者阿里云申请免费1年的安全证书),怎么申请这里也说下(以腾讯云为例): 1.登录腾讯云QQ或微信登录都行,第一次登录要通过实名认证,点击[产品]---[ss证书l] ...
- Component Interface相关面试题
下面的列表中的问题很常见,Component Interface是很重要的.你知道基本知识比知道答案更重要. Q:以下陈述是错误的. A:一个Component Interface 可以map多个Pe ...
- 转型、自助、移动—BI市场的应用盘点
近几年是数据应用快速增长而又动荡的一年.由于投资热带来的一波2B产业高潮,围绕数据业务的产品层出不穷,无论是通用型的可视化工具,还是带有业务属性的分析产品. 商业智能BI作为一个曾经先于大数据的企业数 ...
- AOP编程 - 淘宝京东网络处理
现象描述 当我们打开京东 app 进入首页,如果当前是没有网络的状态,里面的按钮点击是没有反应的.只有当我们打开网络的情况下,点击按钮才能跳转页面,按照我们一般人写代码的逻辑应该是这个样子: /** ...
- unityShader CGINCLUDE关键字
unityshader中经常见到CGPROGRAM,除此之外还有一个CGINCLUDE关键字. 二个关键字都是用ENDCG来结束,但是用法完全不一样. CGINCLUDE和ENDCG内可以插入一些sh ...
- CSS样式----CSS样式表的继承性和层叠性(图文详解)
本文最初于2017-07-29发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 本文重点 CSS的继承性 CSS的层叠性 计算权重 ...
- 试试SQLServer 2014的内存优化表(转载)
SQL Server2014存储引擎:行存储引擎,列存储引擎,内存引擎 SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度. 现在,存储引擎已整合进当前的数据 ...
- kettle性能优化
普通开发电脑,如果没有网络查询步骤,kettle正常的速度应该在3000~20000条/秒.如果速度在2000条/秒一下,就可能需要调优. 性能优化的方式包括如下几种: 1.通过改变开始复制的数量(针 ...
- How HashMap works in java 2
https://www.javacodegeeks.com/2014/03/how-hashmap-works-in-java.html Most common interview questio ...