我正在寻找一种方法来增加 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 的媒体缓冲区大小?
答案1
媒体源扩展 是浏览器 API 的标准,目前所有主流浏览器都通过浏览器发布的 JavaScript 函数实现该标准。
您将在 网页 作者 Nick Desaulniers,您可以下载 来源 以供进一步研究。
下图可以最好地解释参与视频流的主要对象:
但是,如果您检查这两个函数的 API 调用,您会发现,令人吃惊的是,根本找不到缓冲区大小参数。实际上,这是设计使然。您唯一的选择是在 JavaScript 播放器中向 MediaSource 对象请求缓冲区并将其附加到 SourceBuffer 缓冲区。
在文章中 超出缓冲配额 从 2019 年开始,Joseph Medley 研究了 SourceBuffer 对象在出现错误之前可以包含多少数据的问题。他对每个浏览器的发现如下:
结论:MSE 内部缓存已编入浏览器,无法修改。唯一的选择是让 JavaScript 播放器自己进行缓存,方法是请求并将更多缓冲区附加到 SourceBuffer 对象。但是,在我碰巧使用的任何 Web 播放器中,我都没有看到这样的选项。
(以上讨论与 HTML5 视频无关,因为 HTML5 视频也没有缓冲区大小参数。)
答案2
在 Firefox 中,media.mediasource.enabled
通过设置为 来禁用它false
。然后设置media.cache_readahead_limit
为9999
并media.cache_resume_treshold
设置为9999
。此设置设置默认情况下预加载多少秒的播放时间。所有 Youtube 视频都已 100% 加载,并且 2 小时以上的视频加载时间不到一秒(无论如何,以我的互联网速度)。如果它使视频缓冲如此缓慢和迟缓,我不确定为什么你甚至想要启用 MSE。现代网络标准怎么会有 150 MB 的微小最大缓冲区?这是 2000 年吗?