videojs / mux.js

Lightweight utilities for inspecting and manipulating video container formats.
Apache License 2.0
1.11k stars 210 forks source link

Sample code: It does not work. #407

Closed jynxio closed 7 months ago

jynxio commented 2 years ago

Discretion

The sample code of README.md does not work, it will throw this error:

Uncaught (in promise) DOMException: Failed to execute 'appendBuffer' on 'SourceBuffer': This SourceBuffer has been removed from the parent media source.

The specific location of the error is here:

<script>
    function appendNextSegment () {
        // ......
        transmuxer.on('data', (segment) => {
            sourceBuffer.appendBuffer(new Uint8Array(segment.data)); // 👈 here!
        })
        // ......
    }
</script>

Screenshot

Snipaste_2022-01-07_16-39-24

Environment

platform: chrome ( 97.0.4692.71 ), Windows10

erickythierry commented 2 years ago

same here. did you find any solution?

jynxio commented 2 years ago

same here. did you find any solution?

not yet

arturparkhisenko commented 1 year ago

In addition to that - the latest release didn't publish assets like it did before, so that's also one more reason why the sample code fails. Talking about this URL https://github.com/videojs/mux.js/releases/latest/download/mux.js.

arturparkhisenko commented 1 year ago

But the core of the reported problem is that with the current code sample, we're getting two data events for one updateend event of source buffer. So yes the current SourceBuffer is still in the appendBuffer state.

The simplest 1 line change we can make seems to me like this:

function appendNextSegment(){
  // reset the 'data' event listener to just append (moof/mdat) boxes to the Source Buffer
  transmuxer.off('data');
  transmuxer.on('data', (segment) =>{
    sourceBuffer.appendBuffer(new Uint8Array(segment.data));
    transmuxer.off('data'); // ⬅️ 🆕 This is added, to close the listener for the current append.
  })
  // ... rest of the code
}