Metamuxer -> Mediabunny

This commit is contained in:
Vanilagy
2025-06-16 15:55:38 +02:00
parent 99f813c938
commit f675966004
17 changed files with 126 additions and 126 deletions
+6 -6
View File
@@ -12,11 +12,11 @@ const umdConfig = {
format: 'iife', format: 'iife',
// The following are hacks to basically make this an UMD module. No native support for that in esbuild as of today // The following are hacks to basically make this an UMD module. No native support for that in esbuild as of today
globalName: 'Metamuxer', globalName: 'Mediabunny',
footer: { footer: {
js: js:
`if (typeof module === "object" && typeof module.exports === "object") Object.assign(module.exports, Metamuxer)`, `if (typeof module === "object" && typeof module.exports === "object") Object.assign(module.exports, Mediabunny)`,
}, },
}; };
@@ -27,20 +27,20 @@ const esmConfig = {
const ctxUmd = await esbuild.context({ const ctxUmd = await esbuild.context({
...umdConfig, ...umdConfig,
outfile: 'dist/metamuxer.js', outfile: 'dist/mediabunny.js',
}); });
const ctxEsm = await esbuild.context({ const ctxEsm = await esbuild.context({
...esmConfig, ...esmConfig,
outfile: 'dist/metamuxer.mjs', outfile: 'dist/mediabunny.mjs',
}); });
const ctxUmdMinified = await esbuild.context({ const ctxUmdMinified = await esbuild.context({
...umdConfig, ...umdConfig,
outfile: 'dist/metamuxer.min.js', outfile: 'dist/mediabunny.min.js',
minify: true, minify: true,
}); });
const ctxEsmMinified = await esbuild.context({ const ctxEsmMinified = await esbuild.context({
...esmConfig, ...esmConfig,
outfile: 'dist/metamuxer.min.mjs', outfile: 'dist/mediabunny.min.mjs',
minify: true, minify: true,
}); });
+11 -11
View File
@@ -1,6 +1,6 @@
<!DOCTYPE html> <!DOCTYPE html>
<script src="../dist/metamuxer.js"></script> <script src="../dist/mediabunny.js"></script>
<script type="module"> <script type="module">
const fileInput = document.createElement('input'); const fileInput = document.createElement('input');
@@ -14,26 +14,26 @@
fileInput.addEventListener('change', async () => { fileInput.addEventListener('change', async () => {
const file = fileInput.files[0]; const file = fileInput.files[0];
const source = new Metamuxer.BlobSource(file); const source = new Mediabunny.BlobSource(file);
const target = new Metamuxer.BufferTarget() ?? new Metamuxer.StreamTarget(new WritableStream({ const target = new Mediabunny.BufferTarget() ?? new Mediabunny.StreamTarget(new WritableStream({
write: console.log write: console.log
}), { }), {
chunked: true, chunked: true,
chunkSize: 2**20 chunkSize: 2**20
}); });
const outputFormat = new Metamuxer.MovOutputFormat(); const outputFormat = new Mediabunny.MovOutputFormat();
const button = document.createElement('button'); const button = document.createElement('button');
button.textContent = 'Cancel'; button.textContent = 'Cancel';
button.onclick = () => conversion.cancel(); button.onclick = () => conversion.cancel();
document.body.append(button); document.body.append(button);
const conversion = await Metamuxer.Conversion.init({ const conversion = await Mediabunny.Conversion.init({
input: new Metamuxer.Input({ input: new Mediabunny.Input({
formats: Metamuxer.ALL_FORMATS, formats: Mediabunny.ALL_FORMATS,
source source
}), }),
output: new Metamuxer.Output({ output: new Mediabunny.Output({
format: outputFormat, format: outputFormat,
target target
}), }),
@@ -47,15 +47,15 @@
/* /*
video: { video: {
discard: true, discard: true,
bitrate: Metamuxer.QUALITY_VERY_HIGH, bitrate: Mediabunny.QUALITY_VERY_HIGH,
//bitrate: Metamuxer.QUALITY_VERY_HIGH //bitrate: Mediabunny.QUALITY_VERY_HIGH
codec: 'av1', codec: 'av1',
//width: 800, //width: 800,
//fit: 'fill', //fit: 'fill',
//rotate: 90, //rotate: 90,
}, },
audio: { audio: {
bitrate: Metamuxer.QUALITY_HIGH, bitrate: Mediabunny.QUALITY_HIGH,
codec: 'aac', codec: 'aac',
}, },
*/ */
+59 -59
View File
@@ -1,6 +1,6 @@
<!DOCTYPE html> <!DOCTYPE html>
<script src="../dist/metamuxer.js"></script> <script src="../dist/mediabunny.js"></script>
<script type="module"> <script type="module">
const fileInput = document.createElement('input'); const fileInput = document.createElement('input');
@@ -9,16 +9,16 @@
fileInput.addEventListener('change', async () => { fileInput.addEventListener('change', async () => {
const file = fileInput.files[0]; const file = fileInput.files[0];
const source = new Metamuxer.BlobSource(file); const source = new Mediabunny.BlobSource(file);
const input = new Metamuxer.Input({ const input = new Mediabunny.Input({
formats: Metamuxer.ALL_FORMATS, formats: Mediabunny.ALL_FORMATS,
source source
}); });
const videoTrack = await input.getPrimaryVideoTrack(); const videoTrack = await input.getPrimaryVideoTrack();
const sink = new Metamuxer.EncodedPacketSink(videoTrack); const sink = new Mediabunny.EncodedPacketSink(videoTrack);
for await (const packet of sink.packets()) { for await (const packet of sink.packets()) {
if (packet.timestamp >= 2) break; if (packet.timestamp >= 2) break;
console.log(packet); console.log(packet);
@@ -26,7 +26,7 @@
/* /*
let timestamps = []; let timestamps = [];
const packetSink = new Metamuxer.EncodedPacketSink(videoTrack); const packetSink = new Mediabunny.EncodedPacketSink(videoTrack);
for await (const packet of packetSink.packets()) { for await (const packet of packetSink.packets()) {
if (packet.timestamp >= 1) { if (packet.timestamp >= 1) {
break; break;
@@ -83,14 +83,14 @@
//return; //return;
/* /*
console.log(timestamps); console.log(timestamps);
const sink = new Metamuxer.EncodedPacketSink(videoTrack); const sink = new Mediabunny.EncodedPacketSink(videoTrack);
for await (const packet of sink.packets()) { for await (const packet of sink.packets()) {
console.log(packet.sequenceNumber); console.log(packet.sequenceNumber);
} }
*/ */
/* /*
const sink = new Metamuxer.VideoSampleSink(videoTrack); const sink = new Mediabunny.VideoSampleSink(videoTrack);
for await (const sample of sink.samplesAtTimestamps(timestamps)) { for await (const sample of sink.samplesAtTimestamps(timestamps)) {
console.log("wee", sample.timestamp); console.log("wee", sample.timestamp);
sample.close(); sample.close();
@@ -99,7 +99,7 @@
*/ */
/* /*
const sink = new Metamuxer.CanvasSink(videoTrack, { width: 320 }); const sink = new Mediabunny.CanvasSink(videoTrack, { width: 320 });
for await (const wrappedCanvas of sink.canvasesAtTimestamps(timestamps)) { for await (const wrappedCanvas of sink.canvasesAtTimestamps(timestamps)) {
console.log(wrappedCanvas); console.log(wrappedCanvas);
} }
@@ -129,15 +129,15 @@
/* /*
const output = new Metamuxer.Output({ const output = new Mediabunny.Output({
format: new Metamuxer.Mp3OutputFormat(), format: new Mediabunny.Mp3OutputFormat(),
target: new Metamuxer.BufferTarget() target: new Mediabunny.BufferTarget()
}); });
const audioTrack = await input.getPrimaryAudioTrack(); const audioTrack = await input.getPrimaryAudioTrack();
const sink = new Metamuxer.AudioDataSink(audioTrack); const sink = new Mediabunny.AudioDataSink(audioTrack);
const mediaSource = new Metamuxer.AudioDataSource({ const mediaSource = new Mediabunny.AudioDataSource({
codec: 'mp3', codec: 'mp3',
bitrate: 192000 bitrate: 192000
}); });
@@ -167,31 +167,31 @@
/* /*
const videoTrack = await input.getPrimaryVideoTrack(); const videoTrack = await input.getPrimaryVideoTrack();
const sink = new Metamuxer.EncodedVideoSampleSink(videoTrack); const sink = new Mediabunny.EncodedVideoSampleSink(videoTrack);
console.log(await sink.getSample(16)); console.log(await sink.getSample(16));
console.log(await sink.getFirstSample()); console.log(await sink.getFirstSample());
*/ */
/* /*
const source = new Metamuxer.BufferSource(await file.arrayBuffer()) ?? new Metamuxer.BlobSource(file); const source = new Mediabunny.BufferSource(await file.arrayBuffer()) ?? new Mediabunny.BlobSource(file);
const start = performance.now(); const start = performance.now();
const input = new Metamuxer.Input({ const input = new Mediabunny.Input({
formats: Metamuxer.ALL_FORMATS, formats: Mediabunny.ALL_FORMATS,
source source
}); });
const output = new Metamuxer.Output({ const output = new Mediabunny.Output({
format: new Metamuxer.WaveOutputFormat(), format: new Mediabunny.WaveOutputFormat(),
target: new Metamuxer.BufferTarget() target: new Mediabunny.BufferTarget()
}); });
output.start(); output.start();
*/ */
/* /*
const audioTrack = await input.getPrimaryAudioTrack(); const audioTrack = await input.getPrimaryAudioTrack();
const sink = new Metamuxer.EncodedAudioSampleSink(audioTrack); const sink = new Mediabunny.EncodedAudioSampleSink(audioTrack);
let total = 0; let total = 0;
for await (const sample of sink.samples(undefined, undefined, { metadataOnly: true })) { for await (const sample of sink.samples(undefined, undefined, { metadataOnly: true })) {
@@ -204,7 +204,7 @@
*/ */
/* /*
const sink = new Metamuxer.VideoFrameSink(videoTrack); const sink = new Mediabunny.VideoFrameSink(videoTrack);
console.log(await videoTrack.getLanguageCode()); console.log(await videoTrack.getLanguageCode());
@@ -219,9 +219,9 @@
//console.log(await videoTrack.computeSampleStats()); //console.log(await videoTrack.computeSampleStats());
//return; //return;
const target = new Metamuxer.BufferTarget(); const target = new Mediabunny.BufferTarget();
const output = new Metamuxer.Output({ const output = new Mediabunny.Output({
format: new Metamuxer.WaveOutputFormat(), format: new Mediabunny.WaveOutputFormat(),
target target
}); });
@@ -230,12 +230,12 @@
const audioTrack = await input.getPrimaryAudioTrack(); const audioTrack = await input.getPrimaryAudioTrack();
const videoTrack = await input.getPrimaryVideoTrack(); const videoTrack = await input.getPrimaryVideoTrack();
const sink = new Metamuxer.EncodedAudioSampleSink(audioTrack); const sink = new Mediabunny.EncodedAudioSampleSink(audioTrack);
const decoderConfig = await audioTrack.getDecoderConfig(); const decoderConfig = await audioTrack.getDecoderConfig();
const sampleSource = new Metamuxer.EncodedAudioSampleSource(await audioTrack.getCodec()); const sampleSource = new Mediabunny.EncodedAudioSampleSource(await audioTrack.getCodec());
const audioDataSource = new Metamuxer.AudioDataSource({ codec: 'pcm-s16', bitrate: 128e3 }); const audioDataSource = new Mediabunny.AudioDataSource({ codec: 'pcm-s16', bitrate: 128e3 });
const videoSampleSource = new Metamuxer.EncodedVideoSampleSource(await videoTrack.getCodec()); const videoSampleSource = new Mediabunny.EncodedVideoSampleSource(await videoTrack.getCodec());
output.addAudioTrack(audioDataSource ?? sampleSource); output.addAudioTrack(audioDataSource ?? sampleSource);
//output.addVideoTrack(videoSampleSource); //output.addVideoTrack(videoSampleSource);
@@ -253,12 +253,12 @@
// //console.log(sample) // //console.log(sample)
// await sampleSource.add(sample, { decoderConfig }); // await sampleSource.add(sample, { decoderConfig });
//} //}
for await (const { data, timestamp } of new Metamuxer.AudioDataSink(audioTrack).data()) { for await (const { data, timestamp } of new Mediabunny.AudioDataSink(audioTrack).data()) {
//console.log("wow", data.timestamp); //console.log("wow", data.timestamp);
//console.log(sample) //console.log(sample)
await audioDataSource.add(data); await audioDataSource.add(data);
} }
//for await (const sample of new Metamuxer.EncodedVideoSampleSink(videoTrack).samples()) { //for await (const sample of new Mediabunny.EncodedVideoSampleSink(videoTrack).samples()) {
// //console.log(sample) // //console.log(sample)
// await videoSampleSource.add(sample, { decoderConfig: videoDecoderConfig }); // await videoSampleSource.add(sample, { decoderConfig: videoDecoderConfig });
//} //}
@@ -281,13 +281,13 @@
*/ */
/* /*
const input2 = new Metamuxer.Input({ const input2 = new Mediabunny.Input({
formats: Metamuxer.ALL_FORMATS, formats: Mediabunny.ALL_FORMATS,
source: new Metamuxer.BufferSource(target.buffer) source: new Mediabunny.BufferSource(target.buffer)
}); });
const videoTrack2 = await input2.getPrimaryVideoTrack(); const videoTrack2 = await input2.getPrimaryVideoTrack();
const drain2 = new Metamuxer.EncodedVideoSampleDrain(videoTrack2); const drain2 = new Mediabunny.EncodedVideoSampleDrain(videoTrack2);
let i = 0; let i = 0;
for await (const sample of drain2.samples(undefined, undefined)) { for await (const sample of drain2.samples(undefined, undefined)) {
@@ -302,13 +302,13 @@
/* /*
const videoTrack = await input.getPrimaryVideoTrack(); const videoTrack = await input.getPrimaryVideoTrack();
const drain = new Metamuxer.VideoFrameDrain(videoTrack); const drain = new Mediabunny.VideoFrameDrain(videoTrack);
async function* timestamps() { async function* timestamps() {
const fromTime = 0; const fromTime = 0;
const toTime = await videoTrack.computeDuration(); const toTime = await videoTrack.computeDuration();
const extractDuration = toTime - fromTime; const extractDuration = toTime - fromTime;
const drain = new Metamuxer.EncodedVideoSampleDrain(videoTrack); const drain = new Mediabunny.EncodedVideoSampleDrain(videoTrack);
const thumbnailsNeeded = 16; const thumbnailsNeeded = 16;
for (let i = 0; i < thumbnailsNeeded; i++) { for (let i = 0; i < thumbnailsNeeded; i++) {
@@ -341,7 +341,7 @@
/* /*
const audioTrack = await input.getPrimaryVideoTrack(); const audioTrack = await input.getPrimaryVideoTrack();
const drain = new Metamuxer.EncodedVideoChunkDrain(audioTrack); const drain = new Mediabunny.EncodedVideoChunkDrain(audioTrack);
for await (const chunk of drain.chunks()) { for await (const chunk of drain.chunks()) {
//console.log(chunk); //console.log(chunk);
@@ -352,7 +352,7 @@
/* /*
const drain = new Metamuxer.AudioBufferDrain(audioTrack); const drain = new Mediabunny.AudioBufferDrain(audioTrack);
const chunks = drain.buffers() const chunks = drain.buffers()
const a = chunks.next(); const a = chunks.next();
@@ -364,13 +364,13 @@
/* /*
const videoTrack = await input.getPrimaryVideoTrack(); const videoTrack = await input.getPrimaryVideoTrack();
const drain = new Metamuxer.VideoFrameDrain(videoTrack); const drain = new Mediabunny.VideoFrameDrain(videoTrack);
const target = new Metamuxer.ArrayBufferTarget(); const target = new Mediabunny.ArrayBufferTarget();
const format = new Metamuxer.Mp4OutputFormat(); const format = new Mediabunny.Mp4OutputFormat();
const output = new Metamuxer.Output({ target, format }); const output = new Mediabunny.Output({ target, format });
const mediaSource = new Metamuxer.VideoFrameSource({ const mediaSource = new Mediabunny.VideoFrameSource({
codec: 'av1', codec: 'av1',
bitrate: 1e6 bitrate: 1e6
}); });
@@ -398,13 +398,13 @@
/* /*
const videoTrack = await input.getPrimaryVideoTrack(); const videoTrack = await input.getPrimaryVideoTrack();
const drain = new Metamuxer.VideoFrameDrain(videoTrack); const drain = new Mediabunny.VideoFrameDrain(videoTrack);
async function* timestamps() { async function* timestamps() {
const fromTime = 0; const fromTime = 0;
const toTime = await videoTrack.computeDuration(); const toTime = await videoTrack.computeDuration();
const extractDuration = toTime - fromTime; const extractDuration = toTime - fromTime;
const drain = new Metamuxer.EncodedVideoChunkDrain(videoTrack); const drain = new Mediabunny.EncodedVideoChunkDrain(videoTrack);
const thumbnailsNeeded = 16; const thumbnailsNeeded = 16;
for (let i = 0; i < thumbnailsNeeded; i++) { for (let i = 0; i < thumbnailsNeeded; i++) {
@@ -438,7 +438,7 @@
/* /*
const videoTrack = await input.getPrimaryVideoTrack(); const videoTrack = await input.getPrimaryVideoTrack();
const drain = new Metamuxer.VideoFrameDrain(videoTrack); const drain = new Mediabunny.VideoFrameDrain(videoTrack);
const width = await videoTrack.getWidth(); const width = await videoTrack.getWidth();
const height = await videoTrack.getHeight(); const height = await videoTrack.getHeight();
@@ -467,7 +467,7 @@
/* /*
const audioTrack = await input.getPrimaryAudioTrack(); const audioTrack = await input.getPrimaryAudioTrack();
const drain = new Metamuxer.AudioBufferDrain(audioTrack); const drain = new Mediabunny.AudioBufferDrain(audioTrack);
const context = new AudioContext(); const context = new AudioContext();
const startTime = context.currentTime; const startTime = context.currentTime;
@@ -493,7 +493,7 @@
*/ */
/* /*
const drain = new Metamuxer.AudioDataDrain(audioTrack); const drain = new Mediabunny.AudioDataDrain(audioTrack);
console.time() console.time()
for await (const data of drain.data()) { for await (const data of drain.data()) {
@@ -504,7 +504,7 @@
/* /*
const drain = new Metamuxer.EncodedAudioChunkDrain(audioTrack); const drain = new Mediabunny.EncodedAudioChunkDrain(audioTrack);
for await (const chunk of drain.chunks()) { for await (const chunk of drain.chunks()) {
console.log(chunk); console.log(chunk);
@@ -517,7 +517,7 @@
/* /*
const videoTrack = await input.getPrimaryVideoTrack(); const videoTrack = await input.getPrimaryVideoTrack();
const drain = new Metamuxer.VideoFrameDrain(videoTrack); const drain = new Mediabunny.VideoFrameDrain(videoTrack);
const width = await videoTrack.getWidth(); const width = await videoTrack.getWidth();
const height = await videoTrack.getHeight(); const height = await videoTrack.getHeight();
@@ -536,7 +536,7 @@
*/ */
/* /*
const drain = new Metamuxer.EncodedVideoChunkDrain(videoTrack); const drain = new Mediabunny.EncodedVideoChunkDrain(videoTrack);
const startChunk = await drain.getFirstChunk(); const startChunk = await drain.getFirstChunk();
for await (const chunk of drain.chunks(startChunk)) { for await (const chunk of drain.chunks(startChunk)) {
@@ -552,7 +552,7 @@
*/ */
/* /*
const drain = new Metamuxer.VideoFrameDrain(videoTrack); const drain = new Mediabunny.VideoFrameDrain(videoTrack);
for await (const frame of drain.frames()) { for await (const frame of drain.frames()) {
// ... // ...
@@ -562,7 +562,7 @@
*/ */
/* /*
const drain = new Metamuxer.VideoFrameDrain(videoTrack); const drain = new Mediabunny.VideoFrameDrain(videoTrack);
const width = await videoTrack.getWidth(); const width = await videoTrack.getWidth();
@@ -584,7 +584,7 @@
/* /*
const videoTrack = await input.getPrimaryVideoTrack(); const videoTrack = await input.getPrimaryVideoTrack();
const drain = new Metamuxer.VideoFrameDrain(videoTrack); const drain = new Mediabunny.VideoFrameDrain(videoTrack);
for await (const frame of drain.frames(0.01)) { for await (const frame of drain.frames(0.01)) {
console.log(frame) console.log(frame)
@@ -597,7 +597,7 @@
*/ */
/* /*
const drain = new Metamuxer.EncodedVideoChunkDrain(videoTrack); const drain = new Mediabunny.EncodedVideoChunkDrain(videoTrack);
const decoder = new VideoDecoder({ const decoder = new VideoDecoder({
output: console.log, output: console.log,
@@ -622,7 +622,7 @@
/* /*
const drain = new Metamuxer.VideoFrameDrain(videoTrack); const drain = new Mediabunny.VideoFrameDrain(videoTrack);
const frame = await drain.getKeyFrame(69); const frame = await drain.getKeyFrame(69);
@@ -636,7 +636,7 @@
*/ */
/* /*
const drain = new Metamuxer.EncodedVideoChunkDrain(videoTrack); const drain = new Mediabunny.EncodedVideoChunkDrain(videoTrack);
for await (const chunk of drain.chunks()) { for await (const chunk of drain.chunks()) {
console.log(chunk); console.log(chunk);
+8 -8
View File
@@ -1,6 +1,6 @@
<button>Go</button> <button>Go</button>
<script src="../dist/metamuxer.js"></script> <script src="../dist/mediabunny.js"></script>
<script type="module"> <script type="module">
function download(blob, filename) { function download(blob, filename) {
@@ -18,20 +18,20 @@
const videoTrack = stream.getVideoTracks()[0]; const videoTrack = stream.getVideoTracks()[0];
const audioTrack = stream.getAudioTracks()[0]; const audioTrack = stream.getAudioTracks()[0];
const output = new Metamuxer.Output({ const output = new Mediabunny.Output({
target: new Metamuxer.BufferTarget(), target: new Mediabunny.BufferTarget(),
format: new Metamuxer.Mp4OutputFormat(), format: new Mediabunny.Mp4OutputFormat(),
}); });
if (videoTrack) { if (videoTrack) {
output.addVideoTrack(new Metamuxer.MediaStreamVideoTrackSource(videoTrack, { output.addVideoTrack(new Mediabunny.MediaStreamVideoTrackSource(videoTrack, {
codec: 'avc', codec: 'avc',
bitrate: Metamuxer.QUALITY_MEDIUM bitrate: Mediabunny.QUALITY_MEDIUM
})); }));
} }
if (audioTrack) { if (audioTrack) {
output.addAudioTrack(new Metamuxer.MediaStreamAudioTrackSource(audioTrack, { output.addAudioTrack(new Mediabunny.MediaStreamAudioTrackSource(audioTrack, {
codec: 'aac', codec: 'aac',
bitrate: Metamuxer.QUALITY_MEDIUM bitrate: Mediabunny.QUALITY_MEDIUM
})); }));
} }
+17 -17
View File
@@ -1,6 +1,6 @@
<!DOCTYPE html> <!DOCTYPE html>
<script src="../dist/metamuxer.js"></script> <script src="../dist/mediabunny.js"></script>
<script type="module"> <script type="module">
function download(blob, filename) { function download(blob, filename) {
@@ -38,17 +38,17 @@
canvas.height = 720; canvas.height = 720;
const context = canvas.getContext('2d'); const context = canvas.getContext('2d');
let format = new Metamuxer.MkvOutputFormat({ streamable: false }); let format = new Mediabunny.MkvOutputFormat({ streamable: false });
format = new Metamuxer.Mp4OutputFormat({ fastStart: 'fragmented' }); // new Metamuxer.MkvOutputFormat();// new Metamuxer.Mp4OutputFormat({ fastStart: false }); format = new Mediabunny.Mp4OutputFormat({ fastStart: 'fragmented' }); // new Mediabunny.MkvOutputFormat();// new Mediabunny.Mp4OutputFormat({ fastStart: false });
format = new Metamuxer.OggOutputFormat(); format = new Mediabunny.OggOutputFormat();
format = new Metamuxer.Mp4OutputFormat({ fastStart: 'fragmented', minimumFragmentDuration: 2 }); format = new Mediabunny.Mp4OutputFormat({ fastStart: 'fragmented', minimumFragmentDuration: 2 });
format = new Metamuxer.MkvOutputFormat({ minimumClusterDuration: 2 }); format = new Mediabunny.MkvOutputFormat({ minimumClusterDuration: 2 });
format = new Metamuxer.WavOutputFormat(); format = new Mediabunny.WavOutputFormat();
format = new Metamuxer.MkvOutputFormat(); format = new Mediabunny.MkvOutputFormat();
let target = new Metamuxer.BufferTarget(); let target = new Mediabunny.BufferTarget();
/* /*
target = new Metamuxer.StreamTarget(new WritableStream({ target = new Mediabunny.StreamTarget(new WritableStream({
async write(chunk) { async write(chunk) {
console.log(chunk) console.log(chunk)
@@ -57,12 +57,12 @@
}), { chunked: true }); }), { chunked: true });
*/ */
let output = new Metamuxer.Output({ format, target }); let output = new Mediabunny.Output({ format, target });
/* /*
let sourcy = new Metamuxer.AudioBufferSource({ let sourcy = new Mediabunny.AudioBufferSource({
codec: 'pcm-s16', codec: 'pcm-s16',
bitrate: Metamuxer.QUALITY_HIGH bitrate: Mediabunny.QUALITY_HIGH
}); });
output.addAudioTrack(sourcy); output.addAudioTrack(sourcy);
@@ -86,7 +86,7 @@
*/ */
/* /*
let videoSource = new Metamuxer.EncodedVideoChunkSource('avc'); let videoSource = new Mediabunny.EncodedVideoChunkSource('avc');
output.addTrack(videoSource); output.addTrack(videoSource);
output.start(); output.start();
@@ -114,16 +114,16 @@
download(new Blob([target.buffer]), 'test.mkv'); download(new Blob([target.buffer]), 'test.mkv');
*/ */
let videoSource = new Metamuxer.CanvasSource(canvas, { let videoSource = new Mediabunny.CanvasSource(canvas, {
codec: 'avc', codec: 'avc',
//fullCodecString: 'avc1.42001f', //fullCodecString: 'avc1.42001f',
bitrate: 1e6 bitrate: 1e6
}); });
let audioSource = new Metamuxer.AudioBufferSource({ let audioSource = new Mediabunny.AudioBufferSource({
codec: 'opus', codec: 'opus',
bitrate: 128e3, bitrate: 128e3,
}); });
let subtitleSource = new Metamuxer.TextSubtitleSource('webvtt'); let subtitleSource = new Mediabunny.TextSubtitleSource('webvtt');
output.addVideoTrack(videoSource, { languageCode: 'eng' }); output.addVideoTrack(videoSource, { languageCode: 'eng' });
output.addAudioTrack(audioSource); output.addAudioTrack(audioSource);
+6 -6
View File
@@ -15,7 +15,7 @@
</div> </div>
</div> </div>
<script src="../dist/metamuxer.js"></script> <script src="../dist/mediabunny.js"></script>
<script type="module"> <script type="module">
const fileInput = document.querySelector('input[type="file"]'); const fileInput = document.querySelector('input[type="file"]');
@@ -34,10 +34,10 @@ const file = await new Promise(resolve => {
fileInput.style.display = 'none'; fileInput.style.display = 'none';
const audioContext = new AudioContext(); const audioContext = new AudioContext();
const source = new Metamuxer.BlobSource(file); const source = new Mediabunny.BlobSource(file);
const input = new Metamuxer.Input({ const input = new Mediabunny.Input({
formats: Metamuxer.ALL_FORMATS, formats: Mediabunny.ALL_FORMATS,
source source
}); });
@@ -69,8 +69,8 @@ durationElement.textContent = formatSeconds(totalDuration);
playerDiv.style.display = 'flex'; playerDiv.style.display = 'flex';
const videoSink = videoTrack && new Metamuxer.CanvasSink(videoTrack, { poolSize: 2 }); const videoSink = videoTrack && new Mediabunny.CanvasSink(videoTrack, { poolSize: 2 });
const audioSink = audioTrack && new Metamuxer.AudioBufferSink(audioTrack); const audioSink = audioTrack && new Mediabunny.AudioBufferSink(audioTrack);
let startTime = null; let startTime = null;
let playing = false; let playing = false;
+1 -1
View File
@@ -43,7 +43,7 @@
</div> </div>
<a <a
href="https://github.com/Vanilagy/metamuxer/tree/main/examples/file-compression" href="https://github.com/Vanilagy/mediabunny/tree/main/examples/file-compression"
target="_blank" target="_blank"
class="flex items-center gap-2 fixed top-0 right-0 py-2 px-5 bg-zinc-200 dark:bg-zinc-750 hover:bg-zinc-300 dark:hover:bg-zinc-700 rounded-bl-xl" class="flex items-center gap-2 fixed top-0 right-0 py-2 px-5 bg-zinc-200 dark:bg-zinc-750 hover:bg-zinc-300 dark:hover:bg-zinc-700 rounded-bl-xl"
> >
+1 -1
View File
@@ -44,7 +44,7 @@
</div> </div>
<a <a
href="https://github.com/Vanilagy/metamuxer/tree/main/examples/live-recording" href="https://github.com/Vanilagy/mediabunny/tree/main/examples/live-recording"
target="_blank" target="_blank"
class="flex items-center gap-2 fixed top-0 right-0 py-2 px-5 bg-zinc-200 dark:bg-zinc-750 hover:bg-zinc-300 dark:hover:bg-zinc-700 rounded-bl-xl" class="flex items-center gap-2 fixed top-0 right-0 py-2 px-5 bg-zinc-200 dark:bg-zinc-750 hover:bg-zinc-300 dark:hover:bg-zinc-700 rounded-bl-xl"
> >
+1 -1
View File
@@ -79,7 +79,7 @@
</div> </div>
<a <a
href="https://github.com/Vanilagy/metamuxer/tree/main/examples/media-player" href="https://github.com/Vanilagy/mediabunny/tree/main/examples/media-player"
target="_blank" target="_blank"
class="flex items-center gap-2 fixed top-0 right-0 py-2 px-5 bg-zinc-200 dark:bg-zinc-750 hover:bg-zinc-300 dark:hover:bg-zinc-700 rounded-bl-xl" class="flex items-center gap-2 fixed top-0 right-0 py-2 px-5 bg-zinc-200 dark:bg-zinc-750 hover:bg-zinc-300 dark:hover:bg-zinc-700 rounded-bl-xl"
> >
+1 -1
View File
@@ -36,7 +36,7 @@
</div> </div>
<a <a
href="https://github.com/Vanilagy/metamuxer/tree/main/examples/metadata-extraction" href="https://github.com/Vanilagy/mediabunny/tree/main/examples/metadata-extraction"
target="_blank" target="_blank"
class="flex items-center gap-2 fixed top-0 right-0 py-2 px-5 bg-zinc-200 dark:bg-zinc-750 hover:bg-zinc-300 dark:hover:bg-zinc-700 rounded-bl-xl" class="flex items-center gap-2 fixed top-0 right-0 py-2 px-5 bg-zinc-200 dark:bg-zinc-750 hover:bg-zinc-300 dark:hover:bg-zinc-700 rounded-bl-xl"
> >
+1 -1
View File
@@ -50,7 +50,7 @@
</div> </div>
<a <a
href="https://github.com/Vanilagy/metamuxer/tree/main/examples/procedural-generation" href="https://github.com/Vanilagy/mediabunny/tree/main/examples/procedural-generation"
target="_blank" target="_blank"
class="flex items-center gap-2 fixed top-0 right-0 py-2 px-5 bg-zinc-200 dark:bg-zinc-750 hover:bg-zinc-300 dark:hover:bg-zinc-700 rounded-bl-xl" class="flex items-center gap-2 fixed top-0 right-0 py-2 px-5 bg-zinc-200 dark:bg-zinc-750 hover:bg-zinc-300 dark:hover:bg-zinc-700 rounded-bl-xl"
> >
+1 -1
View File
@@ -36,7 +36,7 @@
</div> </div>
<a <a
href="https://github.com/Vanilagy/metamuxer/tree/main/examples/thumbnail-generation" href="https://github.com/Vanilagy/mediabunny/tree/main/examples/thumbnail-generation"
target="_blank" target="_blank"
class="flex items-center gap-2 fixed top-0 right-0 py-2 px-5 bg-gray-200 dark:bg-zinc-750 hover:bg-gray-300 dark:hover:bg-zinc-700 rounded-bl-xl" class="flex items-center gap-2 fixed top-0 right-0 py-2 px-5 bg-gray-200 dark:bg-zinc-750 hover:bg-gray-300 dark:hover:bg-zinc-700 rounded-bl-xl"
> >
+2 -2
View File
@@ -1,11 +1,11 @@
{ {
"name": "metamuxer", "name": "mediabunny",
"version": "0.1.0", "version": "0.1.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "metamuxer", "name": "mediabunny",
"version": "0.1.0", "version": "0.1.0",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
+8 -8
View File
@@ -1,15 +1,15 @@
{ {
"name": "metamuxer", "name": "mediabunny",
"version": "0.1.0", "version": "0.1.0",
"description": "TODO", "description": "TODO",
"type": "module", "type": "module",
"main": "./dist/metamuxer.js", "main": "./dist/mediabunny.js",
"module": "./dist/metamuxer.mjs", "module": "./dist/mediabunny.mjs",
"types": "./dist/metamuxer.d.ts", "types": "./dist/mediabunny.d.ts",
"exports": { "exports": {
"types": "./dist/metamuxer.d.ts", "types": "./dist/mediabunny.d.ts",
"import": "./dist/metamuxer.mjs", "import": "./dist/mediabunny.mjs",
"require": "./dist/metamuxer.js" "require": "./dist/mediabunny.js"
}, },
"files": [ "files": [
"README.md", "README.md",
@@ -23,7 +23,7 @@
"watch": "node build.mjs --watch", "watch": "node build.mjs --watch",
"lint": "eslint .", "lint": "eslint .",
"check": "tsc -p src --noEmit && tsc -p scripts --noEmit && tsc -p tsconfig.vite.json --noEmit && rm tsconfig.vite.tsbuildinfo", "check": "tsc -p src --noEmit && tsc -p scripts --noEmit && tsc -p tsconfig.vite.json --noEmit && rm tsconfig.vite.tsbuildinfo",
"check-docblocks": "tsx scripts/check-docblocks.ts dist/metamuxer.d.ts", "check-docblocks": "tsx scripts/check-docblocks.ts dist/mediabunny.d.ts",
"docs:dev": "vitepress dev docs", "docs:dev": "vitepress dev docs",
"docs:build": "vitepress build docs && npm run examples:build", "docs:build": "vitepress build docs && npm run examples:build",
"docs:preview": "vitepress preview docs", "docs:preview": "vitepress preview docs",
+1 -1
View File
@@ -1,3 +1,3 @@
import { appendFileSync } from 'fs'; import { appendFileSync } from 'fs';
appendFileSync('dist/metamuxer.d.ts', '\nexport as namespace Metamuxer;'); appendFileSync('dist/mediabunny.d.ts', '\nexport as namespace Mediabunny;');
+1 -1
View File
@@ -6,7 +6,7 @@
"composite": true, "composite": true,
"noEmit": false, "noEmit": false,
"paths": { "paths": {
"mediabunny": ["./dist/metamuxer.d.ts"], "mediabunny": ["./dist/mediabunny.d.ts"],
}, },
}, },
"include": [ "include": [
+1 -1
View File
@@ -20,7 +20,7 @@ const rollupInput = Object.fromEntries(
export default defineConfig({ export default defineConfig({
resolve: { resolve: {
alias: { alias: {
mediabunny: path.resolve(__dirname, './dist/metamuxer.mjs'), mediabunny: path.resolve(__dirname, './dist/mediabunny.mjs'),
}, },
}, },
plugins: [ plugins: [