A BUNCH of HLS (and related) progress

- Add support for fMP4 segments
- Add initInput (supported by ISOBMFF and MPEG-TS)
- Input.isSupported()
- Refactored file size retrieval logic, the file size can now be retrieved alongside the first read.
- Add support for unsized UrlSources
- Add support for multiple trun boxes in a row for the same track (as the spec literally says lol)
- Add support for more M3U8 features
- Fix faulty line reader
- MPEG-TS improvements: support video parameters not in first packet, support better key frame detection, support extension PES packets without PTS
- Fix reorder buffer being 1 element too small
This commit is contained in:
Vanilagy
2026-02-20 19:56:20 +01:00
parent de84d78092
commit 68b3ae7155
73 changed files with 17552 additions and 967 deletions
+40 -1
View File
@@ -11,8 +11,33 @@
document.body.append(fileInput);
fileInput.addEventListener('change', async () => {
const file = fileInput.files[0];
const input = new Mediabunny.Input({
formats: Mediabunny.ALL_FORMATS,
source: new Mediabunny.BlobSource(file),
});
/*
const manifest = new Mediabunny.ManifestInput({
entryPath: 'https://playertest.longtailvideo.com/adaptive/aes-with-tracks/master.m3u8'
entryPath: /*'https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8' ?? 'https://bitmovin-a.akamaihd.net/content/dataset/multi-codec/hevc/v720p_ts.m3u8',
getSource: path => new Mediabunny.UrlSource(path),
manifestFormats: Mediabunny.ALL_MANIFEST_FORMATS,
mediaFormats: Mediabunny.ALL_FORMATS,
});
const variants = await manifest.getVariants();
const variant = variants[0];
const input = variant.toInput();
*/
const videoTrack = await input.getPrimaryVideoTrack();
const sink = new Mediabunny.EncodedPacketSink(videoTrack);
console.log(await sink.getPacket(17.48808888888889));
/*
const manifest = new Mediabunny.ManifestInput({
entryPath: 'https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/hls.m3u8'
?? 'https://playertest.longtailvideo.com/adaptive/vod-with-mp3/manifest.m3u8'
?? 'https://playertest.longtailvideo.com/adaptive/aes-with-tracks/master.m3u8'
?? 'https://playertest.longtailvideo.com/adaptive/customIV/prog_index.m3u8'
?? 'https://playertest.longtailvideo.com/adaptive/issue666/playlists/cisq0gim60007xzvi505emlxx.m3u8'
?? 'https://test-streams.mux.dev/dai-discontinuity-deltatre/manifest.m3u8'
@@ -27,6 +52,19 @@
});
const variants = await manifest.getVariants();
const variant = variants[0];
const firstSegment = await variant.getFirstSegment();
const input = await firstSegment.toInput();
const videoTrack = await input.getPrimaryVideoTrack();
const sink = new Mediabunny.EncodedPacketSink(videoTrack);
for await (const packet of sink.packets()) {
console.log(packet.byteLength, packet.timestamp, packet.duration)
}
*/
/*
return;
const variant = variants[2];//variants.find(x => x.path.endsWith('aac/und/stream.m3u8'));
const input = variant.toInput();
const audioTrack = await input.getPrimaryAudioTrack();
@@ -35,6 +73,7 @@
for await (const packet of sink.packets()) {
console.log(packet.timestamp, packet.duration)
}
*/
/*
const file = fileInput.files[0];