我正在寻找一种方法来增加 MSE 正在使用的视频/音频缓冲区。
由于连接速度慢,我的媒体一直暂停/恢复:
播放:
audio_buffering_state {"state":"BUFFERING_HAVE_ENOUGH"}
dimensions "1920x804"
duration 6988.2307
event "kPlay"
info "D3D11VideoDecoder is using array texture"
kAudioDecoderName "FFmpegAudioDecoder"
kAudioTracks [{"bytes per channel":4,"bytes per frame":8,"channel layout":"STEREO","channels":2,"codec":"mp3","codec delay":529,"discard decoder delay":true,"encryption scheme":"Unencrypted","has extra data":false,"profile":"unknown","sample format":"Float 32-bit","samples per second":48000,"seek preroll":"0us"}]
kFrameTitle "Movies"
kFrameUrl xxx
kFramerate 24
kIsAudioDecryptingDemuxerStream false
kIsPlatformAudioDecoder false
kIsPlatformVideoDecoder true
kIsVideoDecryptingDemuxerStream false
kRendererName "RendererImpl"
kResolution "1920x804"
kTextTracks []
kVideoDecoderName "D3D11VideoDecoder"
kVideoPlaybackFreezing 0.025359
kVideoPlaybackRoughness 7.281
kVideoTracks [{"alpha mode":"is_opaque","codec":"h264","coded size":"1920x804","color space":"{primaries:BT709, transfer:BT709, matrix:BT709, range:LIMITED}","encryption scheme":"Unencrypted","has extra data":false,"hdr metadata":"unset","natural size":"1920x804","orientation":"0°","profile":"h264 high","visible rect":"0,0 1920x804"}]
origin_url xxx
pipeline_buffering_state {"for_suspended_start":false,"state":"BUFFERING_HAVE_ENOUGH"}
pipeline_state "kPlaying"
player_id 0
render_id 1759
seek_target 2922.002022
url xxx
video_buffering_state {"state":"BUFFERING_HAVE_ENOUGH"}
然后暂停几秒钟:
audio_buffering_state {"reason":"DEMUXER_UNDERFLOW","state":"BUFFERING_HAVE_NOTHING"}
dimensions "1920x804"
duration 6988.2307
event "kPlay"
info "D3D11VideoDecoder is using array texture"
kAudioDecoderName "FFmpegAudioDecoder"
kAudioTracks [{"bytes per channel":4,"bytes per frame":8,"channel layout":"STEREO","channels":2,"codec":"mp3","codec delay":529,"discard decoder delay":true,"encryption scheme":"Unencrypted","has extra data":false,"profile":"unknown","sample format":"Float 32-bit","samples per second":48000,"seek preroll":"0us"}]
kFrameTitle "Movies"
kFrameUrl xxx
kFramerate 24
kIsAudioDecryptingDemuxerStream false
kIsPlatformAudioDecoder false
kIsPlatformVideoDecoder true
kIsVideoDecryptingDemuxerStream false
kRendererName "RendererImpl"
kResolution "1920x804"
kTextTracks []
kVideoDecoderName "D3D11VideoDecoder"
kVideoPlaybackFreezing 0.025359
kVideoPlaybackRoughness 7.281
kVideoTracks [{"alpha mode":"is_opaque","codec":"h264","coded size":"1920x804","color space":"{primaries:BT709, transfer:BT709, matrix:BT709, range:LIMITED}","encryption scheme":"Unencrypted","has extra data":false,"hdr metadata":"unset","natural size":"1920x804","orientation":"0°","profile":"h264 high","visible rect":"0,0 1920x804"}]
origin_url xxx
pipeline_buffering_state {"for_suspended_start":false,"reason":"DEMUXER_UNDERFLOW","state":"BUFFERING_HAVE_NOTHING"}
pipeline_state "kPlaying"
player_id 0
render_id 1759
seek_target 2922.002022
url xxx
video_buffering_state {"state":"BUFFERING_HAVE_ENOUGH"}
你可以看到这显然是一个缓冲区问题,如果我可以有一个更大的缓冲区,它可以承受更多的带宽问题,因为媒体是h264
基于 - 的,我们可以假设它不是 CBR 编码的,所以缓冲区可以大大增加媒体体验。我可以肯定地牺牲一些初始或缓冲延迟/延迟。
如何在 Windows 下的 Chrome 中更改 MSE 的媒体缓冲区大小?
Media Source Extensions 是浏览器 API 的标准,如今通过浏览器发布的 JavaScript 函数在所有主要浏览器中实现。
您会在Nick Desaulniers 的网页中找到一个极简播放器的好示例 ,您可以下载源代码 以供进一步研究。
下图最好地解释了参与视频流的主要对象:
您可能希望修改其大小的主要元素是 MediaSource 和 SourceBuffer。
但是,如果您检查了这两个函数的 API 调用,您会发现,也许令人吃惊的是,找不到缓冲区大小参数。实际上,这是设计使然。您唯一的选择是在 JavaScript 播放器中向 MediaSource 对象请求缓冲区并将它们附加到 SourceBuffer 缓冲区。
在 超过 2019 年的缓冲配额一文 中,Joseph Medley 研究了 SourceBuffer 对象在给出错误之前可以包含多少数据的问题。他对每个浏览器的发现是:
结论:MSE内部缓存被编程到浏览器中,无法修改。唯一的选择是 JavaScript 播放器通过请求并将更多缓冲区附加到 SourceBuffer 对象来自己进行缓存。但是,我在碰巧使用的任何网络播放器中都没有看到这样的选项。
(上面的讨论与 HTML5 视频无关,它也没有缓冲区大小的参数。)
在 Firefox
media.mediasource.enabled
中通过设置禁用false
。然后设置media.cache_readahead_limit
为9999
并且media.cache_resume_treshold
也设置为9999
。此设置设置默认情况下预加载多少秒的播放。所有 Youtube videous 都以 100% 的速度加载,并且 2 小时以上的视频在不到一秒的时间内加载(无论如何,以我的互联网速度)。如果 MSE 使视频缓冲变得如此缓慢和迟缓,我不确定你为什么还要开启 MSE。现代网络标准如何拥有 150 MB 的最小最大缓冲区?这是什么,2000 年?