HLS and Media Support Linux
I'm trying to implement an HLS player in wry (via tauri). However for how many different solution I adopted, I didn't manage to solve the issue, moreover the error seem to happen in the same action, adding a source to the video element (e.g. by using hls.js).
Moreover I tried to play a single video file of the HLS stream (that a list of video chunks that a manifest send the videoplayer to load in order), and it works flawlessly so it should not be a problem related to a missing video codec.
Could be related to the MSE (Media Source Extension), that i have seen disabled in some webkit2gtk version?
Do someone have some idea ?
Here the log of the browser of the HLS player:
[Log] [log] > – "Debug logs enabled for \"Hls instance\" in hls.js version 1.4.6" (hls__js.js, line 336)
[Log] [log] > – "stopLoad" (hls__js.js, line 22986)
[Log] [log] > – "loadSource:https://demo.unified-streaming.com/k8s/features/stable/video/tears-of-steel/tears-of-steel.ism/.m3u8" (hls__js.js, line 22960)
[Log] [log] > – "[stream-controller]:" – "Trigger BUFFER_RESET" (hls__js.js, line 13885)
[Log] [log] > – "attachMedia" (hls__js.js, line 22936)
[Log] [log] > – "[level-controller]:" – "manifest loaded, 5 level(s) found, first bitrate: 493000" (hls__js.js, line 5361)
[Log] [log] > – "1 bufferCodec event(s) expected" (hls__js.js, line 16798)
[Log] [log] > – "startLoad(-1)" (hls__js.js, line 22977)
[Log] [log] > – "[level-controller]:" – "Switching to level 0 from level -1" (hls__js.js, line 5423)
[Log] [log] > – "[level-controller]:" – "Loading level index 0 with URI 1/1 https://demo.unified-streaming.com/k8s/features/stable/video/tears-of-steel/tears-of-steel.ism/tears-of-s…" (hls__js.js, line 5553)
"Loading level index 0 with URI 1/1 https://demo.unified-streaming.com/k8s/features/stable/video/tears-of-steel/tears-of-steel.ism/tears-of-steel-audio_eng=64008-video_eng=401000.m3u8"
[Log] [log] > – "[stream-controller]:" – "STOPPED->IDLE" (hls__js.js, line 8399)
[Log] [log] > – "[subtitle-stream-controller]:" – "STOPPED->IDLE" (hls__js.js, line 8399)
[Log] [log] > – "[buffer-controller]: Media source opened" (hls__js.js, line 16704)
[Log] [log] > – "[stream-controller]:" – "Level 0 loaded [1,184][part-184--1], cc [0, 0] duration:734" (hls__js.js, line 13939)
[Log] [log] > – "[buffer-controller]: Updating Media Source duration to 734.000" (hls__js.js, line 17219)
[Log] [log] > – "[stream-controller]:" – "Loading fragment 1 cc: 0 of [1-184] level: 0, target: 0" (hls__js.js, line 7719)
[Log] [log] > – "[stream-controller]:" – "IDLE->FRAG_LOADING" (hls__js.js, line 8399)
[Log] [log] > – "[transmuxer-interface, main]: Starting new transmux session for sn: 1 p: -1 level: 0 id: 1↵ discontinuity: true↵ trackSwitch…" (hls__js.js, line 13099)
"[transmuxer-interface, main]: Starting new transmux session for sn: 1 p: -1 level: 0 id: 1
discontinuity: true
trackSwitch: true
contiguous: false
accurateTimeOffset: true
timeOffset: 0
initSegmentChange: true"
[Log] [log] > – "[mp4-remuxer]: ISGenerated flag reset" (hls__js.js, line 11584)
[Log] [log] > – "[mp4-remuxer]: initPTS & initDTS reset" (hls__js.js, line 11575)
[Log] [log] > – "[mp4-remuxer]: reset next timestamp" (hls__js.js, line 11579)
[Log] [log] > – "manifest codec:mp4a.40.2, ADTS type:2, samplingIndex:3" (hls__js.js, line 8609)
[Log] [log] > – "parsed codec:mp4a.40.5, rate:48000, channels:2" (hls__js.js, line 8699)
[Log] [log] > – "[stream-controller]:" – "FRAG_LOADING->PARSING" (hls__js.js, line 8399)
[Log] [log] > – "[stream-controller]:" – "Init audio buffer, container:audio/mp4, codecs[selected/level/parsed]=[mp4a.40.2/mp4a.40.2/mp4a.40.5]" (hls__js.js, line 14407)
[Log] [log] > – "[stream-controller]:" – "Init video buffer, container:video/mp4, codecs[level/parsed]=[avc1.42001e/avc1.42c00d]" (hls__js.js, line 14412)
[Log] [log] > – "[buffer-controller]: creating sourceBuffer(audio/mp4;codecs=mp4a.40.2)" (hls__js.js, line 17279)
[Log] [log] > – "[buffer-controller]: creating sourceBuffer(video/mp4;codecs=avc1.42001e)" (hls__js.js, line 17279)
[Log] [log] > – "[audio-stream-controller]:" – "InitPTS for cc: 0 found from main: 896160" (hls__js.js, line 15076)
[Log] [log] > – "[stream-controller]:" – "Loaded fragment 1 of level 0" (hls__js.js, line 7488)
[Log] [log] > – "[transmuxer.ts]: Flushed fragment 1 of level 0" (hls__js.js, line 12608)
[Log] [log] > – "[stream-controller]:" – "PARSING->PARSED" (hls__js.js, line 8399)
[Log] [log] > – "[stream-controller]:" – "Buffered main sn: 1 of level 0 (frag:[0.000-4.053] > buffer:[0.043-4.043])" (hls__js.js, line 7620)
[Log] [log] > – "[stream-controller]:" – "PARSED->IDLE" (hls__js.js, line 8399)
[Log] [log] > – "[stream-controller]:" – "Adapting to level 2 from level 0" (hls__js.js, line 13685)
[Log] [log] > – "[level-controller]:" – "Switching to level 2 from level 0" (hls__js.js, line 5423)
[Log] [log] > – "[level-controller]:" – "Loading level index 2 with URI 1/1 https://demo.unified-streaming.com/k8s/features/stable/video/tears-of-steel/tears-of-steel.ism/tears-of-s…" (hls__js.js, line 5553)
"Loading level index 2 with URI 1/1 https://demo.unified-streaming.com/k8s/features/stable/video/tears-of-steel/tears-of-steel.ism/tears-of-steel-audio_eng=128002-video_eng=1001000.m3u8"
[Log] [log] > – "[stream-controller]:" – "IDLE->WAITING_LEVEL" (hls__js.js, line 8399)
[Log] [log] > – "[stream-controller]:" – "Level 2 loaded [1,184][part-184--1], cc [0, 0] duration:734" (hls__js.js, line 13939)
[Log] [log] > – "[stream-controller]:" – "WAITING_LEVEL->IDLE" (hls__js.js, line 8399)
[Log] [log] > – "[stream-controller]:" – "Loading fragment 1 cc: 0 of [1-184] level: 2, target: 0" (hls__js.js, line 7719)
[Log] [log] > – "[stream-controller]:" – "IDLE->FRAG_LOADING" (hls__js.js, line 8399)
[Log] [log] > – "[buffer-controller]: Media source closed" (hls__js.js, line 16718)
[Log] (2) (index.tsx, line 57)
Event {isTrusted: true, type: "error", target: <video>, currentTarget: <video>, eventPhase: 2, …}
undefined
[Log] [log] > – "[transmuxer-interface, main]: Starting new transmux session for sn: 1 p: -1 level: 2 id: 1↵ discontinuity: false↵ …" (hls__js.js, line 13099)
"[transmuxer-interface, main]: Starting new transmux session for sn: 1 p: -1 level: 2 id: 1
discontinuity: false
trackSwitch: true
contiguous: false
accurateTimeOffset: true
timeOffset: 0
initSegmentChange: false"
[Log] [log] > – "[mp4-remuxer]: ISGenerated flag reset" (hls__js.js, line 11584)
[Log] [log] > – "[mp4-remuxer]: initPTS & initDTS reset" (hls__js.js, line 11575)
[Log] [log] > – "[mp4-remuxer]: reset next timestamp" (hls__js.js, line 11579)
[Log] [log] > – "manifest codec:mp4a.40.2, ADTS type:2, samplingIndex:3" (hls__js.js, line 8609)
[Log] [log] > – "parsed codec:mp4a.40.5, rate:48000, channels:2" (hls__js.js, line 8699)
[Log] [log] > – "[stream-controller]:" – "FRAG_LOADING->PARSING" (hls__js.js, line 8399)
[Log] [log] > – "[stream-controller]:" – "Init audio buffer, container:audio/mp4, codecs[selected/level/parsed]=[mp4a.40.2/mp4a.40.2/mp4a.40.5]" (hls__js.js, line 14407)
[Log] [log] > – "[stream-controller]:" – "Init video buffer, container:video/mp4, codecs[level/parsed]=[avc1.4d001f/avc1.4d401f]" (hls__js.js, line 14412)
[Log] hlsError – {type: "mediaError", parent: "main", details: "bufferAppendError", …} (index.tsx, line 57)
{type: "mediaError", parent: "main", details: "bufferAppendError", frag: Fragment, part: null, …}Object
[Log] hlsError – {type: "mediaError", parent: "main", details: "bufferAppendError", …} (index.tsx, line 57)
{type: "mediaError", parent: "main", details: "bufferAppendError", frag: Fragment, part: null, …}Object
[Log] hlsError – {type: "mediaError", parent: "main", details: "bufferAppendError", …} (index.tsx, line 57)
{type: "mediaError", parent: "main", details: "bufferAppendError", frag: Fragment, part: null, …}Object
[Log] [log] > – "[stream-controller]:" – "PARSING->ERROR" (hls__js.js, line 8399)
[Log] [log] > – "[audio-stream-controller]:" – "STOPPED->ERROR" (hls__js.js, line 8399)
[Log] [log] > – "stopLoad" (hls__js.js, line 22986)
[Log] [log] > – "[stream-controller]:" – "ERROR->STOPPED" (hls__js.js, line 8399)
[Log] [log] > – "[audio-stream-controller]:" – "ERROR->STOPPED" (hls__js.js, line 8399)
[Log] [log] > – "[subtitle-stream-controller]:" – "IDLE->STOPPED" (hls__js.js, line 8399)
[Log] hlsError – {type: "mediaError", parent: "main", details: "bufferAppendError", …} (index.tsx, line 57)
{type: "mediaError", parent: "main", details: "bufferAppendError", frag: Fragment, part: null, …}Object
I think this is something to do with this bug: https://bugs.webkit.org/show_bug.cgi?id=146351#c5 Loading video element through custom URL scheme isn't working on webkitgtk yet.
I make a bunch of test and in the end was fault of a strange interaction of hls.js. I simply removed video.js and hls.js and pass the source to the video element and is working, very strange behavior though. I think some note for this could help other developers, also the performance of using vanilla video aren't amazing, i will try reintroduce video.js to see if it handle the fetching better.
Otherwise you know if it is possible to force the processing on a worker?
const ViedoHLS = (props: VideoDebugNodeProps) => {
const videoRef = useRef<HTMLVideoElement>(null);
...
return (
// eslint-disable-next-line react/jsx-props-no-spreading
<Collapse defaultActiveKey={[]}>
<Collapse.Panel header="Video Player" key="1">
<video
ref={videoRef}
controls
height={780}
onMo
onError={tryReload}
>
<source
src={"https://demo.unified-streaming.com/k8s/features/stable/video/tears-of-steel/tears-of-steel.ism/.m3u8"}
type="application/x-mpegURL"
/>
</video>
</Collapse.Panel>
</Collapse>
);
};