MP4文件中h264的 SPS、PPS获取

MP4文件中h264 SPSPPS获取

如下图所示,为avcC


1  【参考依据】ISO/IEC 14496-15

2  【综述】在H264中,SPS和PPS存在于NALU header中,而在MP4文件中,SPS和PPS存在于AVCDecoderConfigurationRecord, 首先要定位avcC.

3  【定义】

①参数集:一组很少改变的,为大量VCL NALU 提供解码信息的数据。

   序列参数集SPS作用于一系列连续的编码图像,而图像参数集PPS作用于编码视频序列中一个或多个独立的图像。

   如果解码器没能正确接收到这两个参数集,那么其他NALU 也是无法解码的。因此它们一般在发送其它 NALU 之前发送,并且使用不同的信道或者更加可靠的传输协议(如TCP)进行传输,也可以重复传输。

②关于AVCDecoderConfigurationRecord结构定义为  

4  【实例分析】 数据如上avcC图所示,现在对数据进行详细分析

所以,提取的SPSPPS分别为67 42 00 1E A6 81 41 F968 CE 38 80


提取H265



在 GStreamer 获取 H264 码流 SPSPPS 信息的方法如下: 1. 使用 `h264parse` 元素将 H264 码流解析为 NAL 单元。 2. 使用 `capsfilter` 元素设置 `video/x-h264, stream-format=byte-stream` 的媒体格式。 3. 使用 `splitter` 元素将 NAL 单元分离为 SPSPPS 和 IDR 帧等单元。 4. 使用 `queue` 元素对 SPSPPS 单元进行缓存。 5. 在需要使用 SPSPPS 信息的地方,从 `queue` 元素获取 SPSPPS 单元,并合并成完整的 SPSPPS 数据。 以下是示例代码: ```python import gi gi.require_version('Gst', '1.0') from gi.repository import Gst Gst.init(None) pipeline = Gst.Pipeline() src = Gst.ElementFactory.make('filesrc', 'src') src.set_property('location', 'test.h264') h264parse = Gst.ElementFactory.make('h264parse', 'parse') caps = Gst.Caps.from_string('video/x-h264, stream-format=byte-stream') capsfilter = Gst.ElementFactory.make('capsfilter', 'caps') capsfilter.set_property('caps', caps) splitter = Gst.ElementFactory.make('splitter', 'split') queue_sps = Gst.ElementFactory.make('queue', 'sps') queue_pps = Gst.ElementFactory.make('queue', 'pps') sink = Gst.ElementFactory.make('fakesink', 'sink') pipeline.add(src) pipeline.add(h264parse) pipeline.add(capsfilter) pipeline.add(splitter) pipeline.add(queue_sps) pipeline.add(queue_pps) pipeline.add(sink) src.link(h264parse) h264parse.link(capsfilter) capsfilter.link(splitter) splitter.link(queue_sps) splitter.link(queue_pps) queue_sps.link(sink) pipeline.set_state(Gst.State.PLAYING) bus = pipeline.get_bus() msg = bus.timed_pop_filtered(Gst.CLOCK_TIME_NONE, Gst.MessageType.STATE_CHANGED | Gst.MessageType.ERROR) if msg.type == Gst.MessageType.ERROR: error, debug = msg.parse_error() print('Error received from element %s: %s' % (msg.src.get_name(), error)) print('Debugging information: %s' % debug) else: print('Pipeline started') sps_data = None pps_data = None while True: sample = queue_sps.get_upstream_buffer() if sample: buf = sample.get_buffer() sps_data = buf.extract_dup(0, buf.get_size()) break while True: sample = queue_pps.get_upstream_buffer() if sample: buf = sample.get_buffer() pps_data = buf.extract_dup(0, buf.get_size()) break print('SPS:', sps_data) print('PPS:', pps_data) pipeline.set_state(Gst.State.NULL) ``` 这段代码可以从文件读取 H264 码流,并获取SPSPPS 数据。需要注意的是,从队列获取数据时需要使用 `get_upstream_buffer()` 方法,否则可能会遇到阻塞的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值