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

39 篇文章 17 订阅
26 篇文章 4 订阅

在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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码是在Docker容器执行的一系列命令,用于安装一些软件包和依赖项。具体来说,它执行以下操作: 1. `apt-get clean`:清理apt-get缓存,以释放磁盘空间。 2. `apt-get update`:更新apt-get软件包列表。 3. `apt-get install -y`:安装以下软件包和依赖项: - `python3`:Python 3的主要二进制文件。 - `python3-pip`:Python 3的包管理工具pip。 - `libopencv-dev`:OpenCV开发库的头文件和静态库。 - `python3-opencv`:Python 3的OpenCV绑定。 - `build-essential`:构建软件包所需的基本工具和编译器。 - `yasm`:视频编解码器的汇编器。 - `cmake`:跨平台的构建工具。 - `libtool`:通用库支持脚本工具。 - `libc6`、`libc6-dev`:C标准库的运行时库和开发文件。 - `unzip`:解压缩工具。 - `wget`:网络下载工具。 - `libnuma1`、`libnuma-dev`:NUMA(非统一内存访问)系统的库和开发文件。 - `libgstreamer1.0-0`:GStreamer多媒体框架的核心库。 - `gstreamer1.0-plugins-base`、`gstreamer1.0-plugins-good`、`gstreamer1.0-plugins-bad`、`gstreamer1.0-plugins-ugly`、`gstreamer1.0-libav`:GStreamer插件和解码器。 - `gstreamer1.0-doc`、`gstreamer1.0-tools`、`gstreamer1.0-x`、`gstreamer1.0-alsa`、`gstreamer1.0-gl`、`gstreamer1.0-gtk3`、`gstreamer1.0-qt5`、`gstreamer1.0-pulseaudio`:GStreamer的文档、工具和相关库。 - `libglib2.0-dev`:GLib开发库的头文件。 - `libgstrtspserver-1.0-dev`:GStreamer RTSP服务器库的开发文件。 - `gstreamer1.0-rtsp`:GStreamer的RTSP插件。 这些操作旨在为容器配置一个适合开发的环境,使其能够支持Python编程、OpenCV图像处理和GStreamer多媒体处理等任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值