问题描述
我正在尝试使用 MIME 类型 video/webm;codecs="avc1.42C01E"
和 avc1 的其他变体对 MediaRecorder 的 webm 输出进行转换。我想生成带有 MIME 类型 video/mp4;codecs="avc1.42C01E"
的碎片化 mp4,包含相同的视频负载。 (为了延迟和功耗,我希望避免对视频有效负载进行转码。)这是可行的,除了一个问题。
每个关键帧的数据流——每个 webm 集群负载中的第一个 SimpleBlock——以 SPS 和 PPS NALU 开始。没关系,除了一件事。
每个关键帧的新 SPS 和 PPS NALU 都有新的 pic_parameter_set_id
和 seq_parameter_set_id
值。第一个关键帧的 pic_parameter_set_id
值为 0,后续关键帧的值为 1、2、3,依此类推。当它达到 56 时,它循环回到 0。(57 个不同的值?)
类似地,seq_parameter_set_id
值从 0 到 31 并循环返回。
此外,每一对新 SPS 和 PPS 之后的切片 NALU 引用新的 pic_parameter_set_id
值。
这是有问题的,原因有两个:
- 这些 id 值使用 exp-Golomb 编码进行编码。这种编码使用更多位来编码更大的数字。因此,这些 MediaRecorder 会话运行的时间越长,数据结构就越大:PPS、SPS 和切片数据。
- MP4 (Quicktime) 在“avcC”原子中携带编解码器私有数据。它应该包括文件的 SPS 和 PPS NALU。但是,如果这些 NALU 针对每个关键帧都发生变化,则很难生成有用的“avcC”。
因此,使用 MSE 播放这些 fmp4 数据流的 SourceBuffer.appendBuffer()
方法在接收到第二个关键帧时会冻结其图片。
是否有办法抑制或解决 MediaRecorder 生成的 H264 媒体中这些不断变化的参数集 ID,以便整个会话使用相同的 SPS 和 PPS?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)