Chrome 的 MediaRecorder 为每个关键帧生成新的 SPS 和 PPS

问题描述

我正在尝试使用 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_idseq_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 值。

这是有问题的,原因有两个:

  1. 这些 id 值使用 exp-Golomb 编码进行编码。这种编码使用更多位来编码更大的数字。因此,这些 MediaRecorder 会话运行的时间越长,数据结构就越大:PPS、SPS 和切片数据。
  2. MP4 (Quicktime) 在“avcC”原子中携带编解码器私有数据。它应该包括文件的 SPS 和 PPS NALU。但是,如果这些 NALU 针对每个关键帧都发生变化,则很难生成有用的“avcC”。

因此,使用 MSE 播放这些 fmp4 数据流的 SourceBuffer.appendBuffer() 方法在接收到第二个关键帧时会冻结其图片。

是否有办法抑制或解决 MediaRecorder 生成的 H264 媒体中这些不断变化的参数集 ID,以便整个会话使用相同的 SPS 和 PPS?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...