mirror of
https://github.com/arcodange-org/mediabunny.git
synced 2026-09-27 10:53:50 +02:00
Metamuxer -> Mediabunny
This commit is contained in:
@@ -12,11 +12,11 @@ const umdConfig = {
|
||||
format: 'iife',
|
||||
|
||||
// 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: {
|
||||
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({
|
||||
...umdConfig,
|
||||
outfile: 'dist/metamuxer.js',
|
||||
outfile: 'dist/mediabunny.js',
|
||||
});
|
||||
const ctxEsm = await esbuild.context({
|
||||
...esmConfig,
|
||||
outfile: 'dist/metamuxer.mjs',
|
||||
outfile: 'dist/mediabunny.mjs',
|
||||
});
|
||||
const ctxUmdMinified = await esbuild.context({
|
||||
...umdConfig,
|
||||
outfile: 'dist/metamuxer.min.js',
|
||||
outfile: 'dist/mediabunny.min.js',
|
||||
minify: true,
|
||||
});
|
||||
const ctxEsmMinified = await esbuild.context({
|
||||
...esmConfig,
|
||||
outfile: 'dist/metamuxer.min.mjs',
|
||||
outfile: 'dist/mediabunny.min.mjs',
|
||||
minify: true,
|
||||
});
|
||||
|
||||
|
||||
+11
-11
@@ -1,6 +1,6 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<script src="../dist/metamuxer.js"></script>
|
||||
<script src="../dist/mediabunny.js"></script>
|
||||
|
||||
<script type="module">
|
||||
const fileInput = document.createElement('input');
|
||||
@@ -14,26 +14,26 @@
|
||||
fileInput.addEventListener('change', async () => {
|
||||
const file = fileInput.files[0];
|
||||
|
||||
const source = new Metamuxer.BlobSource(file);
|
||||
const target = new Metamuxer.BufferTarget() ?? new Metamuxer.StreamTarget(new WritableStream({
|
||||
const source = new Mediabunny.BlobSource(file);
|
||||
const target = new Mediabunny.BufferTarget() ?? new Mediabunny.StreamTarget(new WritableStream({
|
||||
write: console.log
|
||||
}), {
|
||||
chunked: true,
|
||||
chunkSize: 2**20
|
||||
});
|
||||
const outputFormat = new Metamuxer.MovOutputFormat();
|
||||
const outputFormat = new Mediabunny.MovOutputFormat();
|
||||
|
||||
const button = document.createElement('button');
|
||||
button.textContent = 'Cancel';
|
||||
button.onclick = () => conversion.cancel();
|
||||
document.body.append(button);
|
||||
|
||||
const conversion = await Metamuxer.Conversion.init({
|
||||
input: new Metamuxer.Input({
|
||||
formats: Metamuxer.ALL_FORMATS,
|
||||
const conversion = await Mediabunny.Conversion.init({
|
||||
input: new Mediabunny.Input({
|
||||
formats: Mediabunny.ALL_FORMATS,
|
||||
source
|
||||
}),
|
||||
output: new Metamuxer.Output({
|
||||
output: new Mediabunny.Output({
|
||||
format: outputFormat,
|
||||
target
|
||||
}),
|
||||
@@ -47,15 +47,15 @@
|
||||
/*
|
||||
video: {
|
||||
discard: true,
|
||||
bitrate: Metamuxer.QUALITY_VERY_HIGH,
|
||||
//bitrate: Metamuxer.QUALITY_VERY_HIGH
|
||||
bitrate: Mediabunny.QUALITY_VERY_HIGH,
|
||||
//bitrate: Mediabunny.QUALITY_VERY_HIGH
|
||||
codec: 'av1',
|
||||
//width: 800,
|
||||
//fit: 'fill',
|
||||
//rotate: 90,
|
||||
},
|
||||
audio: {
|
||||
bitrate: Metamuxer.QUALITY_HIGH,
|
||||
bitrate: Mediabunny.QUALITY_HIGH,
|
||||
codec: 'aac',
|
||||
},
|
||||
*/
|
||||
|
||||
+59
-59
@@ -1,6 +1,6 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<script src="../dist/metamuxer.js"></script>
|
||||
<script src="../dist/mediabunny.js"></script>
|
||||
|
||||
<script type="module">
|
||||
const fileInput = document.createElement('input');
|
||||
@@ -9,16 +9,16 @@
|
||||
|
||||
fileInput.addEventListener('change', async () => {
|
||||
const file = fileInput.files[0];
|
||||
const source = new Metamuxer.BlobSource(file);
|
||||
const source = new Mediabunny.BlobSource(file);
|
||||
|
||||
const input = new Metamuxer.Input({
|
||||
formats: Metamuxer.ALL_FORMATS,
|
||||
const input = new Mediabunny.Input({
|
||||
formats: Mediabunny.ALL_FORMATS,
|
||||
source
|
||||
});
|
||||
|
||||
const videoTrack = await input.getPrimaryVideoTrack();
|
||||
|
||||
const sink = new Metamuxer.EncodedPacketSink(videoTrack);
|
||||
const sink = new Mediabunny.EncodedPacketSink(videoTrack);
|
||||
for await (const packet of sink.packets()) {
|
||||
if (packet.timestamp >= 2) break;
|
||||
console.log(packet);
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
/*
|
||||
let timestamps = [];
|
||||
const packetSink = new Metamuxer.EncodedPacketSink(videoTrack);
|
||||
const packetSink = new Mediabunny.EncodedPacketSink(videoTrack);
|
||||
for await (const packet of packetSink.packets()) {
|
||||
if (packet.timestamp >= 1) {
|
||||
break;
|
||||
@@ -83,14 +83,14 @@
|
||||
//return;
|
||||
/*
|
||||
console.log(timestamps);
|
||||
const sink = new Metamuxer.EncodedPacketSink(videoTrack);
|
||||
const sink = new Mediabunny.EncodedPacketSink(videoTrack);
|
||||
for await (const packet of sink.packets()) {
|
||||
console.log(packet.sequenceNumber);
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
const sink = new Metamuxer.VideoSampleSink(videoTrack);
|
||||
const sink = new Mediabunny.VideoSampleSink(videoTrack);
|
||||
for await (const sample of sink.samplesAtTimestamps(timestamps)) {
|
||||
console.log("wee", sample.timestamp);
|
||||
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)) {
|
||||
console.log(wrappedCanvas);
|
||||
}
|
||||
@@ -129,15 +129,15 @@
|
||||
|
||||
|
||||
/*
|
||||
const output = new Metamuxer.Output({
|
||||
format: new Metamuxer.Mp3OutputFormat(),
|
||||
target: new Metamuxer.BufferTarget()
|
||||
const output = new Mediabunny.Output({
|
||||
format: new Mediabunny.Mp3OutputFormat(),
|
||||
target: new Mediabunny.BufferTarget()
|
||||
});
|
||||
|
||||
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',
|
||||
bitrate: 192000
|
||||
});
|
||||
@@ -167,31 +167,31 @@
|
||||
|
||||
/*
|
||||
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.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 input = new Metamuxer.Input({
|
||||
formats: Metamuxer.ALL_FORMATS,
|
||||
const input = new Mediabunny.Input({
|
||||
formats: Mediabunny.ALL_FORMATS,
|
||||
source
|
||||
});
|
||||
|
||||
const output = new Metamuxer.Output({
|
||||
format: new Metamuxer.WaveOutputFormat(),
|
||||
target: new Metamuxer.BufferTarget()
|
||||
const output = new Mediabunny.Output({
|
||||
format: new Mediabunny.WaveOutputFormat(),
|
||||
target: new Mediabunny.BufferTarget()
|
||||
});
|
||||
output.start();
|
||||
*/
|
||||
|
||||
/*
|
||||
const audioTrack = await input.getPrimaryAudioTrack();
|
||||
const sink = new Metamuxer.EncodedAudioSampleSink(audioTrack);
|
||||
const sink = new Mediabunny.EncodedAudioSampleSink(audioTrack);
|
||||
|
||||
let total = 0;
|
||||
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());
|
||||
|
||||
@@ -219,9 +219,9 @@
|
||||
//console.log(await videoTrack.computeSampleStats());
|
||||
//return;
|
||||
|
||||
const target = new Metamuxer.BufferTarget();
|
||||
const output = new Metamuxer.Output({
|
||||
format: new Metamuxer.WaveOutputFormat(),
|
||||
const target = new Mediabunny.BufferTarget();
|
||||
const output = new Mediabunny.Output({
|
||||
format: new Mediabunny.WaveOutputFormat(),
|
||||
target
|
||||
});
|
||||
|
||||
@@ -230,12 +230,12 @@
|
||||
const audioTrack = await input.getPrimaryAudioTrack();
|
||||
const videoTrack = await input.getPrimaryVideoTrack();
|
||||
|
||||
const sink = new Metamuxer.EncodedAudioSampleSink(audioTrack);
|
||||
const sink = new Mediabunny.EncodedAudioSampleSink(audioTrack);
|
||||
|
||||
const decoderConfig = await audioTrack.getDecoderConfig();
|
||||
const sampleSource = new Metamuxer.EncodedAudioSampleSource(await audioTrack.getCodec());
|
||||
const audioDataSource = new Metamuxer.AudioDataSource({ codec: 'pcm-s16', bitrate: 128e3 });
|
||||
const videoSampleSource = new Metamuxer.EncodedVideoSampleSource(await videoTrack.getCodec());
|
||||
const sampleSource = new Mediabunny.EncodedAudioSampleSource(await audioTrack.getCodec());
|
||||
const audioDataSource = new Mediabunny.AudioDataSource({ codec: 'pcm-s16', bitrate: 128e3 });
|
||||
const videoSampleSource = new Mediabunny.EncodedVideoSampleSource(await videoTrack.getCodec());
|
||||
output.addAudioTrack(audioDataSource ?? sampleSource);
|
||||
//output.addVideoTrack(videoSampleSource);
|
||||
|
||||
@@ -253,12 +253,12 @@
|
||||
// //console.log(sample)
|
||||
// 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(sample)
|
||||
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)
|
||||
// await videoSampleSource.add(sample, { decoderConfig: videoDecoderConfig });
|
||||
//}
|
||||
@@ -281,13 +281,13 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
const input2 = new Metamuxer.Input({
|
||||
formats: Metamuxer.ALL_FORMATS,
|
||||
source: new Metamuxer.BufferSource(target.buffer)
|
||||
const input2 = new Mediabunny.Input({
|
||||
formats: Mediabunny.ALL_FORMATS,
|
||||
source: new Mediabunny.BufferSource(target.buffer)
|
||||
});
|
||||
|
||||
const videoTrack2 = await input2.getPrimaryVideoTrack();
|
||||
const drain2 = new Metamuxer.EncodedVideoSampleDrain(videoTrack2);
|
||||
const drain2 = new Mediabunny.EncodedVideoSampleDrain(videoTrack2);
|
||||
|
||||
let i = 0;
|
||||
for await (const sample of drain2.samples(undefined, undefined)) {
|
||||
@@ -302,13 +302,13 @@
|
||||
|
||||
/*
|
||||
const videoTrack = await input.getPrimaryVideoTrack();
|
||||
const drain = new Metamuxer.VideoFrameDrain(videoTrack);
|
||||
const drain = new Mediabunny.VideoFrameDrain(videoTrack);
|
||||
|
||||
async function* timestamps() {
|
||||
const fromTime = 0;
|
||||
const toTime = await videoTrack.computeDuration();
|
||||
const extractDuration = toTime - fromTime;
|
||||
const drain = new Metamuxer.EncodedVideoSampleDrain(videoTrack);
|
||||
const drain = new Mediabunny.EncodedVideoSampleDrain(videoTrack);
|
||||
const thumbnailsNeeded = 16;
|
||||
|
||||
for (let i = 0; i < thumbnailsNeeded; i++) {
|
||||
@@ -341,7 +341,7 @@
|
||||
|
||||
/*
|
||||
const audioTrack = await input.getPrimaryVideoTrack();
|
||||
const drain = new Metamuxer.EncodedVideoChunkDrain(audioTrack);
|
||||
const drain = new Mediabunny.EncodedVideoChunkDrain(audioTrack);
|
||||
|
||||
for await (const chunk of drain.chunks()) {
|
||||
//console.log(chunk);
|
||||
@@ -352,7 +352,7 @@
|
||||
|
||||
|
||||
/*
|
||||
const drain = new Metamuxer.AudioBufferDrain(audioTrack);
|
||||
const drain = new Mediabunny.AudioBufferDrain(audioTrack);
|
||||
|
||||
const chunks = drain.buffers()
|
||||
const a = chunks.next();
|
||||
@@ -364,13 +364,13 @@
|
||||
|
||||
/*
|
||||
const videoTrack = await input.getPrimaryVideoTrack();
|
||||
const drain = new Metamuxer.VideoFrameDrain(videoTrack);
|
||||
const drain = new Mediabunny.VideoFrameDrain(videoTrack);
|
||||
|
||||
const target = new Metamuxer.ArrayBufferTarget();
|
||||
const format = new Metamuxer.Mp4OutputFormat();
|
||||
const output = new Metamuxer.Output({ target, format });
|
||||
const target = new Mediabunny.ArrayBufferTarget();
|
||||
const format = new Mediabunny.Mp4OutputFormat();
|
||||
const output = new Mediabunny.Output({ target, format });
|
||||
|
||||
const mediaSource = new Metamuxer.VideoFrameSource({
|
||||
const mediaSource = new Mediabunny.VideoFrameSource({
|
||||
codec: 'av1',
|
||||
bitrate: 1e6
|
||||
});
|
||||
@@ -398,13 +398,13 @@
|
||||
|
||||
/*
|
||||
const videoTrack = await input.getPrimaryVideoTrack();
|
||||
const drain = new Metamuxer.VideoFrameDrain(videoTrack);
|
||||
const drain = new Mediabunny.VideoFrameDrain(videoTrack);
|
||||
|
||||
async function* timestamps() {
|
||||
const fromTime = 0;
|
||||
const toTime = await videoTrack.computeDuration();
|
||||
const extractDuration = toTime - fromTime;
|
||||
const drain = new Metamuxer.EncodedVideoChunkDrain(videoTrack);
|
||||
const drain = new Mediabunny.EncodedVideoChunkDrain(videoTrack);
|
||||
const thumbnailsNeeded = 16;
|
||||
|
||||
for (let i = 0; i < thumbnailsNeeded; i++) {
|
||||
@@ -438,7 +438,7 @@
|
||||
|
||||
/*
|
||||
const videoTrack = await input.getPrimaryVideoTrack();
|
||||
const drain = new Metamuxer.VideoFrameDrain(videoTrack);
|
||||
const drain = new Mediabunny.VideoFrameDrain(videoTrack);
|
||||
const width = await videoTrack.getWidth();
|
||||
const height = await videoTrack.getHeight();
|
||||
|
||||
@@ -467,7 +467,7 @@
|
||||
|
||||
/*
|
||||
const audioTrack = await input.getPrimaryAudioTrack();
|
||||
const drain = new Metamuxer.AudioBufferDrain(audioTrack);
|
||||
const drain = new Mediabunny.AudioBufferDrain(audioTrack);
|
||||
|
||||
const context = new AudioContext();
|
||||
const startTime = context.currentTime;
|
||||
@@ -493,7 +493,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
const drain = new Metamuxer.AudioDataDrain(audioTrack);
|
||||
const drain = new Mediabunny.AudioDataDrain(audioTrack);
|
||||
|
||||
console.time()
|
||||
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()) {
|
||||
console.log(chunk);
|
||||
@@ -517,7 +517,7 @@
|
||||
|
||||
/*
|
||||
const videoTrack = await input.getPrimaryVideoTrack();
|
||||
const drain = new Metamuxer.VideoFrameDrain(videoTrack);
|
||||
const drain = new Mediabunny.VideoFrameDrain(videoTrack);
|
||||
const width = await videoTrack.getWidth();
|
||||
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();
|
||||
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()) {
|
||||
// ...
|
||||
@@ -562,7 +562,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
const drain = new Metamuxer.VideoFrameDrain(videoTrack);
|
||||
const drain = new Mediabunny.VideoFrameDrain(videoTrack);
|
||||
|
||||
|
||||
const width = await videoTrack.getWidth();
|
||||
@@ -584,7 +584,7 @@
|
||||
|
||||
/*
|
||||
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)) {
|
||||
console.log(frame)
|
||||
@@ -597,7 +597,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
const drain = new Metamuxer.EncodedVideoChunkDrain(videoTrack);
|
||||
const drain = new Mediabunny.EncodedVideoChunkDrain(videoTrack);
|
||||
|
||||
const decoder = new VideoDecoder({
|
||||
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);
|
||||
|
||||
@@ -636,7 +636,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
const drain = new Metamuxer.EncodedVideoChunkDrain(videoTrack);
|
||||
const drain = new Mediabunny.EncodedVideoChunkDrain(videoTrack);
|
||||
|
||||
for await (const chunk of drain.chunks()) {
|
||||
console.log(chunk);
|
||||
|
||||
+8
-8
@@ -1,6 +1,6 @@
|
||||
<button>Go</button>
|
||||
|
||||
<script src="../dist/metamuxer.js"></script>
|
||||
<script src="../dist/mediabunny.js"></script>
|
||||
|
||||
<script type="module">
|
||||
function download(blob, filename) {
|
||||
@@ -18,20 +18,20 @@
|
||||
const videoTrack = stream.getVideoTracks()[0];
|
||||
const audioTrack = stream.getAudioTracks()[0];
|
||||
|
||||
const output = new Metamuxer.Output({
|
||||
target: new Metamuxer.BufferTarget(),
|
||||
format: new Metamuxer.Mp4OutputFormat(),
|
||||
const output = new Mediabunny.Output({
|
||||
target: new Mediabunny.BufferTarget(),
|
||||
format: new Mediabunny.Mp4OutputFormat(),
|
||||
});
|
||||
if (videoTrack) {
|
||||
output.addVideoTrack(new Metamuxer.MediaStreamVideoTrackSource(videoTrack, {
|
||||
output.addVideoTrack(new Mediabunny.MediaStreamVideoTrackSource(videoTrack, {
|
||||
codec: 'avc',
|
||||
bitrate: Metamuxer.QUALITY_MEDIUM
|
||||
bitrate: Mediabunny.QUALITY_MEDIUM
|
||||
}));
|
||||
}
|
||||
if (audioTrack) {
|
||||
output.addAudioTrack(new Metamuxer.MediaStreamAudioTrackSource(audioTrack, {
|
||||
output.addAudioTrack(new Mediabunny.MediaStreamAudioTrackSource(audioTrack, {
|
||||
codec: 'aac',
|
||||
bitrate: Metamuxer.QUALITY_MEDIUM
|
||||
bitrate: Mediabunny.QUALITY_MEDIUM
|
||||
}));
|
||||
}
|
||||
|
||||
|
||||
+17
-17
@@ -1,6 +1,6 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<script src="../dist/metamuxer.js"></script>
|
||||
<script src="../dist/mediabunny.js"></script>
|
||||
|
||||
<script type="module">
|
||||
function download(blob, filename) {
|
||||
@@ -38,17 +38,17 @@
|
||||
canvas.height = 720;
|
||||
const context = canvas.getContext('2d');
|
||||
|
||||
let format = new Metamuxer.MkvOutputFormat({ streamable: false });
|
||||
format = new Metamuxer.Mp4OutputFormat({ fastStart: 'fragmented' }); // new Metamuxer.MkvOutputFormat();// new Metamuxer.Mp4OutputFormat({ fastStart: false });
|
||||
format = new Metamuxer.OggOutputFormat();
|
||||
format = new Metamuxer.Mp4OutputFormat({ fastStart: 'fragmented', minimumFragmentDuration: 2 });
|
||||
format = new Metamuxer.MkvOutputFormat({ minimumClusterDuration: 2 });
|
||||
format = new Metamuxer.WavOutputFormat();
|
||||
format = new Metamuxer.MkvOutputFormat();
|
||||
let target = new Metamuxer.BufferTarget();
|
||||
let format = new Mediabunny.MkvOutputFormat({ streamable: false });
|
||||
format = new Mediabunny.Mp4OutputFormat({ fastStart: 'fragmented' }); // new Mediabunny.MkvOutputFormat();// new Mediabunny.Mp4OutputFormat({ fastStart: false });
|
||||
format = new Mediabunny.OggOutputFormat();
|
||||
format = new Mediabunny.Mp4OutputFormat({ fastStart: 'fragmented', minimumFragmentDuration: 2 });
|
||||
format = new Mediabunny.MkvOutputFormat({ minimumClusterDuration: 2 });
|
||||
format = new Mediabunny.WavOutputFormat();
|
||||
format = new Mediabunny.MkvOutputFormat();
|
||||
let target = new Mediabunny.BufferTarget();
|
||||
|
||||
/*
|
||||
target = new Metamuxer.StreamTarget(new WritableStream({
|
||||
target = new Mediabunny.StreamTarget(new WritableStream({
|
||||
async write(chunk) {
|
||||
console.log(chunk)
|
||||
|
||||
@@ -57,12 +57,12 @@
|
||||
}), { 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',
|
||||
bitrate: Metamuxer.QUALITY_HIGH
|
||||
bitrate: Mediabunny.QUALITY_HIGH
|
||||
});
|
||||
output.addAudioTrack(sourcy);
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
let videoSource = new Metamuxer.EncodedVideoChunkSource('avc');
|
||||
let videoSource = new Mediabunny.EncodedVideoChunkSource('avc');
|
||||
output.addTrack(videoSource);
|
||||
|
||||
output.start();
|
||||
@@ -114,16 +114,16 @@
|
||||
download(new Blob([target.buffer]), 'test.mkv');
|
||||
*/
|
||||
|
||||
let videoSource = new Metamuxer.CanvasSource(canvas, {
|
||||
let videoSource = new Mediabunny.CanvasSource(canvas, {
|
||||
codec: 'avc',
|
||||
//fullCodecString: 'avc1.42001f',
|
||||
bitrate: 1e6
|
||||
});
|
||||
let audioSource = new Metamuxer.AudioBufferSource({
|
||||
let audioSource = new Mediabunny.AudioBufferSource({
|
||||
codec: 'opus',
|
||||
bitrate: 128e3,
|
||||
});
|
||||
let subtitleSource = new Metamuxer.TextSubtitleSource('webvtt');
|
||||
let subtitleSource = new Mediabunny.TextSubtitleSource('webvtt');
|
||||
|
||||
output.addVideoTrack(videoSource, { languageCode: 'eng' });
|
||||
output.addAudioTrack(audioSource);
|
||||
|
||||
+6
-6
@@ -15,7 +15,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="../dist/metamuxer.js"></script>
|
||||
<script src="../dist/mediabunny.js"></script>
|
||||
|
||||
<script type="module">
|
||||
const fileInput = document.querySelector('input[type="file"]');
|
||||
@@ -34,10 +34,10 @@ const file = await new Promise(resolve => {
|
||||
fileInput.style.display = 'none';
|
||||
const audioContext = new AudioContext();
|
||||
|
||||
const source = new Metamuxer.BlobSource(file);
|
||||
const source = new Mediabunny.BlobSource(file);
|
||||
|
||||
const input = new Metamuxer.Input({
|
||||
formats: Metamuxer.ALL_FORMATS,
|
||||
const input = new Mediabunny.Input({
|
||||
formats: Mediabunny.ALL_FORMATS,
|
||||
source
|
||||
});
|
||||
|
||||
@@ -69,8 +69,8 @@ durationElement.textContent = formatSeconds(totalDuration);
|
||||
|
||||
playerDiv.style.display = 'flex';
|
||||
|
||||
const videoSink = videoTrack && new Metamuxer.CanvasSink(videoTrack, { poolSize: 2 });
|
||||
const audioSink = audioTrack && new Metamuxer.AudioBufferSink(audioTrack);
|
||||
const videoSink = videoTrack && new Mediabunny.CanvasSink(videoTrack, { poolSize: 2 });
|
||||
const audioSink = audioTrack && new Mediabunny.AudioBufferSink(audioTrack);
|
||||
|
||||
let startTime = null;
|
||||
let playing = false;
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
</div>
|
||||
|
||||
<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"
|
||||
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>
|
||||
|
||||
<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"
|
||||
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>
|
||||
|
||||
<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"
|
||||
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>
|
||||
|
||||
<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"
|
||||
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>
|
||||
|
||||
<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"
|
||||
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>
|
||||
|
||||
<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"
|
||||
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",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "metamuxer",
|
||||
"name": "mediabunny",
|
||||
"version": "0.1.0",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
|
||||
+8
-8
@@ -1,15 +1,15 @@
|
||||
{
|
||||
"name": "metamuxer",
|
||||
"name": "mediabunny",
|
||||
"version": "0.1.0",
|
||||
"description": "TODO",
|
||||
"type": "module",
|
||||
"main": "./dist/metamuxer.js",
|
||||
"module": "./dist/metamuxer.mjs",
|
||||
"types": "./dist/metamuxer.d.ts",
|
||||
"main": "./dist/mediabunny.js",
|
||||
"module": "./dist/mediabunny.mjs",
|
||||
"types": "./dist/mediabunny.d.ts",
|
||||
"exports": {
|
||||
"types": "./dist/metamuxer.d.ts",
|
||||
"import": "./dist/metamuxer.mjs",
|
||||
"require": "./dist/metamuxer.js"
|
||||
"types": "./dist/mediabunny.d.ts",
|
||||
"import": "./dist/mediabunny.mjs",
|
||||
"require": "./dist/mediabunny.js"
|
||||
},
|
||||
"files": [
|
||||
"README.md",
|
||||
@@ -23,7 +23,7 @@
|
||||
"watch": "node build.mjs --watch",
|
||||
"lint": "eslint .",
|
||||
"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:build": "vitepress build docs && npm run examples:build",
|
||||
"docs:preview": "vitepress preview docs",
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
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,
|
||||
"noEmit": false,
|
||||
"paths": {
|
||||
"mediabunny": ["./dist/metamuxer.d.ts"],
|
||||
"mediabunny": ["./dist/mediabunny.d.ts"],
|
||||
},
|
||||
},
|
||||
"include": [
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@ const rollupInput = Object.fromEntries(
|
||||
export default defineConfig({
|
||||
resolve: {
|
||||
alias: {
|
||||
mediabunny: path.resolve(__dirname, './dist/metamuxer.mjs'),
|
||||
mediabunny: path.resolve(__dirname, './dist/mediabunny.mjs'),
|
||||
},
|
||||
},
|
||||
plugins: [
|
||||
|
||||
Reference in New Issue
Block a user