webcodecs-node 0.3.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/backends/types.d.ts +6 -3
- package/dist/backends/types.d.ts.map +1 -1
- package/dist/backends/types.js +2 -2
- package/dist/backends/types.js.map +1 -1
- package/dist/{ffmpeg → codec-utils}/audio-codecs.d.ts +13 -12
- package/dist/codec-utils/audio-codecs.d.ts.map +1 -0
- package/dist/{ffmpeg → codec-utils}/audio-codecs.js +29 -11
- package/dist/codec-utils/audio-codecs.js.map +1 -0
- package/dist/{ffmpeg → codec-utils}/formats.d.ts +7 -7
- package/dist/codec-utils/formats.d.ts.map +1 -0
- package/dist/{ffmpeg → codec-utils}/formats.js +7 -7
- package/dist/codec-utils/formats.js.map +1 -0
- package/dist/{ffmpeg → codec-utils}/index.d.ts +3 -3
- package/dist/codec-utils/index.d.ts.map +1 -0
- package/dist/{ffmpeg → codec-utils}/index.js +3 -4
- package/dist/codec-utils/index.js.map +1 -0
- package/dist/{ffmpeg → codec-utils}/types.d.ts +13 -11
- package/dist/codec-utils/types.d.ts.map +1 -0
- package/dist/{ffmpeg → codec-utils}/types.js +3 -1
- package/dist/codec-utils/types.js.map +1 -0
- package/dist/containers/Demuxer.d.ts +114 -0
- package/dist/containers/Demuxer.d.ts.map +1 -0
- package/dist/containers/Demuxer.js +256 -0
- package/dist/containers/Demuxer.js.map +1 -0
- package/dist/containers/Muxer.d.ts +142 -0
- package/dist/containers/Muxer.d.ts.map +1 -0
- package/dist/containers/Muxer.js +295 -0
- package/dist/containers/Muxer.js.map +1 -0
- package/dist/containers/extract.d.ts +25 -0
- package/dist/containers/extract.d.ts.map +1 -0
- package/dist/containers/extract.js +64 -0
- package/dist/containers/extract.js.map +1 -0
- package/dist/containers/index.d.ts +40 -0
- package/dist/containers/index.d.ts.map +1 -0
- package/dist/containers/index.js +41 -0
- package/dist/containers/index.js.map +1 -0
- package/dist/containers/transcode.d.ts +138 -0
- package/dist/containers/transcode.d.ts.map +1 -0
- package/dist/containers/transcode.js +536 -0
- package/dist/containers/transcode.js.map +1 -0
- package/dist/core/AudioData.d.ts +4 -0
- package/dist/core/AudioData.d.ts.map +1 -1
- package/dist/core/AudioData.js +56 -4
- package/dist/core/AudioData.js.map +1 -1
- package/dist/core/EncodedAudioChunk.d.ts +1 -1
- package/dist/core/EncodedAudioChunk.d.ts.map +1 -1
- package/dist/core/EncodedAudioChunk.js +1 -1
- package/dist/core/EncodedAudioChunk.js.map +1 -1
- package/dist/core/EncodedVideoChunk.d.ts.map +1 -1
- package/dist/core/EncodedVideoChunk.js +3 -19
- package/dist/core/EncodedVideoChunk.js.map +1 -1
- package/dist/core/VideoFrame.d.ts +6 -1
- package/dist/core/VideoFrame.d.ts.map +1 -1
- package/dist/core/VideoFrame.js +130 -17
- package/dist/core/VideoFrame.js.map +1 -1
- package/dist/decoders/AudioDecoder.d.ts +8 -0
- package/dist/decoders/AudioDecoder.d.ts.map +1 -1
- package/dist/decoders/AudioDecoder.js +62 -32
- package/dist/decoders/AudioDecoder.js.map +1 -1
- package/dist/decoders/ImageDecoder.d.ts +0 -3
- package/dist/decoders/ImageDecoder.d.ts.map +1 -1
- package/dist/decoders/ImageDecoder.js +13 -225
- package/dist/decoders/ImageDecoder.js.map +1 -1
- package/dist/decoders/VideoDecoder.d.ts +8 -0
- package/dist/decoders/VideoDecoder.d.ts.map +1 -1
- package/dist/decoders/VideoDecoder.js +76 -46
- package/dist/decoders/VideoDecoder.js.map +1 -1
- package/dist/demos/demo-1080p-transcode.d.ts +8 -0
- package/dist/demos/demo-1080p-transcode.d.ts.map +1 -0
- package/dist/demos/demo-1080p-transcode.js +188 -0
- package/dist/demos/demo-1080p-transcode.js.map +1 -0
- package/dist/demos/demo-containers.d.ts +7 -0
- package/dist/demos/demo-containers.d.ts.map +1 -0
- package/dist/demos/demo-containers.js +140 -0
- package/dist/demos/demo-containers.js.map +1 -0
- package/dist/demos/demo-four-corners.js +4 -4
- package/dist/demos/demo-four-corners.js.map +1 -1
- package/dist/demos/demo-hwaccel.js +1 -1
- package/dist/demos/demo-hwaccel.js.map +1 -1
- package/dist/demos/demo-samples.js +4 -4
- package/dist/demos/demo-samples.js.map +1 -1
- package/dist/demos/demo-streaming.js +6 -6
- package/dist/demos/demo-streaming.js.map +1 -1
- package/dist/encoders/AudioEncoder.d.ts +8 -0
- package/dist/encoders/AudioEncoder.d.ts.map +1 -1
- package/dist/encoders/AudioEncoder.js +68 -26
- package/dist/encoders/AudioEncoder.js.map +1 -1
- package/dist/encoders/VideoEncoder.d.ts +8 -0
- package/dist/encoders/VideoEncoder.d.ts.map +1 -1
- package/dist/encoders/VideoEncoder.js +64 -13
- package/dist/encoders/VideoEncoder.js.map +1 -1
- package/dist/formats/conversions/batch-converter.d.ts +61 -0
- package/dist/formats/conversions/batch-converter.d.ts.map +1 -0
- package/dist/formats/conversions/batch-converter.js +274 -0
- package/dist/formats/conversions/batch-converter.js.map +1 -0
- package/dist/formats/conversions/frame-converter.d.ts.map +1 -1
- package/dist/formats/conversions/frame-converter.js +17 -10
- package/dist/formats/conversions/frame-converter.js.map +1 -1
- package/dist/formats/conversions/index.d.ts +1 -0
- package/dist/formats/conversions/index.d.ts.map +1 -1
- package/dist/formats/conversions/index.js +2 -0
- package/dist/formats/conversions/index.js.map +1 -1
- package/dist/hardware/decoder-args.d.ts +2 -7
- package/dist/hardware/decoder-args.d.ts.map +1 -1
- package/dist/hardware/decoder-args.js +2 -32
- package/dist/hardware/decoder-args.js.map +1 -1
- package/dist/hardware/encoder-args.d.ts +2 -11
- package/dist/hardware/encoder-args.d.ts.map +1 -1
- package/dist/hardware/encoder-args.js +2 -71
- package/dist/hardware/encoder-args.js.map +1 -1
- package/dist/hardware/index.d.ts +2 -2
- package/dist/hardware/index.d.ts.map +1 -1
- package/dist/hardware/index.js +2 -2
- package/dist/hardware/index.js.map +1 -1
- package/dist/index.d.ts +5 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -6
- package/dist/index.js.map +1 -1
- package/dist/node-av/NodeAvAudioDecoder.d.ts +2 -2
- package/dist/node-av/NodeAvAudioDecoder.d.ts.map +1 -1
- package/dist/node-av/NodeAvAudioDecoder.js +63 -56
- package/dist/node-av/NodeAvAudioDecoder.js.map +1 -1
- package/dist/node-av/NodeAvAudioEncoder.d.ts +6 -0
- package/dist/node-av/NodeAvAudioEncoder.d.ts.map +1 -1
- package/dist/node-av/NodeAvAudioEncoder.js +166 -45
- package/dist/node-av/NodeAvAudioEncoder.js.map +1 -1
- package/dist/node-av/NodeAvImageDecoder.d.ts +28 -9
- package/dist/node-av/NodeAvImageDecoder.d.ts.map +1 -1
- package/dist/node-av/NodeAvImageDecoder.js +156 -37
- package/dist/node-av/NodeAvImageDecoder.js.map +1 -1
- package/dist/node-av/NodeAvVideoDecoder.d.ts +1 -1
- package/dist/node-av/NodeAvVideoDecoder.d.ts.map +1 -1
- package/dist/node-av/NodeAvVideoDecoder.js +20 -16
- package/dist/node-av/NodeAvVideoDecoder.js.map +1 -1
- package/dist/node-av/NodeAvVideoEncoder.d.ts +12 -0
- package/dist/node-av/NodeAvVideoEncoder.d.ts.map +1 -1
- package/dist/node-av/NodeAvVideoEncoder.js +175 -63
- package/dist/node-av/NodeAvVideoEncoder.js.map +1 -1
- package/dist/polyfill.d.ts.map +1 -1
- package/dist/polyfill.js +11 -9
- package/dist/polyfill.js.map +1 -1
- package/dist/utils/aac.d.ts.map +1 -1
- package/dist/utils/aac.js +6 -0
- package/dist/utils/aac.js.map +1 -1
- package/dist/utils/buffer-pool.d.ts +109 -0
- package/dist/utils/buffer-pool.d.ts.map +1 -0
- package/dist/utils/buffer-pool.js +278 -0
- package/dist/utils/buffer-pool.js.map +1 -0
- package/dist/utils/codec-cache.d.ts +65 -0
- package/dist/utils/codec-cache.d.ts.map +1 -0
- package/dist/utils/codec-cache.js +116 -0
- package/dist/utils/codec-cache.js.map +1 -0
- package/dist/utils/errors.d.ts +62 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +84 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/hardware-pool.d.ts +88 -0
- package/dist/utils/hardware-pool.d.ts.map +1 -0
- package/dist/utils/hardware-pool.js +266 -0
- package/dist/utils/hardware-pool.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +10 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/timeout.d.ts +44 -0
- package/dist/utils/timeout.d.ts.map +1 -0
- package/dist/utils/timeout.js +73 -0
- package/dist/utils/timeout.js.map +1 -0
- package/dist/utils/type-guards.d.ts +11 -1
- package/dist/utils/type-guards.d.ts.map +1 -1
- package/dist/utils/type-guards.js.map +1 -1
- package/package.json +13 -35
- package/dist/AudioData.d.ts +0 -6
- package/dist/AudioData.d.ts.map +0 -1
- package/dist/AudioData.js +0 -6
- package/dist/AudioData.js.map +0 -1
- package/dist/AudioDecoder.d.ts +0 -6
- package/dist/AudioDecoder.d.ts.map +0 -1
- package/dist/AudioDecoder.js +0 -6
- package/dist/AudioDecoder.js.map +0 -1
- package/dist/AudioEncoder.d.ts +0 -6
- package/dist/AudioEncoder.d.ts.map +0 -1
- package/dist/AudioEncoder.js +0 -6
- package/dist/AudioEncoder.js.map +0 -1
- package/dist/EncodedAudioChunk.d.ts +0 -6
- package/dist/EncodedAudioChunk.d.ts.map +0 -1
- package/dist/EncodedAudioChunk.js +0 -6
- package/dist/EncodedAudioChunk.js.map +0 -1
- package/dist/EncodedVideoChunk.d.ts +0 -6
- package/dist/EncodedVideoChunk.d.ts.map +0 -1
- package/dist/EncodedVideoChunk.js +0 -6
- package/dist/EncodedVideoChunk.js.map +0 -1
- package/dist/FFmpegProcess.d.ts +0 -6
- package/dist/FFmpegProcess.d.ts.map +0 -1
- package/dist/FFmpegProcess.js +0 -6
- package/dist/FFmpegProcess.js.map +0 -1
- package/dist/HardwareAcceleration.d.ts +0 -6
- package/dist/HardwareAcceleration.d.ts.map +0 -1
- package/dist/HardwareAcceleration.js +0 -6
- package/dist/HardwareAcceleration.js.map +0 -1
- package/dist/ImageDecoder.d.ts +0 -6
- package/dist/ImageDecoder.d.ts.map +0 -1
- package/dist/ImageDecoder.js +0 -6
- package/dist/ImageDecoder.js.map +0 -1
- package/dist/Logger.d.ts +0 -6
- package/dist/Logger.d.ts.map +0 -1
- package/dist/Logger.js +0 -6
- package/dist/Logger.js.map +0 -1
- package/dist/MediaCapabilities.d.ts +0 -9
- package/dist/MediaCapabilities.d.ts.map +0 -1
- package/dist/MediaCapabilities.js +0 -8
- package/dist/MediaCapabilities.js.map +0 -1
- package/dist/VideoDecoder.d.ts +0 -6
- package/dist/VideoDecoder.d.ts.map +0 -1
- package/dist/VideoDecoder.js +0 -6
- package/dist/VideoDecoder.js.map +0 -1
- package/dist/VideoEncoder.d.ts +0 -6
- package/dist/VideoEncoder.d.ts.map +0 -1
- package/dist/VideoEncoder.js +0 -6
- package/dist/VideoEncoder.js.map +0 -1
- package/dist/VideoFrame.d.ts +0 -10
- package/dist/VideoFrame.d.ts.map +0 -1
- package/dist/VideoFrame.js +0 -9
- package/dist/VideoFrame.js.map +0 -1
- package/dist/__tests__/AudioData.test.d.ts +0 -5
- package/dist/__tests__/AudioData.test.d.ts.map +0 -1
- package/dist/__tests__/AudioData.test.js +0 -179
- package/dist/__tests__/AudioData.test.js.map +0 -1
- package/dist/__tests__/AudioDecoder.test.d.ts +0 -5
- package/dist/__tests__/AudioDecoder.test.d.ts.map +0 -1
- package/dist/__tests__/AudioDecoder.test.js +0 -733
- package/dist/__tests__/AudioDecoder.test.js.map +0 -1
- package/dist/__tests__/AudioEncoder.test.d.ts +0 -5
- package/dist/__tests__/AudioEncoder.test.d.ts.map +0 -1
- package/dist/__tests__/AudioEncoder.test.js +0 -247
- package/dist/__tests__/AudioEncoder.test.js.map +0 -1
- package/dist/__tests__/EncodedChunks.test.d.ts +0 -5
- package/dist/__tests__/EncodedChunks.test.d.ts.map +0 -1
- package/dist/__tests__/EncodedChunks.test.js +0 -99
- package/dist/__tests__/EncodedChunks.test.js.map +0 -1
- package/dist/__tests__/HardwareAcceleration.test.d.ts +0 -5
- package/dist/__tests__/HardwareAcceleration.test.d.ts.map +0 -1
- package/dist/__tests__/HardwareAcceleration.test.js +0 -84
- package/dist/__tests__/HardwareAcceleration.test.js.map +0 -1
- package/dist/__tests__/ImageDecoder.test.d.ts +0 -5
- package/dist/__tests__/ImageDecoder.test.d.ts.map +0 -1
- package/dist/__tests__/ImageDecoder.test.js +0 -587
- package/dist/__tests__/ImageDecoder.test.js.map +0 -1
- package/dist/__tests__/ImageDecoder.wpt.test.d.ts +0 -8
- package/dist/__tests__/ImageDecoder.wpt.test.d.ts.map +0 -1
- package/dist/__tests__/ImageDecoder.wpt.test.js +0 -135
- package/dist/__tests__/ImageDecoder.wpt.test.js.map +0 -1
- package/dist/__tests__/MediaCapabilities.test.d.ts +0 -5
- package/dist/__tests__/MediaCapabilities.test.d.ts.map +0 -1
- package/dist/__tests__/MediaCapabilities.test.js +0 -346
- package/dist/__tests__/MediaCapabilities.test.js.map +0 -1
- package/dist/__tests__/NodeAvDecoder.test.d.ts +0 -2
- package/dist/__tests__/NodeAvDecoder.test.d.ts.map +0 -1
- package/dist/__tests__/NodeAvDecoder.test.js +0 -199
- package/dist/__tests__/NodeAvDecoder.test.js.map +0 -1
- package/dist/__tests__/NodeAvEncoder.test.d.ts +0 -2
- package/dist/__tests__/NodeAvEncoder.test.d.ts.map +0 -1
- package/dist/__tests__/NodeAvEncoder.test.js +0 -176
- package/dist/__tests__/NodeAvEncoder.test.js.map +0 -1
- package/dist/__tests__/VideoDecoder.test.d.ts +0 -5
- package/dist/__tests__/VideoDecoder.test.d.ts.map +0 -1
- package/dist/__tests__/VideoDecoder.test.js +0 -675
- package/dist/__tests__/VideoDecoder.test.js.map +0 -1
- package/dist/__tests__/VideoEncoder.test.d.ts +0 -5
- package/dist/__tests__/VideoEncoder.test.d.ts.map +0 -1
- package/dist/__tests__/VideoEncoder.test.js +0 -468
- package/dist/__tests__/VideoEncoder.test.js.map +0 -1
- package/dist/__tests__/VideoFrame.test.d.ts +0 -5
- package/dist/__tests__/VideoFrame.test.d.ts.map +0 -1
- package/dist/__tests__/VideoFrame.test.js +0 -243
- package/dist/__tests__/VideoFrame.test.js.map +0 -1
- package/dist/__tests__/aac-utils.test.d.ts +0 -2
- package/dist/__tests__/aac-utils.test.d.ts.map +0 -1
- package/dist/__tests__/aac-utils.test.js +0 -37
- package/dist/__tests__/aac-utils.test.js.map +0 -1
- package/dist/__tests__/avc-utils.test.d.ts +0 -2
- package/dist/__tests__/avc-utils.test.d.ts.map +0 -1
- package/dist/__tests__/avc-utils.test.js +0 -63
- package/dist/__tests__/avc-utils.test.js.map +0 -1
- package/dist/__tests__/hevc-utils.test.d.ts +0 -2
- package/dist/__tests__/hevc-utils.test.d.ts.map +0 -1
- package/dist/__tests__/hevc-utils.test.js +0 -78
- package/dist/__tests__/hevc-utils.test.js.map +0 -1
- package/dist/demos/demo-conversion.d.ts +0 -13
- package/dist/demos/demo-conversion.d.ts.map +0 -1
- package/dist/demos/demo-conversion.js +0 -301
- package/dist/demos/demo-conversion.js.map +0 -1
- package/dist/demos/demo-hwaccel-conversion.d.ts +0 -8
- package/dist/demos/demo-hwaccel-conversion.d.ts.map +0 -1
- package/dist/demos/demo-hwaccel-conversion.js +0 -161
- package/dist/demos/demo-hwaccel-conversion.js.map +0 -1
- package/dist/demos/demo-mediabunny.d.ts +0 -7
- package/dist/demos/demo-mediabunny.d.ts.map +0 -1
- package/dist/demos/demo-mediabunny.js +0 -78
- package/dist/demos/demo-mediabunny.js.map +0 -1
- package/dist/ffmpeg/FFmpegProcess.d.ts +0 -111
- package/dist/ffmpeg/FFmpegProcess.d.ts.map +0 -1
- package/dist/ffmpeg/FFmpegProcess.js +0 -543
- package/dist/ffmpeg/FFmpegProcess.js.map +0 -1
- package/dist/ffmpeg/audio-codecs.d.ts.map +0 -1
- package/dist/ffmpeg/audio-codecs.js.map +0 -1
- package/dist/ffmpeg/formats.d.ts.map +0 -1
- package/dist/ffmpeg/formats.js.map +0 -1
- package/dist/ffmpeg/index.d.ts.map +0 -1
- package/dist/ffmpeg/index.js.map +0 -1
- package/dist/ffmpeg/parsers/annexb.d.ts +0 -88
- package/dist/ffmpeg/parsers/annexb.d.ts.map +0 -1
- package/dist/ffmpeg/parsers/annexb.js +0 -201
- package/dist/ffmpeg/parsers/annexb.js.map +0 -1
- package/dist/ffmpeg/parsers/index.d.ts +0 -6
- package/dist/ffmpeg/parsers/index.d.ts.map +0 -1
- package/dist/ffmpeg/parsers/index.js +0 -8
- package/dist/ffmpeg/parsers/index.js.map +0 -1
- package/dist/ffmpeg/parsers/ivf.d.ts +0 -54
- package/dist/ffmpeg/parsers/ivf.d.ts.map +0 -1
- package/dist/ffmpeg/parsers/ivf.js +0 -109
- package/dist/ffmpeg/parsers/ivf.js.map +0 -1
- package/dist/ffmpeg/types.d.ts.map +0 -1
- package/dist/ffmpeg/types.js.map +0 -1
- package/dist/mediabunny/FFmpegAudioDecoder.d.ts +0 -23
- package/dist/mediabunny/FFmpegAudioDecoder.d.ts.map +0 -1
- package/dist/mediabunny/FFmpegAudioDecoder.js +0 -129
- package/dist/mediabunny/FFmpegAudioDecoder.js.map +0 -1
- package/dist/mediabunny/FFmpegAudioEncoder.d.ts +0 -43
- package/dist/mediabunny/FFmpegAudioEncoder.d.ts.map +0 -1
- package/dist/mediabunny/FFmpegAudioEncoder.js +0 -220
- package/dist/mediabunny/FFmpegAudioEncoder.js.map +0 -1
- package/dist/mediabunny/FFmpegVideoDecoder.d.ts +0 -24
- package/dist/mediabunny/FFmpegVideoDecoder.d.ts.map +0 -1
- package/dist/mediabunny/FFmpegVideoDecoder.js +0 -125
- package/dist/mediabunny/FFmpegVideoDecoder.js.map +0 -1
- package/dist/mediabunny/FFmpegVideoEncoder.d.ts +0 -48
- package/dist/mediabunny/FFmpegVideoEncoder.d.ts.map +0 -1
- package/dist/mediabunny/FFmpegVideoEncoder.js +0 -263
- package/dist/mediabunny/FFmpegVideoEncoder.js.map +0 -1
- package/dist/mediabunny/index.d.ts +0 -21
- package/dist/mediabunny/index.d.ts.map +0 -1
- package/dist/mediabunny/index.js +0 -33
- package/dist/mediabunny/index.js.map +0 -1
- package/dist/types.d.ts +0 -6
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -6
- package/dist/types.js.map +0 -1
|
@@ -1,301 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Demo: Real File Conversion with Mediabunny + WebCodecs
|
|
3
|
-
*
|
|
4
|
-
* This demo shows how to:
|
|
5
|
-
* 1. Use WebCodecs API (VideoEncoder, AudioEncoder, etc.) with Mediabunny
|
|
6
|
-
* 2. Convert MP4 to WebM with progress tracking
|
|
7
|
-
* 3. Handle video resizing, codec conversion, and audio transcoding
|
|
8
|
-
*
|
|
9
|
-
* The WebCodecs polyfill makes VideoFrame, AudioData, EncodedVideoChunk, etc.
|
|
10
|
-
* available globally, so Mediabunny uses our FFmpeg-backed implementations.
|
|
11
|
-
*/
|
|
12
|
-
import * as fs from 'fs';
|
|
13
|
-
import * as path from 'path';
|
|
14
|
-
import { execSync } from 'child_process';
|
|
15
|
-
import { ReadableStream, WritableStream, TransformStream } from 'stream/web';
|
|
16
|
-
// Polyfill Web Streams for Node.js < 18.x or environments without them
|
|
17
|
-
if (typeof globalThis.WritableStream === 'undefined') {
|
|
18
|
-
globalThis.WritableStream = WritableStream;
|
|
19
|
-
}
|
|
20
|
-
if (typeof globalThis.ReadableStream === 'undefined') {
|
|
21
|
-
globalThis.ReadableStream = ReadableStream;
|
|
22
|
-
}
|
|
23
|
-
if (typeof globalThis.TransformStream === 'undefined') {
|
|
24
|
-
globalThis.TransformStream = TransformStream;
|
|
25
|
-
}
|
|
26
|
-
// Install WebCodecs polyfill - this provides VideoFrame, AudioData, EncodedVideoChunk, etc.
|
|
27
|
-
// Mediabunny will use these global classes for encoding/decoding
|
|
28
|
-
// The side-effect import ensures auto-install happens before any other imports
|
|
29
|
-
import '../polyfill.js';
|
|
30
|
-
// Mediabunny imports
|
|
31
|
-
import { Input, Output, Conversion, FilePathSource, FilePathTarget, WebMOutputFormat, ALL_FORMATS, } from 'mediabunny';
|
|
32
|
-
// Register our FFmpeg-based encoders/decoders
|
|
33
|
-
import { registerFFmpegCoders } from '../mediabunny/index.js';
|
|
34
|
-
// Register FFmpeg coders before using Mediabunny
|
|
35
|
-
registerFFmpegCoders();
|
|
36
|
-
const testDir = '/tmp/webcodecs-test-conversion';
|
|
37
|
-
/**
|
|
38
|
-
* Create a sample video file for testing
|
|
39
|
-
*/
|
|
40
|
-
async function createSampleVideo() {
|
|
41
|
-
// Create test directory
|
|
42
|
-
if (!fs.existsSync(testDir)) {
|
|
43
|
-
fs.mkdirSync(testDir, { recursive: true });
|
|
44
|
-
}
|
|
45
|
-
const inputPath = path.join(testDir, 'sample.mp4');
|
|
46
|
-
console.log('Creating sample video...');
|
|
47
|
-
// Create a 5-second test video with testsrc and sine wave audio
|
|
48
|
-
// 640x480, 30fps, H.264 video + AAC audio at 48000Hz (Opus-compatible)
|
|
49
|
-
execSync(`ffmpeg -y ` +
|
|
50
|
-
`-f lavfi -i "testsrc=duration=5:size=640x480:rate=30" ` +
|
|
51
|
-
`-f lavfi -i "sine=frequency=440:duration=5:sample_rate=48000" ` +
|
|
52
|
-
`-c:v libx264 -preset ultrafast -c:a aac -b:a 128k ` +
|
|
53
|
-
`-pix_fmt yuv420p ` +
|
|
54
|
-
`"${inputPath}" 2>/dev/null`);
|
|
55
|
-
const stats = fs.statSync(inputPath);
|
|
56
|
-
console.log(` Created: ${inputPath}`);
|
|
57
|
-
console.log(` Size: ${(stats.size / 1024).toFixed(1)} KB`);
|
|
58
|
-
return inputPath;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Get file info using ffprobe
|
|
62
|
-
*/
|
|
63
|
-
function getFileInfo(filePath) {
|
|
64
|
-
const output = execSync(`ffprobe -v quiet -print_format json -show_format -show_streams "${filePath}"`, { encoding: 'utf-8' });
|
|
65
|
-
const info = JSON.parse(output);
|
|
66
|
-
const videoStream = info.streams?.find((s) => s.codec_type === 'video');
|
|
67
|
-
const audioStream = info.streams?.find((s) => s.codec_type === 'audio');
|
|
68
|
-
return {
|
|
69
|
-
duration: parseFloat(info.format?.duration || '0'),
|
|
70
|
-
videoCodec: videoStream?.codec_name || 'unknown',
|
|
71
|
-
audioCodec: audioStream?.codec_name || 'unknown',
|
|
72
|
-
width: videoStream?.width || 0,
|
|
73
|
-
height: videoStream?.height || 0,
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Demo 1: Basic MP4 to WebM conversion
|
|
78
|
-
*/
|
|
79
|
-
async function demo1_BasicConversion(inputPath) {
|
|
80
|
-
console.log('\n=== Demo 1: Basic MP4 to WebM Conversion ===\n');
|
|
81
|
-
const outputPath = path.join(testDir, 'output_basic.webm');
|
|
82
|
-
// Create input from file
|
|
83
|
-
const input = new Input({
|
|
84
|
-
formats: ALL_FORMATS,
|
|
85
|
-
source: new FilePathSource(inputPath),
|
|
86
|
-
});
|
|
87
|
-
// Create output with WebM format
|
|
88
|
-
const output = new Output({
|
|
89
|
-
format: new WebMOutputFormat(),
|
|
90
|
-
target: new FilePathTarget(outputPath),
|
|
91
|
-
});
|
|
92
|
-
// Initialize conversion
|
|
93
|
-
const conversion = await Conversion.init({
|
|
94
|
-
input,
|
|
95
|
-
output,
|
|
96
|
-
showWarnings: false,
|
|
97
|
-
});
|
|
98
|
-
console.log('Conversion initialized:');
|
|
99
|
-
console.log(` Is valid: ${conversion.isValid}`);
|
|
100
|
-
console.log(` Utilized tracks: ${conversion.utilizedTracks.length}`);
|
|
101
|
-
console.log(` Discarded tracks: ${conversion.discardedTracks.length}`);
|
|
102
|
-
if (conversion.discardedTracks.length > 0) {
|
|
103
|
-
for (const { track, reason } of conversion.discardedTracks) {
|
|
104
|
-
console.log(` - ${track.type}: ${reason}`);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
// Add progress tracking
|
|
108
|
-
let lastProgress = 0;
|
|
109
|
-
conversion.onProgress = (progress) => {
|
|
110
|
-
const percent = Math.floor(progress * 100);
|
|
111
|
-
if (percent > lastProgress) {
|
|
112
|
-
process.stdout.write(`\r Converting: ${percent}%`);
|
|
113
|
-
lastProgress = percent;
|
|
114
|
-
}
|
|
115
|
-
};
|
|
116
|
-
// Execute conversion
|
|
117
|
-
console.log(' Converting: 0%');
|
|
118
|
-
await conversion.execute();
|
|
119
|
-
console.log('\n Done!');
|
|
120
|
-
// Verify output
|
|
121
|
-
const inputInfo = getFileInfo(inputPath);
|
|
122
|
-
const outputInfo = getFileInfo(outputPath);
|
|
123
|
-
console.log('\n Input file:');
|
|
124
|
-
console.log(` Codec: ${inputInfo.videoCodec}/${inputInfo.audioCodec}`);
|
|
125
|
-
console.log(` Size: ${inputInfo.width}x${inputInfo.height}`);
|
|
126
|
-
console.log(` Duration: ${inputInfo.duration.toFixed(2)}s`);
|
|
127
|
-
console.log('\n Output file:');
|
|
128
|
-
console.log(` Codec: ${outputInfo.videoCodec}/${outputInfo.audioCodec}`);
|
|
129
|
-
console.log(` Size: ${outputInfo.width}x${outputInfo.height}`);
|
|
130
|
-
console.log(` Duration: ${outputInfo.duration.toFixed(2)}s`);
|
|
131
|
-
const outputStats = fs.statSync(outputPath);
|
|
132
|
-
console.log(` File size: ${(outputStats.size / 1024).toFixed(1)} KB`);
|
|
133
|
-
// Clean up
|
|
134
|
-
input.dispose();
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Demo 2: Conversion with resizing (using OffscreenCanvas polyfill)
|
|
138
|
-
*/
|
|
139
|
-
async function demo2_ResizedConversion(inputPath) {
|
|
140
|
-
console.log('\n=== Demo 2: Conversion with Resizing (640x480 -> 320x240) ===\n');
|
|
141
|
-
const outputPath = path.join(testDir, 'output_resized.webm');
|
|
142
|
-
const input = new Input({
|
|
143
|
-
formats: ALL_FORMATS,
|
|
144
|
-
source: new FilePathSource(inputPath),
|
|
145
|
-
});
|
|
146
|
-
const output = new Output({
|
|
147
|
-
format: new WebMOutputFormat(),
|
|
148
|
-
target: new FilePathTarget(outputPath),
|
|
149
|
-
});
|
|
150
|
-
const conversion = await Conversion.init({
|
|
151
|
-
input,
|
|
152
|
-
output,
|
|
153
|
-
video: {
|
|
154
|
-
width: 320,
|
|
155
|
-
height: 240,
|
|
156
|
-
fit: 'fill',
|
|
157
|
-
},
|
|
158
|
-
showWarnings: false,
|
|
159
|
-
});
|
|
160
|
-
console.log(` Is valid: ${conversion.isValid}`);
|
|
161
|
-
console.log(` Utilized tracks: ${conversion.utilizedTracks.length}`);
|
|
162
|
-
// Progress tracking
|
|
163
|
-
let lastProgress = 0;
|
|
164
|
-
conversion.onProgress = (progress) => {
|
|
165
|
-
const percent = Math.floor(progress * 100);
|
|
166
|
-
if (percent > lastProgress) {
|
|
167
|
-
process.stdout.write(`\r Converting: ${percent}%`);
|
|
168
|
-
lastProgress = percent;
|
|
169
|
-
}
|
|
170
|
-
};
|
|
171
|
-
console.log(' Converting: 0%');
|
|
172
|
-
await conversion.execute();
|
|
173
|
-
console.log('\n Done!');
|
|
174
|
-
// Verify output
|
|
175
|
-
const outputInfo = getFileInfo(outputPath);
|
|
176
|
-
console.log(`\n Output size: ${outputInfo.width}x${outputInfo.height}`);
|
|
177
|
-
console.log(` Duration: ${outputInfo.duration.toFixed(2)}s`);
|
|
178
|
-
const outputStats = fs.statSync(outputPath);
|
|
179
|
-
console.log(` File size: ${(outputStats.size / 1024).toFixed(1)} KB`);
|
|
180
|
-
input.dispose();
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Demo 3: Conversion with trimming
|
|
184
|
-
*/
|
|
185
|
-
async function demo3_TrimmedConversion(inputPath) {
|
|
186
|
-
console.log('\n=== Demo 3: Conversion with Trimming (1s to 3s) ===\n');
|
|
187
|
-
const outputPath = path.join(testDir, 'output_trimmed.webm');
|
|
188
|
-
const input = new Input({
|
|
189
|
-
formats: ALL_FORMATS,
|
|
190
|
-
source: new FilePathSource(inputPath),
|
|
191
|
-
});
|
|
192
|
-
const output = new Output({
|
|
193
|
-
format: new WebMOutputFormat(),
|
|
194
|
-
target: new FilePathTarget(outputPath),
|
|
195
|
-
});
|
|
196
|
-
const conversion = await Conversion.init({
|
|
197
|
-
input,
|
|
198
|
-
output,
|
|
199
|
-
trim: {
|
|
200
|
-
start: 1, // Start at 1 second
|
|
201
|
-
end: 3, // End at 3 seconds
|
|
202
|
-
},
|
|
203
|
-
showWarnings: false,
|
|
204
|
-
});
|
|
205
|
-
console.log(` Is valid: ${conversion.isValid}`);
|
|
206
|
-
// Progress tracking
|
|
207
|
-
let lastProgress = 0;
|
|
208
|
-
conversion.onProgress = (progress) => {
|
|
209
|
-
const percent = Math.floor(progress * 100);
|
|
210
|
-
if (percent > lastProgress) {
|
|
211
|
-
process.stdout.write(`\r Converting: ${percent}%`);
|
|
212
|
-
lastProgress = percent;
|
|
213
|
-
}
|
|
214
|
-
};
|
|
215
|
-
console.log(' Converting: 0%');
|
|
216
|
-
await conversion.execute();
|
|
217
|
-
console.log('\n Done!');
|
|
218
|
-
// Verify output
|
|
219
|
-
const outputInfo = getFileInfo(outputPath);
|
|
220
|
-
console.log(`\n Output duration: ${outputInfo.duration.toFixed(2)}s (expected ~2s)`);
|
|
221
|
-
const outputStats = fs.statSync(outputPath);
|
|
222
|
-
console.log(` File size: ${(outputStats.size / 1024).toFixed(1)} KB`);
|
|
223
|
-
input.dispose();
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Demo 4: Audio-only extraction
|
|
227
|
-
*/
|
|
228
|
-
async function demo4_AudioOnlyConversion(inputPath) {
|
|
229
|
-
console.log('\n=== Demo 4: Audio-Only Extraction ===\n');
|
|
230
|
-
const outputPath = path.join(testDir, 'output_audio.webm');
|
|
231
|
-
const input = new Input({
|
|
232
|
-
formats: ALL_FORMATS,
|
|
233
|
-
source: new FilePathSource(inputPath),
|
|
234
|
-
});
|
|
235
|
-
const output = new Output({
|
|
236
|
-
format: new WebMOutputFormat(),
|
|
237
|
-
target: new FilePathTarget(outputPath),
|
|
238
|
-
});
|
|
239
|
-
const conversion = await Conversion.init({
|
|
240
|
-
input,
|
|
241
|
-
output,
|
|
242
|
-
video: {
|
|
243
|
-
discard: true, // Discard video track
|
|
244
|
-
},
|
|
245
|
-
showWarnings: false,
|
|
246
|
-
});
|
|
247
|
-
console.log(` Is valid: ${conversion.isValid}`);
|
|
248
|
-
console.log(` Utilized tracks: ${conversion.utilizedTracks.length}`);
|
|
249
|
-
// Progress tracking
|
|
250
|
-
let lastProgress = 0;
|
|
251
|
-
conversion.onProgress = (progress) => {
|
|
252
|
-
const percent = Math.floor(progress * 100);
|
|
253
|
-
if (percent > lastProgress) {
|
|
254
|
-
process.stdout.write(`\r Converting: ${percent}%`);
|
|
255
|
-
lastProgress = percent;
|
|
256
|
-
}
|
|
257
|
-
};
|
|
258
|
-
console.log(' Converting: 0%');
|
|
259
|
-
await conversion.execute();
|
|
260
|
-
console.log('\n Done!');
|
|
261
|
-
// Verify output
|
|
262
|
-
const outputInfo = getFileInfo(outputPath);
|
|
263
|
-
console.log(`\n Audio codec: ${outputInfo.audioCodec}`);
|
|
264
|
-
console.log(` Duration: ${outputInfo.duration.toFixed(2)}s`);
|
|
265
|
-
const outputStats = fs.statSync(outputPath);
|
|
266
|
-
console.log(` File size: ${(outputStats.size / 1024).toFixed(1)} KB`);
|
|
267
|
-
input.dispose();
|
|
268
|
-
}
|
|
269
|
-
/**
|
|
270
|
-
* Main entry point
|
|
271
|
-
*/
|
|
272
|
-
async function main() {
|
|
273
|
-
console.log('╔═══════════════════════════════════════════════════════════════╗');
|
|
274
|
-
console.log('║ Mediabunny + FFmpeg Real File Conversion Demo ║');
|
|
275
|
-
console.log('╚═══════════════════════════════════════════════════════════════╝\n');
|
|
276
|
-
console.log('This demo uses the WebCodecs FFmpeg backend with Mediabunny');
|
|
277
|
-
console.log('to perform real file conversions.\n');
|
|
278
|
-
try {
|
|
279
|
-
// Create sample video
|
|
280
|
-
const inputPath = await createSampleVideo();
|
|
281
|
-
// Run demos
|
|
282
|
-
await demo1_BasicConversion(inputPath);
|
|
283
|
-
await demo2_ResizedConversion(inputPath);
|
|
284
|
-
await demo3_TrimmedConversion(inputPath);
|
|
285
|
-
await demo4_AudioOnlyConversion(inputPath);
|
|
286
|
-
console.log('\n╔═══════════════════════════════════════════════════════════════╗');
|
|
287
|
-
console.log('║ All demos completed! ║');
|
|
288
|
-
console.log('╚═══════════════════════════════════════════════════════════════╝\n');
|
|
289
|
-
console.log('Output files:');
|
|
290
|
-
console.log(` ${testDir}/output_basic.webm`);
|
|
291
|
-
console.log(` ${testDir}/output_resized.webm`);
|
|
292
|
-
console.log(` ${testDir}/output_trimmed.webm`);
|
|
293
|
-
console.log(` ${testDir}/output_audio.webm`);
|
|
294
|
-
}
|
|
295
|
-
catch (error) {
|
|
296
|
-
console.error('\nError:', error);
|
|
297
|
-
process.exit(1);
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
main().catch(console.error);
|
|
301
|
-
//# sourceMappingURL=demo-conversion.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"demo-conversion.js","sourceRoot":"","sources":["../../src/demos/demo-conversion.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Hardware Acceleration Conversion Demo
|
|
3
|
-
*
|
|
4
|
-
* Tests video conversion with VAAPI hardware acceleration enabled.
|
|
5
|
-
* Uses H.264 codec which is well-supported by Intel VAAPI.
|
|
6
|
-
*/
|
|
7
|
-
import '../polyfill.js';
|
|
8
|
-
//# sourceMappingURL=demo-hwaccel-conversion.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"demo-hwaccel-conversion.d.ts","sourceRoot":"","sources":["../../src/demos/demo-hwaccel-conversion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmBH,OAAO,gBAAgB,CAAC"}
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Hardware Acceleration Conversion Demo
|
|
3
|
-
*
|
|
4
|
-
* Tests video conversion with VAAPI hardware acceleration enabled.
|
|
5
|
-
* Uses H.264 codec which is well-supported by Intel VAAPI.
|
|
6
|
-
*/
|
|
7
|
-
import * as fs from 'fs';
|
|
8
|
-
import * as path from 'path';
|
|
9
|
-
import { execSync } from 'child_process';
|
|
10
|
-
import { ReadableStream, WritableStream, TransformStream } from 'stream/web';
|
|
11
|
-
// Polyfill Web Streams
|
|
12
|
-
if (typeof globalThis.WritableStream === 'undefined') {
|
|
13
|
-
globalThis.WritableStream = WritableStream;
|
|
14
|
-
}
|
|
15
|
-
if (typeof globalThis.ReadableStream === 'undefined') {
|
|
16
|
-
globalThis.ReadableStream = ReadableStream;
|
|
17
|
-
}
|
|
18
|
-
if (typeof globalThis.TransformStream === 'undefined') {
|
|
19
|
-
globalThis.TransformStream = TransformStream;
|
|
20
|
-
}
|
|
21
|
-
// Install WebCodecs polyfill
|
|
22
|
-
import '../polyfill.js';
|
|
23
|
-
import { Input, Output, Conversion, FilePathSource, FilePathTarget, Mp4OutputFormat, ALL_FORMATS, registerEncoder, registerDecoder, } from 'mediabunny';
|
|
24
|
-
import { FFmpegVideoEncoder } from '../mediabunny/FFmpegVideoEncoder.js';
|
|
25
|
-
import { FFmpegVideoDecoder } from '../mediabunny/FFmpegVideoDecoder.js';
|
|
26
|
-
import { FFmpegAudioEncoder } from '../mediabunny/FFmpegAudioEncoder.js';
|
|
27
|
-
import { FFmpegAudioDecoder } from '../mediabunny/FFmpegAudioDecoder.js';
|
|
28
|
-
import { getHardwareAccelerationSummary, getBestEncoder, testEncoder } from '../HardwareAcceleration.js';
|
|
29
|
-
const OUTPUT_DIR = '/tmp/webcodecs-test-hwaccel';
|
|
30
|
-
// Custom encoder that forces hardware acceleration
|
|
31
|
-
class HardwareVideoEncoder extends FFmpegVideoEncoder {
|
|
32
|
-
async init() {
|
|
33
|
-
this.config.hardwareAcceleration = 'prefer-hardware';
|
|
34
|
-
return super.init();
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
// Custom encoder that forces software
|
|
38
|
-
class SoftwareVideoEncoder extends FFmpegVideoEncoder {
|
|
39
|
-
async init() {
|
|
40
|
-
this.config.hardwareAcceleration = 'prefer-software';
|
|
41
|
-
return super.init();
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
async function createSampleVideo() {
|
|
45
|
-
const outputPath = path.join(OUTPUT_DIR, 'sample.mp4');
|
|
46
|
-
if (!fs.existsSync(OUTPUT_DIR)) {
|
|
47
|
-
fs.mkdirSync(OUTPUT_DIR, { recursive: true });
|
|
48
|
-
}
|
|
49
|
-
// Create a 5-second test video with FFmpeg (longer for better timing comparison)
|
|
50
|
-
execSync(`ffmpeg -y -f lavfi -i "testsrc=duration=5:size=1280x720:rate=30" -f lavfi -i "sine=frequency=440:duration=5" -c:v libx264 -preset ultrafast -c:a aac -pix_fmt yuv420p "${outputPath}" 2>/dev/null`);
|
|
51
|
-
return outputPath;
|
|
52
|
-
}
|
|
53
|
-
function getFileInfo(filePath) {
|
|
54
|
-
const probe = execSync(`ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "${filePath}" 2>/dev/null`).toString().trim();
|
|
55
|
-
const size = fs.statSync(filePath).size;
|
|
56
|
-
return {
|
|
57
|
-
duration: parseFloat(probe),
|
|
58
|
-
size,
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
async function main() {
|
|
62
|
-
console.log('╔═══════════════════════════════════════════════════════════════╗');
|
|
63
|
-
console.log('║ Hardware vs Software Encoding Comparison Demo ║');
|
|
64
|
-
console.log('╚═══════════════════════════════════════════════════════════════╝\n');
|
|
65
|
-
// Show hardware acceleration info
|
|
66
|
-
const summary = await getHardwareAccelerationSummary();
|
|
67
|
-
console.log(summary);
|
|
68
|
-
console.log('');
|
|
69
|
-
// Check what encoders will be used and test them
|
|
70
|
-
console.log('Testing encoder availability:');
|
|
71
|
-
for (const codec of ['h264', 'hevc', 'vp8', 'vp9']) {
|
|
72
|
-
const best = await getBestEncoder(codec, 'prefer-hardware');
|
|
73
|
-
const works = best.isHardware ? await testEncoder(best.encoder) : true;
|
|
74
|
-
const status = best.isHardware ? (works ? '✓ HW' : '✗ HW (failed)') : '○ SW';
|
|
75
|
-
console.log(` ${codec.toUpperCase()}: ${status} ${best.encoder}`);
|
|
76
|
-
}
|
|
77
|
-
console.log('');
|
|
78
|
-
// Create sample video (1280x720, 5 seconds)
|
|
79
|
-
console.log('Creating sample video (1280x720, 5 seconds)...');
|
|
80
|
-
const inputPath = await createSampleVideo();
|
|
81
|
-
const inputInfo = getFileInfo(inputPath);
|
|
82
|
-
console.log(` Input: ${inputPath} (${(inputInfo.size / 1024).toFixed(1)} KB)\n`);
|
|
83
|
-
// Register audio encoders/decoders (these don't have HW acceleration)
|
|
84
|
-
registerEncoder(FFmpegAudioEncoder);
|
|
85
|
-
registerDecoder(FFmpegAudioDecoder);
|
|
86
|
-
registerDecoder(FFmpegVideoDecoder);
|
|
87
|
-
// Test with hardware acceleration (H.264 VAAPI)
|
|
88
|
-
console.log('=== Converting with Hardware Acceleration (H.264 VAAPI) ===\n');
|
|
89
|
-
registerEncoder(HardwareVideoEncoder);
|
|
90
|
-
try {
|
|
91
|
-
const hwOutput = path.join(OUTPUT_DIR, 'output_hardware.mp4');
|
|
92
|
-
const startTime = Date.now();
|
|
93
|
-
const input = new Input({
|
|
94
|
-
formats: ALL_FORMATS,
|
|
95
|
-
source: new FilePathSource(inputPath),
|
|
96
|
-
});
|
|
97
|
-
// MP4 with H.264 - well supported by VAAPI
|
|
98
|
-
const output = new Output({
|
|
99
|
-
format: new Mp4OutputFormat(),
|
|
100
|
-
target: new FilePathTarget(hwOutput),
|
|
101
|
-
});
|
|
102
|
-
const conversion = await Conversion.init({
|
|
103
|
-
input,
|
|
104
|
-
output,
|
|
105
|
-
showWarnings: false,
|
|
106
|
-
});
|
|
107
|
-
await conversion.execute();
|
|
108
|
-
const endTime = Date.now();
|
|
109
|
-
const info = getFileInfo(hwOutput);
|
|
110
|
-
console.log(` Output: ${hwOutput}`);
|
|
111
|
-
console.log(` Duration: ${info.duration.toFixed(2)}s`);
|
|
112
|
-
console.log(` File size: ${(info.size / 1024).toFixed(1)} KB`);
|
|
113
|
-
console.log(` Encoding time: ${endTime - startTime}ms`);
|
|
114
|
-
}
|
|
115
|
-
catch (err) {
|
|
116
|
-
console.log(` Error: ${err.message}`);
|
|
117
|
-
}
|
|
118
|
-
console.log('');
|
|
119
|
-
// Test with software encoding (H.264 libx264)
|
|
120
|
-
console.log('=== Converting with Software Encoding (H.264 libx264) ===\n');
|
|
121
|
-
registerEncoder(SoftwareVideoEncoder);
|
|
122
|
-
try {
|
|
123
|
-
const swOutput = path.join(OUTPUT_DIR, 'output_software.mp4');
|
|
124
|
-
const startTime = Date.now();
|
|
125
|
-
const input = new Input({
|
|
126
|
-
formats: ALL_FORMATS,
|
|
127
|
-
source: new FilePathSource(inputPath),
|
|
128
|
-
});
|
|
129
|
-
const output = new Output({
|
|
130
|
-
format: new Mp4OutputFormat(),
|
|
131
|
-
target: new FilePathTarget(swOutput),
|
|
132
|
-
});
|
|
133
|
-
const conversion = await Conversion.init({
|
|
134
|
-
input,
|
|
135
|
-
output,
|
|
136
|
-
showWarnings: false,
|
|
137
|
-
});
|
|
138
|
-
await conversion.execute();
|
|
139
|
-
const endTime = Date.now();
|
|
140
|
-
const info = getFileInfo(swOutput);
|
|
141
|
-
console.log(` Output: ${swOutput}`);
|
|
142
|
-
console.log(` Duration: ${info.duration.toFixed(2)}s`);
|
|
143
|
-
console.log(` File size: ${(info.size / 1024).toFixed(1)} KB`);
|
|
144
|
-
console.log(` Encoding time: ${endTime - startTime}ms`);
|
|
145
|
-
}
|
|
146
|
-
catch (err) {
|
|
147
|
-
console.log(` Error: ${err.message}`);
|
|
148
|
-
}
|
|
149
|
-
console.log('\n╔═══════════════════════════════════════════════════════════════╗');
|
|
150
|
-
console.log('║ Demo Complete! ║');
|
|
151
|
-
console.log('╚═══════════════════════════════════════════════════════════════╝\n');
|
|
152
|
-
// Summary
|
|
153
|
-
console.log('Note: Intel VAAPI typically supports:');
|
|
154
|
-
console.log(' - H.264 encoding ✓');
|
|
155
|
-
console.log(' - HEVC encoding ✓');
|
|
156
|
-
console.log(' - VP8 encoding ✓');
|
|
157
|
-
console.log(' - VP9 decoding only (no encoding)');
|
|
158
|
-
console.log('');
|
|
159
|
-
}
|
|
160
|
-
main().catch(console.error);
|
|
161
|
-
//# sourceMappingURL=demo-hwaccel-conversion.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"demo-hwaccel-conversion.js","sourceRoot":"","sources":["../../src/demos/demo-hwaccel-conversion.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"demo-mediabunny.d.ts","sourceRoot":"","sources":["../../src/demos/demo-mediabunny.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Demo: Mediabunny + FFmpeg Backend
|
|
3
|
-
*
|
|
4
|
-
* Shows how to use Mediabunny with FFmpeg for video encoding/decoding in Node.js.
|
|
5
|
-
*/
|
|
6
|
-
import { registerFFmpegCoders } from '../mediabunny/index.js';
|
|
7
|
-
// Register FFmpeg coders before using Mediabunny
|
|
8
|
-
registerFFmpegCoders();
|
|
9
|
-
// Mediabunny is now ready to use with FFmpeg backend
|
|
10
|
-
async function main() {
|
|
11
|
-
console.log('Mediabunny + FFmpeg Demo');
|
|
12
|
-
console.log('========================\n');
|
|
13
|
-
// Test basic functionality
|
|
14
|
-
console.log('FFmpeg coders registered successfully!');
|
|
15
|
-
console.log('');
|
|
16
|
-
console.log('Mediabunny will now use FFmpeg for:');
|
|
17
|
-
console.log('');
|
|
18
|
-
console.log(' Video codecs:');
|
|
19
|
-
console.log(' - AVC (H.264) encoding/decoding');
|
|
20
|
-
console.log(' - HEVC (H.265) encoding/decoding');
|
|
21
|
-
console.log(' - VP8 encoding/decoding');
|
|
22
|
-
console.log(' - VP9 encoding/decoding');
|
|
23
|
-
console.log(' - AV1 encoding/decoding');
|
|
24
|
-
console.log('');
|
|
25
|
-
console.log(' Audio codecs:');
|
|
26
|
-
console.log(' - AAC encoding/decoding');
|
|
27
|
-
console.log(' - Opus encoding/decoding');
|
|
28
|
-
console.log(' - MP3 encoding/decoding');
|
|
29
|
-
console.log(' - FLAC encoding/decoding');
|
|
30
|
-
console.log(' - Vorbis encoding/decoding');
|
|
31
|
-
console.log(' - PCM (all variants) encoding/decoding');
|
|
32
|
-
console.log('');
|
|
33
|
-
// Example: Create a simple video conversion workflow
|
|
34
|
-
// This demonstrates the architecture - actual file I/O would use Mediabunny's
|
|
35
|
-
// demuxers and muxers
|
|
36
|
-
console.log('Architecture:');
|
|
37
|
-
console.log('');
|
|
38
|
-
console.log(' ┌─────────────────────────────────────────────────────┐');
|
|
39
|
-
console.log(' │ Mediabunny │');
|
|
40
|
-
console.log(' │ ┌─────────────┐ ┌─────────────┐ │');
|
|
41
|
-
console.log(' │ │ Demuxer │ │ Muxer │ │');
|
|
42
|
-
console.log(' │ │ (MP4/WebM) │ │ (MP4/WebM) │ │');
|
|
43
|
-
console.log(' │ └──────┬──────┘ └──────▲──────┘ │');
|
|
44
|
-
console.log(' │ │ │ │');
|
|
45
|
-
console.log(' │ ▼ │ │');
|
|
46
|
-
console.log(' │ ┌─────────────┐ ┌─────────────┐ │');
|
|
47
|
-
console.log(' │ │ FFmpeg │ │ FFmpeg │ │');
|
|
48
|
-
console.log(' │ │ Decoder │─────────────▶│ Encoder │ │');
|
|
49
|
-
console.log(' │ │ (child) │ VideoSample │ (child) │ │');
|
|
50
|
-
console.log(' │ └─────────────┘ └─────────────┘ │');
|
|
51
|
-
console.log(' └─────────────────────────────────────────────────────┘');
|
|
52
|
-
console.log('');
|
|
53
|
-
// Note: Full conversion example would require actual video files
|
|
54
|
-
// Here's how it would look:
|
|
55
|
-
console.log('Example usage:');
|
|
56
|
-
console.log('');
|
|
57
|
-
console.log(`
|
|
58
|
-
import { registerFFmpegCoders } from 'webcodecs-node/mediabunny';
|
|
59
|
-
import { MP4, WebM, convert } from 'mediabunny';
|
|
60
|
-
|
|
61
|
-
// Register FFmpeg backend
|
|
62
|
-
registerFFmpegCoders();
|
|
63
|
-
|
|
64
|
-
// Convert MP4 to WebM
|
|
65
|
-
const source = MP4.source(inputFile);
|
|
66
|
-
const target = WebM.target(outputStream);
|
|
67
|
-
|
|
68
|
-
await convert({
|
|
69
|
-
source,
|
|
70
|
-
target,
|
|
71
|
-
video: { codec: 'vp9', bitrate: 2_000_000 },
|
|
72
|
-
audio: { codec: 'opus', bitrate: 128_000 },
|
|
73
|
-
});
|
|
74
|
-
`);
|
|
75
|
-
console.log('\nDemo complete!');
|
|
76
|
-
}
|
|
77
|
-
main().catch(console.error);
|
|
78
|
-
//# sourceMappingURL=demo-mediabunny.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"demo-mediabunny.js","sourceRoot":"","sources":["../../src/demos/demo-mediabunny.ts"],"names":[],"mappings":"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"}
|