我正在尝试使用 MIME 类型video/webm;codecs="avc1.42C01E"
和 avc1 的其他变体对 MediaRecorder 的 webm 输出进行转箱。我想生成video/mp4;codecs="avc1.42C01E"
包含相同视频有效负载的 MIME 类型的分段 mp4。(为了延迟和功率,我希望避免对视频有效负载进行转码。)这是可行的,除了一个问题。
每个关键帧的数据流——每个 webm 集群有效负载中的第一个 SimpleBlock——都以 SPS 和 PPS NALU 开头。没关系,除了一件事。
pic_parameter_set_id
每个关键帧的新 SPS 和 PPS NALU 具有和的新值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”。
因此,SourceBuffer.appendBuffer()
使用 MSE 播放这些 fmp4 数据流的方法会在接收到第二个关键帧时冻结其图像。
有没有办法抑制或解决 MediaRecorder 生成的 H264 媒体中这些不断变化的参数集 id,因此整个会话使用相同的 SPS 和 PPS?