mirror of
https://github.com/arcodange-org/mediabunny.git
synced 2026-09-27 02:43:48 +02:00
Metamuxer -> Mediabunny
This commit is contained in:
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||||
|
|||||||
@@ -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"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -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"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -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"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -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"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -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"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -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"
|
||||||
>
|
>
|
||||||
|
|||||||
Generated
+2
-2
@@ -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
@@ -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,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
@@ -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
@@ -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: [
|
||||||
|
|||||||
Reference in New Issue
Block a user