媒体源扩展 appendBuffer 恢复

Media Source Extensions appendBuffer recovery

提问人:Tim 提问时间:12/11/2019 最后编辑:Tim 更新时间:1/28/2020 访问量:436

问:

如何从以下情况导致的 appendBuffer 错误中恢复?

  • 缺少数据
  • 数据乱序
媒体源

评论

0赞 anthumchris 12/11/2019
音频还是视频?将使用哪个 MIME/容器?
0赞 Tim 12/12/2019
音频和视频。我对任何事情都持开放态度。我目前正在使用视频/网络;编解码器=“opus, vp9”
1赞 anthumchris 12/21/2019
“缺失数据”将如何发生?取而代之的是什么?
0赞 Tim 1/28/2020
@AnthumChris 例如,如果连接断开。不会在它的位置上附加任何内容。重新建立连接时,将继续追加新数据。

答:

0赞 jmsn 12/12/2019 #1
  • 丢失数据只会在缓冲区中产生一个间隙,在播放过程中需要一些间隙跳过逻辑,即当卡在一个范围的末尾时,将 设置为下一个范围的开头并继续播放currentTime
  • 只要将 SourceBuffer.mode 设置为 SourceBuffer.mode,就可以确保保留段的时间戳,那么无序添加段应该不是问题segments

评论

0赞 Tim 12/12/2019
如果我丢弃几秒钟的数据,然后尝试继续使用 appendBuffer,我会看到 MediaError {code: 3, message: “CHUNK_DEMUXER_ERROR_APPEND_FAILED: Got a block with a timecode before the previous block.”}我可以确认我的 SourceBuffer 具有 mode = segments。
1赞 anthumchris 12/21/2019 #2

这里只有猜测......我假设无序可恢复性取决于被解码的媒体容器的格式(WebM、Ogg 等)。浏览器的 decodeAudioData 函数在接收具有明显乱序/缺失页面的 Ogg Opus 文件(使用 opus-file-splitter 创建)时工作正常。我假设浏览器对两者和 MSE 缓冲区使用相同的底层流解码实现,因此 MSE 应该毫无问题地处理缺失的页面/段。decodeAudioData

不幸的是,MSE 不支持,所以我的测试文件不能立即用于测试。我还不熟悉 WebM 容器,但我最终会为另一个项目将文件重新排序到 MSE 中进行测试,并且可以在发生这种情况时让你知道结果!audio/ogg codecs="opus"audio/webm codecs="opus"