iOS视频硬解码优化方案

一:编码的理论基础

  H.264的基本流(elementary stream,ES)分为两层,视频编码层(VCL):负责高效的视频内容的表示。网络适配层(NAL):负责以网络所要求的恰当的方式对数据进行打包和传送。

  H.264基本流由一系列的NALU(Network Abstraction Layer Unit)组成,其中NALU的数据量各不相同。每个NALU之前都有一个起始码(Start Code):0x000001(3字节)或 0x00000001 (4字节),起始码用来表示NALU的起始位和终止位。
注:其中0x000001(3字节)的Start Code 只用于一个场合,即一个完整的帧被编为多个slice(片)的时候,包含这些slice的NALU使用这种3个字节的起始码。

NALU单元由NALU头(NALU Header)和若干个字节的载荷数据(RBSP)组成。
RBSP序列:SPS | SEI | PPS | I帧 |图像界定符 | P帧 | P帧
即:NALU单元 = NALU Header + PBSP
而:NALU Header = 禁止位(forbidden_bit,1bit)+ 优先级(nal_reference_bit,2bits,优先级越大越重要)+ NALU类型(NAL_Unit_type,5bits)

例:00 00 00 01 67
  其中 00 00 00 01:是起始码。 将十六进制的67转为二进制:01100111,其中0,为禁止位;11,优先级;00111,NALU类型,转化为十进制等于7,(sps,序列参数集)

例:00 00 00 01 68
  其中 00 00 00 01:是起始码。 将十六进制的68转为二进制:01101000,其中0,为禁止位;11,优先级;01000,NALU类型,转化为十进制等于8,(pps,图像参数集)

例:00 00 00 01 65
  其中 00 00 00 01:是起始码。 将十六进制的65转为二进制:01100101,其中0,为禁止位;11,优先级;00101,NALU类型,转化为十进制等于5,(IDR图像中的片,即I帧)

以上3种类型,是正常需要输入解码器的码流类型。

【注:以上内容是解码基础,百度都可以轻松找到。但是记录笔记本上的时候,没有特定看哪篇博客,看了很多,也就不贴上链接了。以下内容,纯原创,转载请注明出处,谢谢。】

二:现阶段优化的问题

  1. 较差网络环境下,较长时间播放视频,视频的播放时间和实际时间相比,变慢问题。
    答:产生的原因:因为网络环境较差,来包速度较慢,所以如果按照正常速度播放,播放的显示时间会 比实际播放时间慢。
原方案:
未处理。

改进方案:
①判断来包中的pts,若设第一次来的包中的pts1,此时记住当时的实际时间time1。
②当后面再来包的pts2,pts3......可求得pts2-pts1+time1,则可得第二个也就是pts2的理论应该播放的正确时间correctPlayTime。                        
③用这个时间去和当前获取这个时间的实际时间time2比较,如果我们设置容错差值为3s,那么我们就可以  correctPlayTime - time2  >  3,则表示播放速度快于当前时间,等待播放(注:理论不会快于,这里就要做一个防止抖动处理);如果该值小于 -3,则加速播放。加速播放,通过丢弃当前的两个I帧之间的所有的p帧实现。
注:录像回放播放,要区别处理,不需要加速丢帧播放。
  1. 对于ps码流,ps头的处理的优化。
    答:产生原因:在一个完整帧后面跟着00 00这种情况,下个帧判断就会出现问题,可能会丢弃。
原方案:
①之前只是在来的数据上直接改动,将拿到的数据直接去掉ps头,若拿到的是一个完整的帧或者多个完整的帧,都会去掉相应的ps头,并输入解码器。
②但是,如果在最后一帧并不是一个完整的一帧则,直接丢弃。一般来的数据,都不会是完全完整的包,所以这样导致了,会有绿屏的出现。

改进方案:
①将来的数据出入到ps处理器中进行去头操作,来一段可能是多个包,一直处理到该段完整的最后一个包结束,将这段数据回调回来,在进行类型判断,如果类型为5,7,8,输入到解码器中。
②但是刚才的没有下一个startCode的不完整的包的剩余部分以及读到的位置和剩余长度也同样回调回来,和新来的数据进行拼接,拼接好的数据再次输入到ps处理器中,如此循环以复。
  1. 对于p2p方式连接的RTSP码流的处理。
    答:产生原因:之前RTSP来的码流没有pts这个参数。未能做播放慢于当前时间的,加速处理,以及快于的,等待处理。
原方案:
没有pts参数,故没有处理。

改进方案:
①参考问题一的解决方案,该方案与问题一方案一致。但是该方式来的码流,是ES流。不用进行ps头处理,直接进行类型判断,对应类型输入解码器即可。变慢的情况下,现在服务器这边会有一个时间戳来代替pts,用时间戳来判断播放与当前时间是否一致。
  1. 在1问题中,出现的防抖动处理。
    答:产生原因:tcp发包间隔,以及较差网络下造成的,如0秒接收的数据,在0.5秒的时候一次性接受到,下个0.5s的数据,在0.6秒的时候一次性接受到。这样忽快忽慢的来包。
原方案:
未处理。

改进方案:
①将来包中的第一个pts1的应该记录的时间time1,人为的延时0.3s左右,以及以后进行判断的时间都依次顺移0.3s,具体结合问题1进行具体操作。
  1. 在p2p的码流中(或者正常ps流),主码播放时候,此时I帧特别大。之前会出现播放图像出现一半,或者播放不出来的问题。
    答:产生原因:I帧较大的时候,未进行拼帧处理。
原方案:
未做拼帧处理。

改进方案:
①I帧较大的时候,进行拼接成一个完整I帧。
  1. 长时间播放的情况下,若刚来的pts数值就很大,则可能会出现pts数值溢出,清零的情况。
    答:产生原因:因为来的pts值很大,播放时间很长的话,pts是固定间隔增加,当到一定时间,就会溢出。
原方案:
未处理。
   
改进方案:
①当pts2-pts1为负数并且负数值很大的话,则可以判断出pts存在数值溢出的情况。
②在这种情况下,应该将第一次记录的time1,清空,重新记录下在这种情况后面来的pts,当前时间记录为time1。注:可参考问题一的步骤。
  1. 对于视频码流只有SEI的情况下,视频解析不出来的问题。

答:产生原因:将分析出来的sei数据输入到解码器,解析不出来。是黑屏状态。

原方案:
直接输入到解码器,但是未能实现解析。

改进方案:
暂无。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • ### YUV颜色空间 视频是由一帧一帧的数据连接而成,而一帧视频数据其实就是一张图片。 yuv是一种图片储存格式...
    天使君阅读 3,248评论 0 4
  • 做这个东西很久了,从去年十二月份开始的,快5个月了。。。期间因为工作一直断断续续,直到最近才有了些进展,也就到此为...
    0_0啊阅读 12,343评论 1 13
  • 音视频基础知识 一、音频入门 1.1 音频量化与编码 采样大小:一个采样使用多少 bit 存放,常用的是 16 b...
    csranger阅读 1,294评论 0 2
  • 一些基本概念 YUV/RGB处理以及PCM处理处于对视音频原始数据的处理,但是视音频在传输的过程中是以视音频码流传...
    MrYun阅读 8,795评论 0 2
  • 2019年5月22日健身打卡: 动:跳绳1500个,拉伸10分钟。 静:站桩5分钟,打坐20分钟。 快乐是...
    崴崴一笑阅读 164评论 0 0