H264 编码RawBitstream 格式分析以及SPS&PPS数据分析

本文介绍了使用MPP框架开发的demo应用,涉及一路sensor输入的多路输出,详细解读了H264编码的配置、预览缩放、NPU识别图像和抓拍照片的过程。重点讨论了H264_REC.raw文件格式,编码参数设置及SPS和PPS的重要性。

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

基于MPP框架开发了demo展示应用,方案数据流如下图所示,简单说明一下.

1.支持一路sensor输入,四路输出.

2.第一路VIPP0输出YUV大小为1920*1080. 编码为H264main profile大小的压缩BitStream存盘。

3.第二路预览,源分辨率1920*1080,目标分辨率640*480,中间经过一次VIPP1的 scale down.

4.第三路提供供NPU做人形识别的图像,源分辨率1920*1080,目标分辨率352*198.

5.第四路用于抓怕jpg格式的照片。

原型框架已经设计完成,下图显示的是录制到磁盘的原始编码视频文件以及供NPU计算的小图文件:

下面我们来分析一下H264_REC.raw的文件格式:

首先上代码:

vbvbuffer是一个循环buffer,所以要由两个指针和长度信息。

根据以上代码,我们可以看到,我们可以大概看出,H264_REC.raw的格式大概如下:

对于这种格式的数据(带有sps,pps的原始压缩帧数据),可以通过ffmpeg -i或者mediainfo工具查看其内容:

可以看到,每笔压缩数据都是完整的数据帧,这是由通道参数配置阶段的bByFrame决定的,如下图所示,当bByFrame设置为TRUE时,表示每个完整的YUV帧只编码为一笔VBV,反之,可能会分成多笔Slice编码一帧图像。

加入调试打印:

sps&&pps(Sequence Parameter Set/Picture Parameter Set)起始地址0xc28138c0,长度28字节,dump出来如下:

dump出来文件如下:

和原始编码码流文件对比:

可见其头部28字节完全一样,并且符合annex-b格式

00 00 00 01 67 4d 00 33 96 54 03 c0 11 2f 2c dc 14 18 14 08 00 00 00 01 68 ee 3c 80

其中0x67表示SPS,0x68表示PPS。

现在我们分析一下SPS的格式,SPS格式

00 00 00 01 67 4d 00 33 96 54 03 c0 11 2f 2c dc 14 18 14 08 00 00 00 01 68 ee 3c 80

0x4d=77,表示编码格式为main profile.还有最大参考帧个数,以及图像的长宽等等信息。

尝试发现,分理处来的H264裸文件,需要首先写入SPS和PPS,否则会导致分离出来的数据没有SPS、PPS而无法播放。比如,将H264_REC.raw文件中的头部28字节去掉,文件无法通过ffplay和vlc播放出来。对于AW的video codec,如果一开始找不到sps和pps,解码会继续查找,直到片源结束,不播球.

根据VLC码率信息可以看到,我们的编码参数设置的CBR,8M码率,还是比较符合的。 


需要注意的是,编码器会根据码率生成每笔BITSTREAM的PTS时间戳,用于控制解码后的帧率。 


结束!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

papaofdoudou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值