iOS硬解码中解码出错的注意点

       1:宽高注意点

            CVPixelBufferGetWidth(_:The pixel buffer whose width you want to obtain)

           获取解码后图像宽度

          CVPixelBufferGetWidthOfPlane(pixel_:,0/1_:)

           Returns the width of the plane at a given index in the pixel buffer.

    (1)pixelBuffer

The pixel buffer whose plane width you want to obtain.

    (2)planeIndex

The plane index that contains the plane’s width value.

在iOS硬解码获取图像宽高的时候上边两个函数一般是一致的

但是 :CVPixelBufferGetBytesPerRowOfPlane(pixel,index)

这个函数获取到的行数有可能就跟上边的宽度不一样。出现在某些刘海屏iPhone手机

2 解码报错,数据错误

2.1 aud

iOS硬解码不支持AUD,要把这个字段跳过去,不然会报解码错误,数据错误
AUD信息是在I帧或者P帧都有可能存在,在H264或者H265中都可能有,需要跳过去
起始码中

      

 

 

  //265  00 00 00 01 (Data[4] & 0x7f)>>1

        nAudStarcode  = 35//264  00 00 00 01  Data[4] & 0x1f

//一般文档没有对AUD进行描叙,其实这是一个帧开始的标志,字节顺序为:00 00 00 01 09 f0

        nAudStarcode  = 9;

 

2.2 硬解码多slice码流

要做一个annex-b 与AVCC的互转;起始码 -> 字节长度的一个转换


 

2.3 硬解码不支持多tile

多tile分为行tile和列tile;硬解码并不支持这种类型的码流;会出现解码报错


 

2.4 硬解码不支持帧内刷新类型的码流

intra refresh帧内刷新,你看到的就是在一个gop内有一个画面从上到下刷过来的效果,这种码流iOS硬解码也是不支持的;


 

2.5对于某些伪竞争机制出现部分手机解码-12909

h264编码防止竞争机制如果检测出有连续两个0x00字节且后一位为0x00、0x01、0x02、0x03,就需要在两个0x00后插入一个0x03,则在NAL数据内肯定不会存在NAL起始码0x000001 ;如果你检测到一帧的结尾(跟解析模块断帧有关;)或者开头(在开头就不用了因为你会去找每一帧的起始码的),有类似00 00 03 的东西,这个不要算在解码数据内,否则部分手机iOS14的OS,会解码报错


2.6 sps pps 的影响

 

硬解码sps pps的长度一定要给对;不能有冗余;
IOS15的iPadPro,硬解码H264,sps长度,位置给对了,pps的位置给对了(起始字段),长度给错了(4个字节pps ,但是后边有10个字节的冗余,导致给的长度是14);
因为pps到IDR之间可能会存在冗余;导致iPhone手机硬解码正常,但是iPad解码P帧的时候报-12909;

2.7 帧后边的冗余字段
nalu的帧数据后边有不知名的字段,譬如硬解码这帧的数据是2048个字节,最后的三个字节是00 00 0X(X= 某个数字);就是一些冗余字段,在某些平板上也会解码报错

2.8 多slice
annexb to AVCC ;将多个slice片整理成一片;注意一帧里边找 000000 01,作为分片依据,但是不是每个 00000001都是一个片,要看他后边的那个字节是不是有用的字节;不要在分片组帧的时候看到00000001 就认为是一个slice片;并不是;有些码流并不是 multi-slice码流但是他的一帧里也有00000001,这个时候就你不能去进行avcc格式转换;

posted on 2019-06-18 16:42  邗影  阅读(722)  评论(0编辑  收藏  举报

导航