gstreamer中解析生成android的csd-0和csd-1

博客详细介绍了在Android中使用codec时配置csd数据的重要性,csd-0和csd-1分别对应SPS和PPS数据。内容涉及到H264格式的两种类型——AnnexB和avcC,以及mp4与mpegts文件中codec_data的不同。通过解析avcC数据,展示了如何细分mp4文件中的SPS和PPS信息,强调了Android硬解码对AnnexB格式数据的要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Android中,使用codec的时候,通常要先配置csd数据,全称codec specific data,通常从datasource里面都能获得,对应csd-0:SPS数据,csd-1:PPS数据,并且Android硬解码只接受AnnexB格式的数据。

  • SPS(序列参数集Sequence Parameter Set)

  • PPS(图像参数集Picture Parameter Set)

所以,在gstreamer中使用Android codec的时候,要配置csd-0和csd-1给codec,就先要从caps里面拿到codec_data,然后进行解析,如果不是annexb格式的数据,就要做一个buffer转换,转换成带start code的nalu数据送给codec。

先看两条命令,分别播放h264.mp4,h264.ts文件,通过-v参数可以输出codec_data:

gst-play-1.0 /sdcard/h264.mp4  --videosink='fakesink' -v

codec_data=(buffer)01640028ffe1001a67640028acd940780227e584000003000400000300c83c60c65801000668ebe3cb22c0

gst-play-1.0 /sdcard/mpeg.ts --videosink='fakesink' -v

codec_data=(buffer)000001b378043833ffffe018000001b5144a00010000

从codec_data不难看出,mp4文件的codec_data是avcc格式,而mpeg ts文件的codec_data带startcode(000001)的Annex-B格式。

avcC
  • H264格式有两种,一种是AnnexB-(0X00000001开头),一种是avcC(数据长度开头)

  • 在mp4中,avcC BOX的开头就是固定的61 76 63 43这四个字节,即4字节码:‘avcC’

bits      
8   version ( always 0x01 )  
8   avc profile ( sps[0][1] )  
8   avc compatibility ( sps[0][2] )  
8   avc level ( sps[0][3] )  
6   reserved ( all bits on )  
2   NALULengthSizeMinusOne    # 这个值是(前缀长度-1),值如果是3,那前缀就是4,因为4-1=3
3   reserved ( all bits on )
5   number of SPS NALUs (usually 1) 
        repeated once per SPS:  
16  SPS size  
        variable SPS NALU data  
8   number of PPS NALUs (usually 1)  
        repeated once per PPS  
16  PPS size  
        variable PPS NALU data

对应上面的协议,可以将上面mp4 avcC的数据细分:

01 64 00 28 ff e1
# 01 version
# 64 avc profile 0x64->100
# 00 avc compatibility
# 28 avc level
#  / reserved(6 bits)
# ff -> 1111 1111 (二进制)
#  \ NALULengthSizeMinusOne(2 bits) 后面2位(0b11),表示3,那么用来表示size的字节就有3+1=4个

#	/ reserved 3bits
# e1 -> 1110 0001 (二进制)
#   \ number of SPS NALUs(5 bits) 后面5bits是1


00 1a 67 64 00 28 ac d9 40 78 02 27 e5 84 00
00 03 00 04 00 00 03 00 c8 3c 60 c6 58

# 00 1a: SPS size -> 26个字节

# 后面这部分就是SPS的NALU数据,刚好26个字节
#0x67 & 0x1f = 7 -> SPS
# 67 64 00 28 ac d9 40 78 02 27 e5 84 00
# 00 03 00 04 00 00 03 00 c8 3c 60 c6 58

01 00 06 68 eb e3 cb 22 c0
#    01: number of PPS NALUs(1个字节长度)
# 00 06: 6个字节

# 后面这部分就是PPS的NALU数据,刚好6个字节
# 0x68 & 0x1f = 8 -> PPS
# 68 eb e3 cb 22 c0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值