MSE播放H264分片MP4报错:如何配置解码器更新流宽高参数?
解决MSE播放H264流时的尺寸配置问题
首先给你明确答案:你没办法直接通过MediaSource或者视频解码器的配置来手动更新流的宽高参数。浏览器的视频解码器完全依赖于视频流本身携带的SPS(序列参数集)元数据来确定宽高、编码profile这些关键信息——你看到的报错里coded size: [0,0],本质就是这条H264流的SPS里没有有效的宽高信息,甚至可能SPS本身就缺失或者损坏了。
接下来给你几个可行的解决思路:
1. 从源头修复视频流的元数据
这是最稳妥的解决办法。你需要在生成分片MP4的阶段,确保每个分片(至少是初始化段)都包含完整且正确的H264 SPS/PPS信息,而且SPS里必须明确指定视频的宽高参数:
- 如果是你自己生成的流,编码时要强制写入正确的SPS;如果是第三方提供的流,直接联系提供者修复元数据就行。
- 对MP4容器来说,初始化段(也就是moov box)里的
avcCbox必须包含完整的SPS/PPS数据,这样MediaSource才能正确解析出视频的尺寸信息。
2. 手动给流注入正确的SPS/PPS
如果没办法修改源流,你可以尝试在把分片数据推送到SourceBuffer之前,手动插入正确的H264 SPS和PPS:
- 先找一个同分辨率、同编码profile的正常H264流,提取它的SPS/PPS二进制数据;
- 在推送第一个视频分片的时候,把SPS/PPS插到分片数据的最前面(注意要符合H264的NALU格式,每个NALU开头必须有
0x00000001的起始码); - 这里要注意:你注入的SPS参数(比如profile、level、宽高)必须和实际的视频帧完全匹配,不然解码器还是会报错。
3. 调整SourceBuffer的模式或重置缓冲区
虽然不能直接设置宽高,但可以试试这些操作碰碰运气:
- 在添加第一个分片之前,把SourceBuffer的
mode设置为"sequence"(默认是"segments"),这种模式下浏览器会尝试重新解析每个分片的元数据; - 如果已经推送了错误的分片,可以调用
sourceBuffer.abort()清空缓冲区,然后重新推送包含正确元数据的初始化段和分片。
最后补充一句:报错里的level: not available也能佐证SPS有问题,因为H264的level信息也是由SPS提供的。MediaSource API本身并没有提供手动覆盖解码器配置的接口,所有解码器的参数都必须来自流本身的元数据,这一点是没法绕开的。
内容的提问来源于stack exchange,提问作者Daniel




