Estou procurando uma maneira de aumentar o buffer de vídeo/áudio que o MSE está usando.
Minha mídia continua pausando/reiniciando devido à conexão lenta:
Jogando:
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"}
Em seguida, pausando por alguns segundos:
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"}
Você pode ver que isso é claramente um problema de buffer, se eu puder ter um buffer maior, ele pode sobreviver a muito mais problemas de largura de banda, como a mídia é h264
baseada, podemos assumir que não é codificado em CBR, então um buffer pode aumentar muito a experiência da mídia. Posso sacrificar algum atraso / latência inicial ou de buffer com certeza.
Como posso alterar os tamanhos de buffer de mídia do MSE no Chrome no Windows?
Extensões de fonte de mídia é um padrão para API de navegador que é implementado hoje em todos os principais navegadores por meio de funções JavaScript que são publicadas pelo navegador.
Você encontrará um bom exemplo de um jogador mínimo na página de Nick Desaulniers, e você pode baixar a fonte para um estudo mais aprofundado.
Os principais objetos que participam do fluxo de vídeo são melhor explicados por meio do diagrama a seguir:
Os principais elementos cujo tamanho você pode querer modificar são o MediaSource e o SourceBuffer .
No entanto, se você examinar as chamadas da API para essas duas funções, verá que, surpreendentemente, talvez não haja um parâmetro de tamanho de buffer em nenhum lugar. Na verdade, isso é por design. Sua única opção está em seu player JavaScript para solicitar buffers ao objeto MediaSource e anexá-los ao buffer SourceBuffer.
No artigo Exceeding the buffering quota from 2019, Joseph Medley examinou a questão de quantos dados o objeto SourceBuffer pode conter antes de dar um erro. Suas descobertas por navegador foram:
Conclusão: O cache interno do MSE está programado no navegador e não pode ser modificado. A única opção é que o player JavaScript faça o próprio cache solicitando e anexando mais buffers ao objeto SourceBuffer. No entanto, não vi essa opção em nenhum dos web players que usei.
(A discussão acima não se refere ao vídeo HTML5, para o qual também não há parâmetro para tamanho do buffer.)
No Firefox
media.mediasource.enabled
, desative configurando parafalse
. Em seguida, definamedia.cache_readahead_limit
para9999
emedia.cache_resume_treshold
também para9999
. Essas configurações definem quantos segundos de reprodução são pré-carregados por padrão. Todos os vídeos do Youtube são carregados 100% e em menos de um segundo para mais de 2h de vídeo (com minha velocidade de internet, de qualquer maneira). Não sei por que você desejaria o MSE se ele tornasse o buffer de vídeo tão lento e retardado. Como o padrão da web moderno pode ter um buffer máximo minúsculo de 150 MB? O que é isso, ano 2000?