Skip to content

Video decode/parsing error in Chrome 138 (h264 high BT709) #7372

@ingalls

Description

@ingalls

What version of Hls.js are you using?

1.6.5

What browser (including version) are you using?

Chrome 138 (Broken), Firefox 139 (Working)

What OS (including version) are you using?

Ubuntu 25.04 & Windows 11

Test stream

We're working on a more reproducible test stream

Configuration

new Hls({    
            enableWorker: true,    
            debug: true,    
            maxBufferSize: 3000000,    
            maxMaxBufferLength: 120,                
            xhrSetup: (xhr: XMLHttpRequest) => {               
                if (url.username && url.password) {    
                    xhr.setRequestHeader('Authorization', 'Basic ' + btoa(`${url.username}:${url.password}`));    
                }    
            }                     
        });

Additional player setup steps

Contents of index.m3u8

#EXTM3U
#EXT-X-VERSION:9
#EXT-X-INDEPENDENT-SEGMENTS

#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="audio2",AUTOSELECT=YES,DEFAULT=YES,URI="audio2_stream.m3u8"

#EXT-X-STREAM-INF:BANDWIDTH=3075702,AVERAGE-BANDWIDTH=3075663,CODECS="avc1.64002a,mp4a.40.2",RESOLUTION=1280x720,FRAME-RATE=29.970,AUDIO="audio"
video1_stream.m3u8

Checklist

Steps to reproduce

Image

We use a Shotover camera to perform wildfire boundary detection. The Shotover camera broadcasts over a starlink terminal to a MediaMTX server which then muxes the streams to an HLS feed that can be viewed in browser. We haven't had issues with other HLS streams hosted on this server and are working to try to find a reproducible stream that exhibits this same behavior as we can only currently test while the stream is active.

Expected behaviour

Both Firefox and Chrome would be able to see the same stream. ffplay and VLC can both view the stream without issue.

What actually happened?

Firefox works perfectly but chrome throws a multitude of errors and can only show the video stream for a fraction of a second before an error is thrown.

Console output

hls__js.js?v=554901c8:17648 [error] > [buffer-controller]: Error: audio SourceBuffer error. MediaSource readyState: ended Event {isTrusted: true, type: 'error', target: SourceBuffer, currentTarget: SourceBuffer, eventPhase: 2, …}
onSBUpdateError @ hls__js.js?v=554901c8:17648Understand this error
FloatingVideo.vue:312 Hls.Events.ERROR {type: 'mediaError', details: 'bufferAppendingError', sourceBufferName: 'audio', error: Error: audio SourceBuffer error. MediaSource readyState: ended
    at Proxy.onSBUpdateError (http:/…, fatal: false, …}
hls__js.js?v=554901c8:17149 [warn] > [buffer-controller]: Failed 1/3 times to append segment in "audio" sourceBuffer (no media error)
onError @ hls__js.js?v=554901c8:17149
onSBUpdateError @ hls__js.js?v=554901c8:17658Understand this warning
hls__js.js?v=554901c8:18934 [warn] > [content-steering]: Could not resolve bufferAppendError ("audio SourceBuffer error. MediaSource readyState: ended") with content-steering for Pathway: . levels: 1 priorities: ["."] penalized: {".":19015.200000047684}
onError @ hls__js.js?v=554901c8:18934
emit @ hls__js.js?v=554901c8:8865
emit @ hls__js.js?v=554901c8:31344
trigger @ hls__js.js?v=554901c8:31348
onError @ hls__js.js?v=554901c8:17154
onSBUpdateError @ hls__js.js?v=554901c8:17658Understand this warning
FloatingVideo.vue:312 Hls.Events.ERROR {type: 'mediaError', parent: 'audio', details: 'bufferAppendError', sourceBufferName: 'audio', frag: Fragment, …}
FloatingVideo.vue:322 Fatal media error encountered {type: 'mediaError', parent: 'audio', details: 'bufferAppendError', sourceBufferName: 'audio', frag: Fragment, …}
FloatingVideo.vue:324 [log] > recoverMediaError
FloatingVideo.vue:299 [warn] > [stream-controller]: Fragment 1103 part 4 of level 0 was aborted
handleFragLoadAborted @ hls__js.js?v=554901c8:8485
handleFragLoadError @ hls__js.js?v=554901c8:7989
(anonymous) @ hls__js.js?v=554901c8:7907
Promise.catch
_doFragLoad @ hls__js.js?v=554901c8:7907
_loadFragForPlayback @ hls__js.js?v=554901c8:7648
loadFragment @ hls__js.js?v=554901c8:7635
loadFragment @ hls__js.js?v=554901c8:29498
doTickIdle @ hls__js.js?v=554901c8:29487
doTick @ hls__js.js?v=554901c8:29390
tick @ hls__js.js?v=554901c8:5263
completeInitSegmentLoad @ hls__js.js?v=554901c8:7797
(anonymous) @ hls__js.js?v=554901c8:7774
Promise.then
_loadInitSegment @ hls__js.js?v=554901c8:7739
loadFragment @ hls__js.js?v=554901c8:29493
doTickIdle @ hls__js.js?v=554901c8:29487
doTick @ hls__js.js?v=554901c8:29390
tick @ hls__js.js?v=554901c8:5263
onLevelLoaded @ hls__js.js?v=554901c8:29704
emit @ hls__js.js?v=554901c8:8865
emit @ hls__js.js?v=554901c8:31344
trigger @ hls__js.js?v=554901c8:31348
handlePlaylistLoaded @ hls__js.js?v=554901c8:31135
handleTrackOrLevelPlaylist @ hls__js.js?v=554901c8:30999
onSuccess @ hls__js.js?v=554901c8:30878
readystatechange @ hls__js.js?v=554901c8:27107
XMLHttpRequest.send
openAndSendXhr @ hls__js.js?v=554901c8:27059
(anonymous) @ hls__js.js?v=554901c8:27023
Promise.then
loadInternal @ hls__js.js?v=554901c8:27021
load @ hls__js.js?v=554901c8:26997
load @ hls__js.js?v=554901c8:30890
onLevelLoading @ hls__js.js?v=554901c8:30751
emit @ hls__js.js?v=554901c8:8865
emit @ hls__js.js?v=554901c8:31344
trigger @ hls__js.js?v=554901c8:31348
loadingPlaylist @ hls__js.js?v=554901c8:29122
scheduleLoading @ hls__js.js?v=554901c8:15931
loadPlaylist @ hls__js.js?v=554901c8:29111
set level @ hls__js.js?v=554901c8:28997
set @ chunk-VZXQDS5F.js?v=554901c8:1234
set nextLoadLevel @ hls__js.js?v=554901c8:29140
set @ chunk-VZXQDS5F.js?v=554901c8:1234
set nextLoadLevel @ hls__js.js?v=554901c8:31673
set @ chunk-VZXQDS5F.js?v=554901c8:1234
startLoad @ hls__js.js?v=554901c8:29330
startLoad @ hls__js.js?v=554901c8:31488
checkAutostartLoad @ hls__js.js?v=554901c8:30905
emit @ hls__js.js?v=554901c8:8865
emit @ hls__js.js?v=554901c8:31344
trigger @ hls__js.js?v=554901c8:31348
handleMasterPlaylist @ hls__js.js?v=554901c8:30949
onSuccess @ hls__js.js?v=554901c8:30880
readystatechange @ hls__js.js?v=554901c8:27107
XMLHttpRequest.send
openAndSendXhr @ hls__js.js?v=554901c8:27059
(anonymous) @ hls__js.js?v=554901c8:27023
Promise.then
loadInternal @ hls__js.js?v=554901c8:27021
load @ hls__js.js?v=554901c8:26997
load @ hls__js.js?v=554901c8:30890
onManifestLoading @ hls__js.js?v=554901c8:30732
emit @ hls__js.js?v=554901c8:8865
emit @ hls__js.js?v=554901c8:31344
trigger @ hls__js.js?v=554901c8:31348
loadSource @ hls__js.js?v=554901c8:31454
(anonymous) @ FloatingVideo.vue:299
emit @ hls__js.js?v=554901c8:8865
emit @ hls__js.js?v=554901c8:31344
trigger @ hls__js.js?v=554901c8:31348
BufferController._onMediaSourceOpen @ hls__js.js?v=554901c8:16498Understand this warning
FloatingVideo.vue:299 [warn] > [audio-stream-controller]: Fragment 1103 part 3 of track 0 was aborted
handleFragLoadAborted @ hls__js.js?v=554901c8:8485
handleFragLoadError @ hls__js.js?v=554901c8:7989
(anonymous) @ hls__js.js?v=554901c8:7907
Promise.catch
_doFragLoad @ hls__js.js?v=554901c8:7907
_loadFragForPlayback @ hls__js.js?v=554901c8:7648
loadFragment @ hls__js.js?v=554901c8:7635
loadFragment @ hls__js.js?v=554901c8:15681
doTickIdle @ hls__js.js?v=554901c8:15262
doTick @ hls__js.js?v=554901c8:15096
tick @ hls__js.js?v=554901c8:5263
setInterval
setInterval @ hls__js.js?v=554901c8:5228
startLoad @ hls__js.js?v=554901c8:15081
startLoad @ hls__js.js?v=554901c8:31488
checkAutostartLoad @ hls__js.js?v=554901c8:30905
emit @ hls__js.js?v=554901c8:8865
emit @ hls__js.js?v=554901c8:31344
trigger @ hls__js.js?v=554901c8:31348
handleMasterPlaylist @ hls__js.js?v=554901c8:30949
onSuccess @ hls__js.js?v=554901c8:30880
readystatechange @ hls__js.js?v=554901c8:27107
XMLHttpRequest.send
openAndSendXhr @ hls__js.js?v=554901c8:27059
(anonymous) @ hls__js.js?v=554901c8:27023
Promise.then
loadInternal @ hls__js.js?v=554901c8:27021
load @ hls__js.js?v=554901c8:26997
load @ hls__js.js?v=554901c8:30890
onManifestLoading @ hls__js.js?v=554901c8:30732
emit @ hls__js.js?v=554901c8:8865
emit @ hls__js.js?v=554901c8:31344
trigger @ hls__js.js?v=554901c8:31348
loadSource @ hls__js.js?v=554901c8:31454
(anonymous) @ FloatingVideo.vue:299
emit @ hls__js.js?v=554901c8:8865
emit @ hls__js.js?v=554901c8:31344
trigger @ hls__js.js?v=554901c8:31348
BufferController._onMediaSourceOpen @ hls__js.js?v=554901c8:16498Understand this warning
hls__js.js?v=554901c8:17648 [error] > [buffer-controller]: Error: audio SourceBuffer error. MediaSource readyState: ended Event {isTrusted: true, type: 'error', target: SourceBuffer, currentTarget: SourceBuffer, eventPhase: 2, …}isTrusted: truebubbles: falsecancelBubble: falsecancelable: falsecomposed: falsecurrentTarget: SourceBuffer {mode: 'segments', updating: false, timestampOffset: 0, appendWindowStart: 0, appendWindowEnd: Infinity, …}defaultPrevented: falseeventPhase: 0returnValue: truesrcElement: SourceBuffer {mode: 'segments', updating: false, timestampOffset: 0, appendWindowStart: 0, appendWindowEnd: Infinity, …}target: SourceBuffer {mode: 'segments', updating: false, timestampOffset: 0, appendWindowStart: 0, appendWindowEnd: Infinity, …}timeStamp: 49168.89999997616type: "error"[[Prototype]]: Event
onSBUpdateError @ hls__js.js?v=554901c8:17648Understand this error
FloatingVideo.vue:312 Hls.Events.ERROR {type: 'mediaError', details: 'bufferAppendingError', sourceBufferName: 'audio', error: Error: audio SourceBuffer error. MediaSource readyState: ended
    at Proxy.onSBUpdateError (http:/…, fatal: false, …}
hls__js.js?v=554901c8:17149 [warn] > [buffer-controller]: Failed 1/3 times to append segment in "audio" sourceBuffer (no media error)
onError @ hls__js.js?v=554901c8:17149
onSBUpdateError @ hls__js.js?v=554901c8:17658Understand this warning
hls__js.js?v=554901c8:18934 [warn] > [content-steering]: Could not resolve bufferAppendError ("audio SourceBuffer error. MediaSource readyState: ended") with content-steering for Pathway: . levels: 1 priorities: ["."] penalized: {".":19015.200000047684}

Chrome media internals output

Next time the camera is online I will capture this output.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions