webcodecs-node 0.7.5 → 0.8.5
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/README.md +12 -4
- package/dist/backends/node-av/HardwarePipeline.d.ts +36 -0
- package/dist/backends/node-av/HardwarePipeline.d.ts.map +1 -0
- package/dist/backends/node-av/HardwarePipeline.js +203 -0
- package/dist/backends/node-av/HardwarePipeline.js.map +1 -0
- package/dist/backends/node-av/audio/NodeAvAudioDecoder.d.ts +46 -0
- package/dist/backends/node-av/audio/NodeAvAudioDecoder.d.ts.map +1 -0
- package/dist/backends/node-av/audio/NodeAvAudioDecoder.js +277 -0
- package/dist/backends/node-av/audio/NodeAvAudioDecoder.js.map +1 -0
- package/dist/backends/node-av/audio/NodeAvAudioEncoder.d.ts +47 -0
- package/dist/backends/node-av/audio/NodeAvAudioEncoder.d.ts.map +1 -0
- package/dist/backends/node-av/audio/NodeAvAudioEncoder.js +363 -0
- package/dist/backends/node-av/audio/NodeAvAudioEncoder.js.map +1 -0
- package/dist/backends/node-av/audio/decoder/channel-layout.d.ts +12 -0
- package/dist/backends/node-av/audio/decoder/channel-layout.d.ts.map +1 -0
- package/dist/backends/node-av/audio/decoder/channel-layout.js +24 -0
- package/dist/backends/node-av/audio/decoder/channel-layout.js.map +1 -0
- package/dist/backends/node-av/audio/decoder/codec-mapping.d.ts +9 -0
- package/dist/backends/node-av/audio/decoder/codec-mapping.d.ts.map +1 -0
- package/dist/backends/node-av/audio/decoder/codec-mapping.js +40 -0
- package/dist/backends/node-av/audio/decoder/codec-mapping.js.map +1 -0
- package/dist/backends/node-av/audio/decoder/constants.d.ts +6 -0
- package/dist/backends/node-av/audio/decoder/constants.d.ts.map +1 -0
- package/dist/backends/node-av/audio/decoder/constants.js +6 -0
- package/dist/backends/node-av/audio/decoder/constants.js.map +1 -0
- package/dist/backends/node-av/audio/decoder/index.d.ts +8 -0
- package/dist/backends/node-av/audio/decoder/index.d.ts.map +1 -0
- package/dist/backends/node-av/audio/decoder/index.js +8 -0
- package/dist/backends/node-av/audio/decoder/index.js.map +1 -0
- package/dist/backends/node-av/audio/decoder/sample-format.d.ts +14 -0
- package/dist/backends/node-av/audio/decoder/sample-format.d.ts.map +1 -0
- package/dist/backends/node-av/audio/decoder/sample-format.js +54 -0
- package/dist/backends/node-av/audio/decoder/sample-format.js.map +1 -0
- package/dist/backends/node-av/audio/encoder/channel-layout.d.ts +12 -0
- package/dist/backends/node-av/audio/encoder/channel-layout.d.ts.map +1 -0
- package/dist/backends/node-av/audio/encoder/channel-layout.js +24 -0
- package/dist/backends/node-av/audio/encoder/channel-layout.js.map +1 -0
- package/dist/backends/node-av/audio/encoder/codec-description.d.ts +33 -0
- package/dist/backends/node-av/audio/encoder/codec-description.d.ts.map +1 -0
- package/dist/backends/node-av/audio/encoder/codec-description.js +137 -0
- package/dist/backends/node-av/audio/encoder/codec-description.js.map +1 -0
- package/dist/backends/node-av/audio/encoder/codec-mapping.d.ts +12 -0
- package/dist/backends/node-av/audio/encoder/codec-mapping.d.ts.map +1 -0
- package/dist/backends/node-av/audio/encoder/codec-mapping.js +61 -0
- package/dist/backends/node-av/audio/encoder/codec-mapping.js.map +1 -0
- package/dist/backends/node-av/audio/encoder/constants.d.ts +6 -0
- package/dist/backends/node-av/audio/encoder/constants.d.ts.map +1 -0
- package/dist/backends/node-av/audio/encoder/constants.js +6 -0
- package/dist/backends/node-av/audio/encoder/constants.js.map +1 -0
- package/dist/backends/node-av/audio/encoder/drain.d.ts +32 -0
- package/dist/backends/node-av/audio/encoder/drain.d.ts.map +1 -0
- package/dist/backends/node-av/audio/encoder/drain.js +51 -0
- package/dist/backends/node-av/audio/encoder/drain.js.map +1 -0
- package/dist/backends/node-av/audio/encoder/index.d.ts +20 -0
- package/dist/backends/node-av/audio/encoder/index.d.ts.map +1 -0
- package/dist/backends/node-av/audio/encoder/index.js +20 -0
- package/dist/backends/node-av/audio/encoder/index.js.map +1 -0
- package/dist/backends/node-av/audio/encoder/options.d.ts +40 -0
- package/dist/backends/node-av/audio/encoder/options.d.ts.map +1 -0
- package/dist/backends/node-av/audio/encoder/options.js +127 -0
- package/dist/backends/node-av/audio/encoder/options.js.map +1 -0
- package/dist/backends/node-av/audio/encoder/sample-format-convert.d.ts +40 -0
- package/dist/backends/node-av/audio/encoder/sample-format-convert.d.ts.map +1 -0
- package/dist/backends/node-av/audio/encoder/sample-format-convert.js +152 -0
- package/dist/backends/node-av/audio/encoder/sample-format-convert.js.map +1 -0
- package/dist/backends/node-av/hardware-pipeline/capabilities.d.ts +10 -0
- package/dist/backends/node-av/hardware-pipeline/capabilities.d.ts.map +1 -0
- package/dist/backends/node-av/hardware-pipeline/capabilities.js +45 -0
- package/dist/backends/node-av/hardware-pipeline/capabilities.js.map +1 -0
- package/dist/backends/node-av/hardware-pipeline/index.d.ts +6 -0
- package/dist/backends/node-av/hardware-pipeline/index.d.ts.map +1 -0
- package/dist/backends/node-av/hardware-pipeline/index.js +5 -0
- package/dist/backends/node-av/hardware-pipeline/index.js.map +1 -0
- package/dist/backends/node-av/hardware-pipeline/types.d.ts +13 -0
- package/dist/backends/node-av/hardware-pipeline/types.d.ts.map +1 -0
- package/dist/backends/node-av/hardware-pipeline/types.js +5 -0
- package/dist/backends/node-av/hardware-pipeline/types.js.map +1 -0
- package/dist/backends/node-av/image/NodeAvImageDecoder.d.ts +95 -0
- package/dist/backends/node-av/image/NodeAvImageDecoder.d.ts.map +1 -0
- package/dist/backends/node-av/image/NodeAvImageDecoder.js +383 -0
- package/dist/backends/node-av/image/NodeAvImageDecoder.js.map +1 -0
- package/dist/backends/node-av/image/WebPImageDecoder.d.ts +57 -0
- package/dist/backends/node-av/image/WebPImageDecoder.d.ts.map +1 -0
- package/dist/backends/node-av/image/WebPImageDecoder.js +178 -0
- package/dist/backends/node-av/image/WebPImageDecoder.js.map +1 -0
- package/dist/backends/node-av/image/decoder/constants.d.ts +14 -0
- package/dist/backends/node-av/image/decoder/constants.d.ts.map +1 -0
- package/dist/backends/node-av/image/decoder/constants.js +24 -0
- package/dist/backends/node-av/image/decoder/constants.js.map +1 -0
- package/dist/backends/node-av/image/decoder/index.d.ts +7 -0
- package/dist/backends/node-av/image/decoder/index.d.ts.map +1 -0
- package/dist/backends/node-av/image/decoder/index.js +6 -0
- package/dist/backends/node-av/image/decoder/index.js.map +1 -0
- package/dist/backends/node-av/image/decoder/probe.d.ts +12 -0
- package/dist/backends/node-av/image/decoder/probe.d.ts.map +1 -0
- package/dist/backends/node-av/image/decoder/probe.js +57 -0
- package/dist/backends/node-av/image/decoder/probe.js.map +1 -0
- package/dist/backends/node-av/image/decoder/types.d.ts +25 -0
- package/dist/backends/node-av/image/decoder/types.d.ts.map +1 -0
- package/dist/backends/node-av/image/decoder/types.js +5 -0
- package/dist/backends/node-av/image/decoder/types.js.map +1 -0
- package/dist/backends/node-av/video/NodeAvVideoDecoder.d.ts +44 -0
- package/dist/backends/node-av/video/NodeAvVideoDecoder.d.ts.map +1 -0
- package/dist/backends/node-av/video/NodeAvVideoDecoder.js +326 -0
- package/dist/backends/node-av/video/NodeAvVideoDecoder.js.map +1 -0
- package/dist/backends/node-av/video/NodeAvVideoEncoder.d.ts +49 -0
- package/dist/backends/node-av/video/NodeAvVideoEncoder.d.ts.map +1 -0
- package/dist/backends/node-av/video/NodeAvVideoEncoder.js +317 -0
- package/dist/backends/node-av/video/NodeAvVideoEncoder.js.map +1 -0
- package/dist/backends/node-av/video/decoder/codec-mapping.d.ts +9 -0
- package/dist/backends/node-av/video/decoder/codec-mapping.d.ts.map +1 -0
- package/dist/backends/node-av/video/decoder/codec-mapping.js +25 -0
- package/dist/backends/node-av/video/decoder/codec-mapping.js.map +1 -0
- package/dist/backends/node-av/video/decoder/constants.d.ts +13 -0
- package/dist/backends/node-av/video/decoder/constants.d.ts.map +1 -0
- package/dist/backends/node-av/video/decoder/constants.js +13 -0
- package/dist/backends/node-av/video/decoder/constants.js.map +1 -0
- package/dist/backends/node-av/video/decoder/index.d.ts +7 -0
- package/dist/backends/node-av/video/decoder/index.d.ts.map +1 -0
- package/dist/backends/node-av/video/decoder/index.js +7 -0
- package/dist/backends/node-av/video/decoder/index.js.map +1 -0
- package/dist/backends/node-av/video/decoder/pixel-format.d.ts +13 -0
- package/dist/backends/node-av/video/decoder/pixel-format.d.ts.map +1 -0
- package/dist/backends/node-av/video/decoder/pixel-format.js +88 -0
- package/dist/backends/node-av/video/decoder/pixel-format.js.map +1 -0
- package/dist/backends/node-av/video/encoder/codec-description.d.ts +26 -0
- package/dist/backends/node-av/video/encoder/codec-description.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/codec-description.js +86 -0
- package/dist/backends/node-av/video/encoder/codec-description.js.map +1 -0
- package/dist/backends/node-av/video/encoder/drain.d.ts +34 -0
- package/dist/backends/node-av/video/encoder/drain.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/drain.js +51 -0
- package/dist/backends/node-av/video/encoder/drain.js.map +1 -0
- package/dist/backends/node-av/video/encoder/filters.d.ts +37 -0
- package/dist/backends/node-av/video/encoder/filters.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/filters.js +71 -0
- package/dist/backends/node-av/video/encoder/filters.js.map +1 -0
- package/dist/backends/node-av/video/encoder/gpu-filters.d.ts +9 -0
- package/dist/backends/node-av/video/encoder/gpu-filters.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/gpu-filters.js +26 -0
- package/dist/backends/node-av/video/encoder/gpu-filters.js.map +1 -0
- package/dist/backends/node-av/video/encoder/hardware-constraints.d.ts +12 -0
- package/dist/backends/node-av/video/encoder/hardware-constraints.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/hardware-constraints.js +31 -0
- package/dist/backends/node-av/video/encoder/hardware-constraints.js.map +1 -0
- package/dist/backends/node-av/video/encoder/index.d.ts +28 -0
- package/dist/backends/node-av/video/encoder/index.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/index.js +28 -0
- package/dist/backends/node-av/video/encoder/index.js.map +1 -0
- package/dist/backends/node-av/video/encoder/options.d.ts +39 -0
- package/dist/backends/node-av/video/encoder/options.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/options.js +195 -0
- package/dist/backends/node-av/video/encoder/options.js.map +1 -0
- package/dist/backends/node-av/video/encoder/pixel-format-config.d.ts +42 -0
- package/dist/backends/node-av/video/encoder/pixel-format-config.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/pixel-format-config.js +122 -0
- package/dist/backends/node-av/video/encoder/pixel-format-config.js.map +1 -0
- package/dist/backends/node-av/video/encoder/pixel-format.d.ts +13 -0
- package/dist/backends/node-av/video/encoder/pixel-format.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/pixel-format.js +68 -0
- package/dist/backends/node-av/video/encoder/pixel-format.js.map +1 -0
- package/dist/backends/node-av/video/encoder/setup.d.ts +33 -0
- package/dist/backends/node-av/video/encoder/setup.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/setup.js +62 -0
- package/dist/backends/node-av/video/encoder/setup.js.map +1 -0
- package/dist/backends/node-av/video/encoder/software-encoders.d.ts +8 -0
- package/dist/backends/node-av/video/encoder/software-encoders.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/software-encoders.js +17 -0
- package/dist/backends/node-av/video/encoder/software-encoders.js.map +1 -0
- package/dist/backends/node-av/video/encoder/timestamp.d.ts +34 -0
- package/dist/backends/node-av/video/encoder/timestamp.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/timestamp.js +39 -0
- package/dist/backends/node-av/video/encoder/timestamp.js.map +1 -0
- package/dist/backends/types.d.ts +44 -0
- package/dist/backends/types.d.ts.map +1 -1
- package/dist/backends/types.js.map +1 -1
- package/dist/codec-utils/formats.d.ts.map +1 -1
- package/dist/codec-utils/formats.js +78 -0
- package/dist/codec-utils/formats.js.map +1 -1
- package/dist/codec-utils/types.d.ts +1 -1
- package/dist/codecs/aac.d.ts +10 -0
- package/dist/codecs/aac.d.ts.map +1 -0
- package/dist/codecs/aac.js +10 -0
- package/dist/codecs/aac.js.map +1 -0
- package/dist/codecs/avc.d.ts +11 -0
- package/dist/codecs/avc.d.ts.map +1 -0
- package/dist/codecs/avc.js +11 -0
- package/dist/codecs/avc.js.map +1 -0
- package/dist/codecs/hevc.d.ts +11 -0
- package/dist/codecs/hevc.d.ts.map +1 -0
- package/dist/codecs/hevc.js +11 -0
- package/dist/codecs/hevc.js.map +1 -0
- package/dist/codecs/index.d.ts +10 -0
- package/dist/codecs/index.d.ts.map +1 -0
- package/dist/codecs/index.js +14 -0
- package/dist/codecs/index.js.map +1 -0
- package/dist/codecs/validation/audio.d.ts +19 -0
- package/dist/codecs/validation/audio.d.ts.map +1 -0
- package/dist/codecs/validation/audio.js +111 -0
- package/dist/codecs/validation/audio.js.map +1 -0
- package/dist/codecs/validation/config.d.ts +27 -0
- package/dist/codecs/validation/config.d.ts.map +1 -0
- package/dist/codecs/validation/config.js +154 -0
- package/dist/codecs/validation/config.js.map +1 -0
- package/dist/codecs/validation/index.d.ts +9 -0
- package/dist/codecs/validation/index.d.ts.map +1 -0
- package/dist/codecs/validation/index.js +12 -0
- package/dist/codecs/validation/index.js.map +1 -0
- package/dist/codecs/validation/video.d.ts +24 -0
- package/dist/codecs/validation/video.d.ts.map +1 -0
- package/dist/codecs/validation/video.js +196 -0
- package/dist/codecs/validation/video.js.map +1 -0
- package/dist/containers/NodeAvMuxer.d.ts +7 -0
- package/dist/containers/NodeAvMuxer.d.ts.map +1 -1
- package/dist/containers/NodeAvMuxer.js +127 -7
- package/dist/containers/NodeAvMuxer.js.map +1 -1
- package/dist/core/AudioData.d.ts.map +1 -1
- package/dist/core/AudioData.js +54 -12
- package/dist/core/AudioData.js.map +1 -1
- package/dist/core/EncodedAudioChunk.d.ts.map +1 -1
- package/dist/core/EncodedAudioChunk.js +74 -6
- package/dist/core/EncodedAudioChunk.js.map +1 -1
- package/dist/core/EncodedVideoChunk.d.ts +2 -0
- package/dist/core/EncodedVideoChunk.d.ts.map +1 -1
- package/dist/core/EncodedVideoChunk.js +70 -2
- package/dist/core/EncodedVideoChunk.js.map +1 -1
- package/dist/core/VideoFrame.d.ts +16 -10
- package/dist/core/VideoFrame.d.ts.map +1 -1
- package/dist/core/VideoFrame.js +238 -129
- package/dist/core/VideoFrame.js.map +1 -1
- package/dist/core/video-frame/layout.d.ts +10 -0
- package/dist/core/video-frame/layout.d.ts.map +1 -0
- package/dist/core/video-frame/layout.js +97 -0
- package/dist/core/video-frame/layout.js.map +1 -0
- package/dist/core/video-frame/orientation.d.ts +23 -0
- package/dist/core/video-frame/orientation.d.ts.map +1 -0
- package/dist/core/video-frame/orientation.js +49 -0
- package/dist/core/video-frame/orientation.js.map +1 -0
- package/dist/core/video-frame/transfer.d.ts +19 -0
- package/dist/core/video-frame/transfer.d.ts.map +1 -0
- package/dist/core/video-frame/transfer.js +78 -0
- package/dist/core/video-frame/transfer.js.map +1 -0
- package/dist/core/video-frame/validation.d.ts +28 -0
- package/dist/core/video-frame/validation.d.ts.map +1 -0
- package/dist/core/video-frame/validation.js +76 -0
- package/dist/core/video-frame/validation.js.map +1 -0
- package/dist/decoders/AudioDecoder.d.ts +2 -19
- package/dist/decoders/AudioDecoder.d.ts.map +1 -1
- package/dist/decoders/AudioDecoder.js +27 -11
- package/dist/decoders/AudioDecoder.js.map +1 -1
- package/dist/decoders/ImageDecoder.d.ts +34 -41
- package/dist/decoders/ImageDecoder.d.ts.map +1 -1
- package/dist/decoders/ImageDecoder.js +158 -266
- package/dist/decoders/ImageDecoder.js.map +1 -1
- package/dist/decoders/VideoDecoder.d.ts +2 -38
- package/dist/decoders/VideoDecoder.d.ts.map +1 -1
- package/dist/decoders/VideoDecoder.js +120 -120
- package/dist/decoders/VideoDecoder.js.map +1 -1
- package/dist/decoders/audio/config.d.ts +23 -0
- package/dist/decoders/audio/config.d.ts.map +1 -0
- package/dist/decoders/audio/config.js +112 -0
- package/dist/decoders/audio/config.js.map +1 -0
- package/dist/decoders/audio/constants.d.ts +6 -0
- package/dist/decoders/audio/constants.d.ts.map +1 -0
- package/dist/decoders/audio/constants.js +6 -0
- package/dist/decoders/audio/constants.js.map +1 -0
- package/dist/decoders/audio/types.d.ts +21 -0
- package/dist/decoders/audio/types.d.ts.map +1 -0
- package/dist/decoders/audio/types.js +5 -0
- package/dist/decoders/audio/types.js.map +1 -0
- package/dist/decoders/image/orientation.d.ts +16 -0
- package/dist/decoders/image/orientation.d.ts.map +1 -0
- package/dist/decoders/image/orientation.js +170 -0
- package/dist/decoders/image/orientation.js.map +1 -0
- package/dist/decoders/image/stream.d.ts +12 -0
- package/dist/decoders/image/stream.d.ts.map +1 -0
- package/dist/decoders/image/stream.js +41 -0
- package/dist/decoders/image/stream.js.map +1 -0
- package/dist/decoders/image/tracks.d.ts +76 -0
- package/dist/decoders/image/tracks.d.ts.map +1 -0
- package/dist/decoders/image/tracks.js +136 -0
- package/dist/decoders/image/tracks.js.map +1 -0
- package/dist/decoders/image/types.d.ts +36 -0
- package/dist/decoders/image/types.d.ts.map +1 -0
- package/dist/decoders/image/types.js +5 -0
- package/dist/decoders/image/types.js.map +1 -0
- package/dist/decoders/video/codec-specific.d.ts +19 -0
- package/dist/decoders/video/codec-specific.d.ts.map +1 -0
- package/dist/decoders/video/codec-specific.js +62 -0
- package/dist/decoders/video/codec-specific.js.map +1 -0
- package/dist/decoders/video/config.d.ts +17 -0
- package/dist/decoders/video/config.d.ts.map +1 -0
- package/dist/decoders/video/config.js +91 -0
- package/dist/decoders/video/config.js.map +1 -0
- package/dist/decoders/video/constants.d.ts +8 -0
- package/dist/decoders/video/constants.d.ts.map +1 -0
- package/dist/decoders/video/constants.js +13 -0
- package/dist/decoders/video/constants.js.map +1 -0
- package/dist/decoders/video/queue.d.ts +9 -0
- package/dist/decoders/video/queue.d.ts.map +1 -0
- package/dist/decoders/video/queue.js +17 -0
- package/dist/decoders/video/queue.js.map +1 -0
- package/dist/decoders/video/types.d.ts +41 -0
- package/dist/decoders/video/types.d.ts.map +1 -0
- package/dist/decoders/video/types.js +5 -0
- package/dist/decoders/video/types.js.map +1 -0
- package/dist/demos/demo-audio-visualizer.js +74 -48
- package/dist/demos/demo-audio-visualizer.js.map +1 -1
- package/dist/demos/demo-dvd-logo.js +26 -23
- package/dist/demos/demo-dvd-logo.js.map +1 -1
- package/dist/demos/demo-flow-field.d.ts +11 -0
- package/dist/demos/demo-flow-field.d.ts.map +1 -0
- package/dist/demos/demo-flow-field.js +305 -0
- package/dist/demos/demo-flow-field.js.map +1 -0
- package/dist/demos/demo-four-corners.js +56 -120
- package/dist/demos/demo-four-corners.js.map +1 -1
- package/dist/demos/demo-image.js +24 -19
- package/dist/demos/demo-image.js.map +1 -1
- package/dist/demos/demo-matrix-rain.d.ts +11 -0
- package/dist/demos/demo-matrix-rain.d.ts.map +1 -0
- package/dist/demos/demo-matrix-rain.js +246 -0
- package/dist/demos/demo-matrix-rain.js.map +1 -0
- package/dist/demos/demo-pipeline.js +56 -51
- package/dist/demos/demo-pipeline.js.map +1 -1
- package/dist/demos/demo-samples.js +56 -402
- package/dist/demos/demo-samples.js.map +1 -1
- package/dist/encoders/AudioEncoder.d.ts +2 -28
- package/dist/encoders/AudioEncoder.d.ts.map +1 -1
- package/dist/encoders/AudioEncoder.js +80 -20
- package/dist/encoders/AudioEncoder.js.map +1 -1
- package/dist/encoders/VideoEncoder.d.ts +25 -46
- package/dist/encoders/VideoEncoder.d.ts.map +1 -1
- package/dist/encoders/VideoEncoder.js +180 -88
- package/dist/encoders/VideoEncoder.js.map +1 -1
- package/dist/encoders/audio/config.d.ts +30 -0
- package/dist/encoders/audio/config.d.ts.map +1 -0
- package/dist/encoders/audio/config.js +169 -0
- package/dist/encoders/audio/config.js.map +1 -0
- package/dist/encoders/audio/constants.d.ts +8 -0
- package/dist/encoders/audio/constants.d.ts.map +1 -0
- package/dist/encoders/audio/constants.js +8 -0
- package/dist/encoders/audio/constants.js.map +1 -0
- package/dist/encoders/audio/types.d.ts +70 -0
- package/dist/encoders/audio/types.d.ts.map +1 -0
- package/dist/encoders/audio/types.js +5 -0
- package/dist/encoders/audio/types.js.map +1 -0
- package/dist/encoders/video/config.d.ts +25 -0
- package/dist/encoders/video/config.d.ts.map +1 -0
- package/dist/encoders/video/config.js +132 -0
- package/dist/encoders/video/config.js.map +1 -0
- package/dist/encoders/video/constants.d.ts +8 -0
- package/dist/encoders/video/constants.d.ts.map +1 -0
- package/dist/encoders/video/constants.js +8 -0
- package/dist/encoders/video/constants.js.map +1 -0
- package/dist/encoders/video/queue.d.ts +9 -0
- package/dist/encoders/video/queue.d.ts.map +1 -0
- package/dist/encoders/video/queue.js +17 -0
- package/dist/encoders/video/queue.js.map +1 -0
- package/dist/encoders/video/types.d.ts +104 -0
- package/dist/encoders/video/types.d.ts.map +1 -0
- package/dist/encoders/video/types.js +5 -0
- package/dist/encoders/video/types.js.map +1 -0
- package/dist/formats/color-space/convert.d.ts +27 -0
- package/dist/formats/color-space/convert.d.ts.map +1 -0
- package/dist/formats/color-space/convert.js +91 -0
- package/dist/formats/color-space/convert.js.map +1 -0
- package/dist/formats/color-space/extract.d.ts +32 -0
- package/dist/formats/color-space/extract.d.ts.map +1 -0
- package/dist/formats/color-space/extract.js +116 -0
- package/dist/formats/color-space/extract.js.map +1 -0
- package/dist/formats/color-space/index.d.ts +10 -0
- package/dist/formats/color-space/index.d.ts.map +1 -0
- package/dist/formats/color-space/index.js +14 -0
- package/dist/formats/color-space/index.js.map +1 -0
- package/dist/formats/color-space/maps.d.ts +70 -0
- package/dist/formats/color-space/maps.d.ts.map +1 -0
- package/dist/formats/color-space/maps.js +70 -0
- package/dist/formats/color-space/maps.js.map +1 -0
- package/dist/formats/color-space/types.d.ts +68 -0
- package/dist/formats/color-space/types.d.ts.map +1 -0
- package/dist/formats/color-space/types.js +49 -0
- package/dist/formats/color-space/types.js.map +1 -0
- package/dist/formats/color-space.d.ts +4 -124
- package/dist/formats/color-space.d.ts.map +1 -1
- package/dist/formats/color-space.js +5 -108
- package/dist/formats/color-space.js.map +1 -1
- package/dist/formats/conversions/frame-converter.d.ts +8 -3
- package/dist/formats/conversions/frame-converter.d.ts.map +1 -1
- package/dist/formats/conversions/frame-converter.js +16 -12
- package/dist/formats/conversions/frame-converter.js.map +1 -1
- package/dist/formats/pixel-format/helpers.d.ts +49 -0
- package/dist/formats/pixel-format/helpers.d.ts.map +1 -0
- package/dist/formats/pixel-format/helpers.js +117 -0
- package/dist/formats/pixel-format/helpers.js.map +1 -0
- package/dist/formats/pixel-format/index.d.ts +9 -0
- package/dist/formats/pixel-format/index.d.ts.map +1 -0
- package/dist/formats/pixel-format/index.js +10 -0
- package/dist/formats/pixel-format/index.js.map +1 -0
- package/dist/formats/pixel-format/sizes.d.ts +17 -0
- package/dist/formats/pixel-format/sizes.d.ts.map +1 -0
- package/dist/formats/pixel-format/sizes.js +159 -0
- package/dist/formats/pixel-format/sizes.js.map +1 -0
- package/dist/formats/pixel-format/types.d.ts +13 -0
- package/dist/formats/pixel-format/types.d.ts.map +1 -0
- package/dist/formats/pixel-format/types.js +5 -0
- package/dist/formats/pixel-format/types.js.map +1 -0
- package/dist/formats/pixel-formats.d.ts +4 -53
- package/dist/formats/pixel-formats.d.ts.map +1 -1
- package/dist/formats/pixel-formats.js +5 -179
- package/dist/formats/pixel-formats.js.map +1 -1
- package/dist/hardware/types.d.ts.map +1 -1
- package/dist/hardware/types.js +8 -2
- package/dist/hardware/types.js.map +1 -1
- package/dist/transfer/detach.d.ts +42 -0
- package/dist/transfer/detach.d.ts.map +1 -0
- package/dist/transfer/detach.js +93 -0
- package/dist/transfer/detach.js.map +1 -0
- package/dist/transfer/index.d.ts +9 -0
- package/dist/transfer/index.d.ts.map +1 -0
- package/dist/transfer/index.js +11 -0
- package/dist/transfer/index.js.map +1 -0
- package/dist/transfer/validate.d.ts +45 -0
- package/dist/transfer/validate.d.ts.map +1 -0
- package/dist/transfer/validate.js +98 -0
- package/dist/transfer/validate.js.map +1 -0
- package/dist/types/video.d.ts +16 -0
- package/dist/types/video.d.ts.map +1 -1
- package/dist/utils/codec-validation.d.ts +3 -28
- package/dist/utils/codec-validation.d.ts.map +1 -1
- package/dist/utils/codec-validation.js +4 -248
- package/dist/utils/codec-validation.js.map +1 -1
- package/docs/api.md +4 -2
- package/docs/architecture-refactor-plan.md +149 -0
- package/docs/architecture.md +258 -0
- package/package.json +6 -4
- package/dist/config/ffmpeg-quality.d.ts +0 -23
- package/dist/config/ffmpeg-quality.d.ts.map +0 -1
- package/dist/config/ffmpeg-quality.js +0 -15
- package/dist/config/ffmpeg-quality.js.map +0 -1
- package/dist/containers/FFmpegSpawnMuxer.d.ts +0 -42
- package/dist/containers/FFmpegSpawnMuxer.d.ts.map +0 -1
- package/dist/containers/FFmpegSpawnMuxer.js +0 -311
- package/dist/containers/FFmpegSpawnMuxer.js.map +0 -1
- package/dist/containers/FallbackMuxer.d.ts +0 -42
- package/dist/containers/FallbackMuxer.d.ts.map +0 -1
- package/dist/containers/FallbackMuxer.js +0 -311
- package/dist/containers/FallbackMuxer.js.map +0 -1
- package/dist/containers/MuxerWithFallback.d.ts +0 -110
- package/dist/containers/MuxerWithFallback.d.ts.map +0 -1
- package/dist/containers/MuxerWithFallback.js +0 -239
- package/dist/containers/MuxerWithFallback.js.map +0 -1
- package/dist/demos/demo-audio-visualizer-mediabunny.d.ts +0 -10
- package/dist/demos/demo-audio-visualizer-mediabunny.d.ts.map +0 -1
- package/dist/demos/demo-audio-visualizer-mediabunny.js +0 -357
- package/dist/demos/demo-audio-visualizer-mediabunny.js.map +0 -1
- package/dist/demos/demo-audio-visualizer-nodeav.d.ts +0 -10
- package/dist/demos/demo-audio-visualizer-nodeav.d.ts.map +0 -1
- package/dist/demos/demo-audio-visualizer-nodeav.js +0 -318
- package/dist/demos/demo-audio-visualizer-nodeav.js.map +0 -1
- package/dist/demos/demo-muxer-fallback.d.ts +0 -8
- package/dist/demos/demo-muxer-fallback.d.ts.map +0 -1
- package/dist/demos/demo-muxer-fallback.js +0 -165
- package/dist/demos/demo-muxer-fallback.js.map +0 -1
- package/dist/polyfills/CanvasRenderingContext2DPolyfill.d.ts +0 -72
- package/dist/polyfills/CanvasRenderingContext2DPolyfill.d.ts.map +0 -1
- package/dist/polyfills/CanvasRenderingContext2DPolyfill.js +0 -293
- package/dist/polyfills/CanvasRenderingContext2DPolyfill.js.map +0 -1
- package/dist/polyfills/ImageDataPolyfill.d.ts +0 -12
- package/dist/polyfills/ImageDataPolyfill.d.ts.map +0 -1
- package/dist/polyfills/ImageDataPolyfill.js +0 -22
- package/dist/polyfills/ImageDataPolyfill.js.map +0 -1
- package/dist/polyfills/OffscreenCanvasPolyfill.d.ts +0 -16
- package/dist/polyfills/OffscreenCanvasPolyfill.d.ts.map +0 -1
- package/dist/polyfills/OffscreenCanvasPolyfill.js +0 -46
- package/dist/polyfills/OffscreenCanvasPolyfill.js.map +0 -1
- package/dist/polyfills/VideoFramePolyfill.d.ts +0 -44
- package/dist/polyfills/VideoFramePolyfill.d.ts.map +0 -1
- package/dist/polyfills/VideoFramePolyfill.js +0 -98
- package/dist/polyfills/VideoFramePolyfill.js.map +0 -1
|
@@ -1,311 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Fallback Muxer - FFmpeg subprocess-based muxer
|
|
3
|
-
*
|
|
4
|
-
* This muxer accumulates encoded chunks in memory and uses FFmpeg
|
|
5
|
-
* to mux them when close() is called. It serves as a fallback when
|
|
6
|
-
* the node-av muxer fails.
|
|
7
|
-
*/
|
|
8
|
-
import * as fs from 'fs';
|
|
9
|
-
import * as path from 'path';
|
|
10
|
-
import * as os from 'os';
|
|
11
|
-
import { spawn } from 'child_process';
|
|
12
|
-
import { randomBytes } from 'crypto';
|
|
13
|
-
import { MuxerError } from './muxer-types.js';
|
|
14
|
-
/**
|
|
15
|
-
* Convert AVCC format (length-prefixed NALUs) to Annex B (start code prefixed)
|
|
16
|
-
* This is needed because FFmpeg expects Annex B format for raw H.264 input
|
|
17
|
-
*/
|
|
18
|
-
function avccToAnnexB(avccData, nalLengthSize = 4) {
|
|
19
|
-
const START_CODE = new Uint8Array([0, 0, 0, 1]);
|
|
20
|
-
const chunks = [];
|
|
21
|
-
let offset = 0;
|
|
22
|
-
while (offset < avccData.length) {
|
|
23
|
-
// Read NAL unit length
|
|
24
|
-
let nalLength = 0;
|
|
25
|
-
for (let i = 0; i < nalLengthSize; i++) {
|
|
26
|
-
nalLength = (nalLength << 8) | avccData[offset + i];
|
|
27
|
-
}
|
|
28
|
-
offset += nalLengthSize;
|
|
29
|
-
if (nalLength <= 0 || offset + nalLength > avccData.length) {
|
|
30
|
-
break;
|
|
31
|
-
}
|
|
32
|
-
// Add start code + NAL unit
|
|
33
|
-
chunks.push(START_CODE);
|
|
34
|
-
chunks.push(avccData.slice(offset, offset + nalLength));
|
|
35
|
-
offset += nalLength;
|
|
36
|
-
}
|
|
37
|
-
// Concatenate all chunks
|
|
38
|
-
const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);
|
|
39
|
-
const result = new Uint8Array(totalLength);
|
|
40
|
-
let writeOffset = 0;
|
|
41
|
-
for (const chunk of chunks) {
|
|
42
|
-
result.set(chunk, writeOffset);
|
|
43
|
-
writeOffset += chunk.length;
|
|
44
|
-
}
|
|
45
|
-
return result;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Parse AVCC extradata (SPS/PPS) to Annex B format
|
|
49
|
-
*/
|
|
50
|
-
function parseAvccExtradata(extradata) {
|
|
51
|
-
const START_CODE = new Uint8Array([0, 0, 0, 1]);
|
|
52
|
-
const chunks = [];
|
|
53
|
-
// AVCC format:
|
|
54
|
-
// configurationVersion (1 byte) = 1
|
|
55
|
-
// AVCProfileIndication (1 byte)
|
|
56
|
-
// profile_compatibility (1 byte)
|
|
57
|
-
// AVCLevelIndication (1 byte)
|
|
58
|
-
// lengthSizeMinusOne (6 bits reserved + 2 bits) -> NAL length size = (value & 0x03) + 1
|
|
59
|
-
// numOfSequenceParameterSets (3 bits reserved + 5 bits)
|
|
60
|
-
// SPS entries...
|
|
61
|
-
// numOfPictureParameterSets (1 byte)
|
|
62
|
-
// PPS entries...
|
|
63
|
-
if (extradata.length < 7 || extradata[0] !== 1) {
|
|
64
|
-
// Not valid AVCC, return as-is (might already be Annex B)
|
|
65
|
-
return { annexBHeader: extradata, nalLengthSize: 4 };
|
|
66
|
-
}
|
|
67
|
-
const nalLengthSize = (extradata[4] & 0x03) + 1;
|
|
68
|
-
let offset = 5;
|
|
69
|
-
// Parse SPS
|
|
70
|
-
const numSPS = extradata[offset] & 0x1f;
|
|
71
|
-
offset++;
|
|
72
|
-
for (let i = 0; i < numSPS; i++) {
|
|
73
|
-
const spsLength = (extradata[offset] << 8) | extradata[offset + 1];
|
|
74
|
-
offset += 2;
|
|
75
|
-
chunks.push(START_CODE);
|
|
76
|
-
chunks.push(extradata.slice(offset, offset + spsLength));
|
|
77
|
-
offset += spsLength;
|
|
78
|
-
}
|
|
79
|
-
// Parse PPS
|
|
80
|
-
const numPPS = extradata[offset];
|
|
81
|
-
offset++;
|
|
82
|
-
for (let i = 0; i < numPPS; i++) {
|
|
83
|
-
const ppsLength = (extradata[offset] << 8) | extradata[offset + 1];
|
|
84
|
-
offset += 2;
|
|
85
|
-
chunks.push(START_CODE);
|
|
86
|
-
chunks.push(extradata.slice(offset, offset + ppsLength));
|
|
87
|
-
offset += ppsLength;
|
|
88
|
-
}
|
|
89
|
-
// Concatenate
|
|
90
|
-
const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);
|
|
91
|
-
const annexBHeader = new Uint8Array(totalLength);
|
|
92
|
-
let writeOffset = 0;
|
|
93
|
-
for (const chunk of chunks) {
|
|
94
|
-
annexBHeader.set(chunk, writeOffset);
|
|
95
|
-
writeOffset += chunk.length;
|
|
96
|
-
}
|
|
97
|
-
return { annexBHeader, nalLengthSize };
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Add ADTS header to raw AAC frame
|
|
101
|
-
*/
|
|
102
|
-
function addAdtsHeader(aacFrame, sampleRate, channels) {
|
|
103
|
-
const sampleRateIndex = [
|
|
104
|
-
96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025,
|
|
105
|
-
8000, 7350,
|
|
106
|
-
].indexOf(sampleRate);
|
|
107
|
-
if (sampleRateIndex === -1) {
|
|
108
|
-
// Unsupported sample rate, return raw frame
|
|
109
|
-
return aacFrame;
|
|
110
|
-
}
|
|
111
|
-
const frameLength = aacFrame.length + 7; // ADTS header is 7 bytes
|
|
112
|
-
const header = new Uint8Array(7);
|
|
113
|
-
// Syncword (12 bits) = 0xFFF
|
|
114
|
-
header[0] = 0xff;
|
|
115
|
-
header[1] = 0xf1; // MPEG-4, Layer 0, no CRC
|
|
116
|
-
// Profile (2 bits) = AAC-LC (1), shifted left 6
|
|
117
|
-
// Sample rate index (4 bits), shifted left 2
|
|
118
|
-
// Private bit (1 bit) = 0
|
|
119
|
-
// Channel config (3 bits, upper 1 bit)
|
|
120
|
-
header[2] = ((1 << 6) | (sampleRateIndex << 2) | (channels >> 2)) & 0xff;
|
|
121
|
-
// Channel config (lower 2 bits), shifted left 6
|
|
122
|
-
// Original/copy (1 bit) = 0
|
|
123
|
-
// Home (1 bit) = 0
|
|
124
|
-
// Copyright ID (1 bit) = 0
|
|
125
|
-
// Copyright start (1 bit) = 0
|
|
126
|
-
// Frame length (13 bits, upper 2 bits)
|
|
127
|
-
header[3] = (((channels & 0x03) << 6) | (frameLength >> 11)) & 0xff;
|
|
128
|
-
// Frame length (middle 8 bits)
|
|
129
|
-
header[4] = (frameLength >> 3) & 0xff;
|
|
130
|
-
// Frame length (lower 3 bits), shifted left 5
|
|
131
|
-
// Buffer fullness (11 bits, upper 5 bits) = 0x7FF (VBR)
|
|
132
|
-
header[5] = (((frameLength & 0x07) << 5) | 0x1f) & 0xff;
|
|
133
|
-
// Buffer fullness (lower 6 bits), shifted left 2
|
|
134
|
-
// Number of AAC frames - 1 (2 bits) = 0
|
|
135
|
-
header[6] = 0xfc;
|
|
136
|
-
// Combine header and frame
|
|
137
|
-
const result = new Uint8Array(frameLength);
|
|
138
|
-
result.set(header);
|
|
139
|
-
result.set(aacFrame, 7);
|
|
140
|
-
return result;
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Fallback muxer that uses FFmpeg subprocess for muxing
|
|
144
|
-
*
|
|
145
|
-
* This is a fallback muxer that accumulates chunks and uses FFmpeg
|
|
146
|
-
* to create the final output file. It's more battle-tested but slower
|
|
147
|
-
* (~130ms due to process spawn) than the native node-av muxer (~5ms).
|
|
148
|
-
*/
|
|
149
|
-
export class FallbackMuxer {
|
|
150
|
-
config;
|
|
151
|
-
videoConfig = null;
|
|
152
|
-
audioConfig = null;
|
|
153
|
-
videoChunks = [];
|
|
154
|
-
audioChunks = [];
|
|
155
|
-
_videoChunkCount = 0;
|
|
156
|
-
_audioChunkCount = 0;
|
|
157
|
-
isOpen = false;
|
|
158
|
-
tempDir = null;
|
|
159
|
-
constructor(config) {
|
|
160
|
-
this.config = config;
|
|
161
|
-
}
|
|
162
|
-
async open(timeout) {
|
|
163
|
-
// Create temp directory for intermediate files
|
|
164
|
-
this.tempDir = path.join(os.tmpdir(), `ffmpeg-mux-${randomBytes(8).toString('hex')}`);
|
|
165
|
-
fs.mkdirSync(this.tempDir, { recursive: true });
|
|
166
|
-
this.isOpen = true;
|
|
167
|
-
}
|
|
168
|
-
async addVideoTrack(config) {
|
|
169
|
-
if (!this.isOpen) {
|
|
170
|
-
throw new MuxerError('Muxer not opened', 'ffmpeg-spawn', 'addTrack');
|
|
171
|
-
}
|
|
172
|
-
this.videoConfig = config;
|
|
173
|
-
return 0;
|
|
174
|
-
}
|
|
175
|
-
async addAudioTrack(config) {
|
|
176
|
-
if (!this.isOpen) {
|
|
177
|
-
throw new MuxerError('Muxer not opened', 'ffmpeg-spawn', 'addTrack');
|
|
178
|
-
}
|
|
179
|
-
this.audioConfig = config;
|
|
180
|
-
return this.videoConfig ? 1 : 0;
|
|
181
|
-
}
|
|
182
|
-
async writeVideoChunk(chunk) {
|
|
183
|
-
if (!this.isOpen || !this.videoConfig) {
|
|
184
|
-
throw new MuxerError('Video track not configured', 'ffmpeg-spawn', 'write');
|
|
185
|
-
}
|
|
186
|
-
this.videoChunks.push(chunk);
|
|
187
|
-
this._videoChunkCount++;
|
|
188
|
-
}
|
|
189
|
-
async writeAudioChunk(chunk) {
|
|
190
|
-
if (!this.isOpen || !this.audioConfig) {
|
|
191
|
-
throw new MuxerError('Audio track not configured', 'ffmpeg-spawn', 'write');
|
|
192
|
-
}
|
|
193
|
-
this.audioChunks.push(chunk);
|
|
194
|
-
this._audioChunkCount++;
|
|
195
|
-
}
|
|
196
|
-
async close(timeout) {
|
|
197
|
-
if (!this.isOpen || !this.tempDir) {
|
|
198
|
-
return;
|
|
199
|
-
}
|
|
200
|
-
try {
|
|
201
|
-
await this.muxWithFFmpeg();
|
|
202
|
-
}
|
|
203
|
-
finally {
|
|
204
|
-
// Clean up temp directory
|
|
205
|
-
if (this.tempDir && fs.existsSync(this.tempDir)) {
|
|
206
|
-
fs.rmSync(this.tempDir, { recursive: true, force: true });
|
|
207
|
-
}
|
|
208
|
-
this.isOpen = false;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
async muxWithFFmpeg() {
|
|
212
|
-
if (!this.tempDir)
|
|
213
|
-
return;
|
|
214
|
-
const ffmpegArgs = ['-y'];
|
|
215
|
-
const inputFiles = [];
|
|
216
|
-
// Write video to temp file
|
|
217
|
-
if (this.videoConfig && this.videoChunks.length > 0) {
|
|
218
|
-
const videoPath = path.join(this.tempDir, 'video.h264');
|
|
219
|
-
await this.writeVideoToFile(videoPath);
|
|
220
|
-
inputFiles.push(videoPath);
|
|
221
|
-
const framerate = this.videoConfig.framerate || 30;
|
|
222
|
-
ffmpegArgs.push('-f', 'h264', '-r', String(framerate), '-i', videoPath);
|
|
223
|
-
}
|
|
224
|
-
// Write audio to temp file
|
|
225
|
-
if (this.audioConfig && this.audioChunks.length > 0) {
|
|
226
|
-
const audioPath = path.join(this.tempDir, 'audio.aac');
|
|
227
|
-
await this.writeAudioToFile(audioPath);
|
|
228
|
-
inputFiles.push(audioPath);
|
|
229
|
-
ffmpegArgs.push('-f', 'aac', '-i', audioPath);
|
|
230
|
-
}
|
|
231
|
-
if (inputFiles.length === 0) {
|
|
232
|
-
throw new MuxerError('No tracks to mux', 'ffmpeg-spawn', 'close');
|
|
233
|
-
}
|
|
234
|
-
// Output options
|
|
235
|
-
ffmpegArgs.push('-c:v', 'copy', '-c:a', 'copy', '-movflags', '+faststart', this.config.path);
|
|
236
|
-
// Spawn FFmpeg
|
|
237
|
-
await this.spawnFFmpeg(ffmpegArgs);
|
|
238
|
-
}
|
|
239
|
-
async writeVideoToFile(filePath) {
|
|
240
|
-
if (!this.videoConfig)
|
|
241
|
-
return;
|
|
242
|
-
const chunks = [];
|
|
243
|
-
// Parse extradata to get NAL length size and write SPS/PPS header
|
|
244
|
-
let nalLengthSize = 4;
|
|
245
|
-
if (this.videoConfig.description) {
|
|
246
|
-
const { annexBHeader, nalLengthSize: nls } = parseAvccExtradata(this.videoConfig.description);
|
|
247
|
-
nalLengthSize = nls;
|
|
248
|
-
chunks.push(annexBHeader);
|
|
249
|
-
}
|
|
250
|
-
// Convert each chunk from AVCC to Annex B
|
|
251
|
-
for (const chunk of this.videoChunks) {
|
|
252
|
-
const annexBData = avccToAnnexB(chunk._buffer, nalLengthSize);
|
|
253
|
-
chunks.push(annexBData);
|
|
254
|
-
}
|
|
255
|
-
// Write to file
|
|
256
|
-
const totalLength = chunks.reduce((sum, c) => sum + c.length, 0);
|
|
257
|
-
const buffer = Buffer.alloc(totalLength);
|
|
258
|
-
let offset = 0;
|
|
259
|
-
for (const chunk of chunks) {
|
|
260
|
-
Buffer.from(chunk).copy(buffer, offset);
|
|
261
|
-
offset += chunk.length;
|
|
262
|
-
}
|
|
263
|
-
fs.writeFileSync(filePath, buffer);
|
|
264
|
-
}
|
|
265
|
-
async writeAudioToFile(filePath) {
|
|
266
|
-
if (!this.audioConfig)
|
|
267
|
-
return;
|
|
268
|
-
const chunks = [];
|
|
269
|
-
// Add ADTS headers to each AAC frame
|
|
270
|
-
for (const chunk of this.audioChunks) {
|
|
271
|
-
const adtsFrame = addAdtsHeader(chunk._rawData, this.audioConfig.sampleRate, this.audioConfig.numberOfChannels);
|
|
272
|
-
chunks.push(adtsFrame);
|
|
273
|
-
}
|
|
274
|
-
// Write to file
|
|
275
|
-
const totalLength = chunks.reduce((sum, c) => sum + c.length, 0);
|
|
276
|
-
const buffer = Buffer.alloc(totalLength);
|
|
277
|
-
let offset = 0;
|
|
278
|
-
for (const chunk of chunks) {
|
|
279
|
-
Buffer.from(chunk).copy(buffer, offset);
|
|
280
|
-
offset += chunk.length;
|
|
281
|
-
}
|
|
282
|
-
fs.writeFileSync(filePath, buffer);
|
|
283
|
-
}
|
|
284
|
-
spawnFFmpeg(args) {
|
|
285
|
-
return new Promise((resolve, reject) => {
|
|
286
|
-
const ffmpeg = spawn('ffmpeg', args);
|
|
287
|
-
let stderr = '';
|
|
288
|
-
ffmpeg.stderr.on('data', (data) => {
|
|
289
|
-
stderr += data.toString();
|
|
290
|
-
});
|
|
291
|
-
ffmpeg.on('error', (err) => {
|
|
292
|
-
reject(new MuxerError(`FFmpeg spawn error: ${err.message}`, 'ffmpeg-spawn', 'close', err));
|
|
293
|
-
});
|
|
294
|
-
ffmpeg.on('close', (code) => {
|
|
295
|
-
if (code === 0) {
|
|
296
|
-
resolve();
|
|
297
|
-
}
|
|
298
|
-
else {
|
|
299
|
-
reject(new MuxerError(`FFmpeg exited with code ${code}: ${stderr.slice(-500)}`, 'ffmpeg-spawn', 'close'));
|
|
300
|
-
}
|
|
301
|
-
});
|
|
302
|
-
});
|
|
303
|
-
}
|
|
304
|
-
get videoChunkCount() {
|
|
305
|
-
return this._videoChunkCount;
|
|
306
|
-
}
|
|
307
|
-
get audioChunkCount() {
|
|
308
|
-
return this._audioChunkCount;
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
//# sourceMappingURL=FallbackMuxer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FallbackMuxer.js","sourceRoot":"","sources":["../../src/containers/FallbackMuxer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Muxer with Fallback - Primary node-av muxer with FFmpeg spawn fallback
|
|
3
|
-
*
|
|
4
|
-
* This muxer attempts to use the fast node-av muxer first, and automatically
|
|
5
|
-
* falls back to FFmpeg spawn if it fails. This provides the best of both worlds:
|
|
6
|
-
* fast muxing when possible, with reliable fallback for edge cases.
|
|
7
|
-
*/
|
|
8
|
-
import type { EncodedVideoChunk } from '../core/EncodedVideoChunk.js';
|
|
9
|
-
import type { EncodedAudioChunk } from '../core/EncodedAudioChunk.js';
|
|
10
|
-
import type { IMuxer, MuxerConfig, VideoTrackConfig, AudioTrackConfig, MuxResult } from './muxer-types.js';
|
|
11
|
-
/**
|
|
12
|
-
* Options for MuxerWithFallback
|
|
13
|
-
*/
|
|
14
|
-
export interface MuxerWithFallbackOptions extends MuxerConfig {
|
|
15
|
-
/**
|
|
16
|
-
* Callback when fallback is triggered
|
|
17
|
-
* Useful for logging or metrics
|
|
18
|
-
*/
|
|
19
|
-
onFallback?: (error: Error) => void;
|
|
20
|
-
/**
|
|
21
|
-
* Force using a specific backend (skip fallback logic)
|
|
22
|
-
*/
|
|
23
|
-
forceBackend?: 'node-av' | 'ffmpeg-spawn';
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Muxer that tries node-av first, then falls back to FFmpeg spawn
|
|
27
|
-
*
|
|
28
|
-
* This implementation buffers all chunks and only performs the actual
|
|
29
|
-
* muxing when close() is called. This allows seamless fallback if the
|
|
30
|
-
* primary muxer fails at any point.
|
|
31
|
-
*
|
|
32
|
-
* @example
|
|
33
|
-
* ```typescript
|
|
34
|
-
* const muxer = new MuxerWithFallback({
|
|
35
|
-
* path: 'output.mp4',
|
|
36
|
-
* onFallback: (err) => console.warn('Using FFmpeg fallback:', err.message),
|
|
37
|
-
* });
|
|
38
|
-
*
|
|
39
|
-
* await muxer.open();
|
|
40
|
-
* await muxer.addVideoTrack({ codec: 'avc1.64001E', ... });
|
|
41
|
-
* await muxer.addAudioTrack({ codec: 'mp4a.40.2', ... });
|
|
42
|
-
*
|
|
43
|
-
* for (const chunk of videoChunks) await muxer.writeVideoChunk(chunk);
|
|
44
|
-
* for (const chunk of audioChunks) await muxer.writeAudioChunk(chunk);
|
|
45
|
-
*
|
|
46
|
-
* const result = await muxer.closeWithResult();
|
|
47
|
-
* console.log(`Muxed with ${result.backend} in ${result.durationMs}ms`);
|
|
48
|
-
* ```
|
|
49
|
-
*/
|
|
50
|
-
export declare class MuxerWithFallback implements IMuxer {
|
|
51
|
-
private config;
|
|
52
|
-
private videoConfig;
|
|
53
|
-
private audioConfig;
|
|
54
|
-
private videoChunks;
|
|
55
|
-
private audioChunks;
|
|
56
|
-
private _videoChunkCount;
|
|
57
|
-
private _audioChunkCount;
|
|
58
|
-
private isOpen;
|
|
59
|
-
private usedBackend;
|
|
60
|
-
constructor(config: MuxerWithFallbackOptions);
|
|
61
|
-
open(timeout?: number): Promise<void>;
|
|
62
|
-
addVideoTrack(config: VideoTrackConfig): Promise<number>;
|
|
63
|
-
addAudioTrack(config: AudioTrackConfig): Promise<number>;
|
|
64
|
-
writeVideoChunk(chunk: EncodedVideoChunk): Promise<void>;
|
|
65
|
-
writeAudioChunk(chunk: EncodedAudioChunk): Promise<void>;
|
|
66
|
-
/**
|
|
67
|
-
* Close the muxer and finalize the output file
|
|
68
|
-
*/
|
|
69
|
-
close(timeout?: number): Promise<void>;
|
|
70
|
-
/**
|
|
71
|
-
* Close the muxer and return detailed result including which backend was used
|
|
72
|
-
*/
|
|
73
|
-
closeWithResult(timeout?: number): Promise<MuxResult>;
|
|
74
|
-
private muxWithNodeAv;
|
|
75
|
-
private muxWithFFmpeg;
|
|
76
|
-
get videoChunkCount(): number;
|
|
77
|
-
get audioChunkCount(): number;
|
|
78
|
-
/**
|
|
79
|
-
* Get which backend was used for muxing (available after close)
|
|
80
|
-
*/
|
|
81
|
-
get backend(): 'node-av' | 'ffmpeg-spawn' | null;
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Convenience function to mux video and audio chunks to a file
|
|
85
|
-
*
|
|
86
|
-
* @example
|
|
87
|
-
* ```typescript
|
|
88
|
-
* const result = await muxChunks({
|
|
89
|
-
* path: 'output.mp4',
|
|
90
|
-
* video: { config: videoTrackConfig, chunks: videoChunks },
|
|
91
|
-
* audio: { config: audioTrackConfig, chunks: audioChunks },
|
|
92
|
-
* });
|
|
93
|
-
* console.log(`Created ${result.path} using ${result.backend}`);
|
|
94
|
-
* ```
|
|
95
|
-
*/
|
|
96
|
-
export declare function muxChunks(options: {
|
|
97
|
-
path: string;
|
|
98
|
-
format?: string;
|
|
99
|
-
video?: {
|
|
100
|
-
config: VideoTrackConfig;
|
|
101
|
-
chunks: EncodedVideoChunk[];
|
|
102
|
-
};
|
|
103
|
-
audio?: {
|
|
104
|
-
config: AudioTrackConfig;
|
|
105
|
-
chunks: EncodedAudioChunk[];
|
|
106
|
-
};
|
|
107
|
-
onFallback?: (error: Error) => void;
|
|
108
|
-
forceBackend?: 'node-av' | 'ffmpeg-spawn';
|
|
109
|
-
}): Promise<MuxResult>;
|
|
110
|
-
//# sourceMappingURL=MuxerWithFallback.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MuxerWithFallback.d.ts","sourceRoot":"","sources":["../../src/containers/MuxerWithFallback.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,KAAK,EACV,MAAM,EACN,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACV,MAAM,kBAAkB,CAAC;AAK1B;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,WAAW;IAC3D;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAEpC;;OAEG;IACH,YAAY,CAAC,EAAE,SAAS,GAAG,cAAc,CAAC;CAC3C;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,iBAAkB,YAAW,MAAM;IAC9C,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAA2C;gBAElD,MAAM,EAAE,wBAAwB;IAItC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrC,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAQxD,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAQxD,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxD,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9D;;OAEG;IACG,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C;;OAEG;IACG,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;YAiD7C,aAAa;YAoCb,aAAa;IA0B3B,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,SAAS,GAAG,cAAc,GAAG,IAAI,CAE/C;CACF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE;QACN,MAAM,EAAE,gBAAgB,CAAC;QACzB,MAAM,EAAE,iBAAiB,EAAE,CAAC;KAC7B,CAAC;IACF,KAAK,CAAC,EAAE;QACN,MAAM,EAAE,gBAAgB,CAAC;QACzB,MAAM,EAAE,iBAAiB,EAAE,CAAC;KAC7B,CAAC;IACF,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACpC,YAAY,CAAC,EAAE,SAAS,GAAG,cAAc,CAAC;CAC3C,GAAG,OAAO,CAAC,SAAS,CAAC,CAyBrB"}
|
|
@@ -1,239 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Muxer with Fallback - Primary node-av muxer with FFmpeg spawn fallback
|
|
3
|
-
*
|
|
4
|
-
* This muxer attempts to use the fast node-av muxer first, and automatically
|
|
5
|
-
* falls back to FFmpeg spawn if it fails. This provides the best of both worlds:
|
|
6
|
-
* fast muxing when possible, with reliable fallback for edge cases.
|
|
7
|
-
*/
|
|
8
|
-
import { MuxerError } from './muxer-types.js';
|
|
9
|
-
import { Muxer as NodeAvMuxer } from './Muxer.js';
|
|
10
|
-
import { FFmpegSpawnMuxer } from './FFmpegSpawnMuxer.js';
|
|
11
|
-
/**
|
|
12
|
-
* Muxer that tries node-av first, then falls back to FFmpeg spawn
|
|
13
|
-
*
|
|
14
|
-
* This implementation buffers all chunks and only performs the actual
|
|
15
|
-
* muxing when close() is called. This allows seamless fallback if the
|
|
16
|
-
* primary muxer fails at any point.
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* ```typescript
|
|
20
|
-
* const muxer = new MuxerWithFallback({
|
|
21
|
-
* path: 'output.mp4',
|
|
22
|
-
* onFallback: (err) => console.warn('Using FFmpeg fallback:', err.message),
|
|
23
|
-
* });
|
|
24
|
-
*
|
|
25
|
-
* await muxer.open();
|
|
26
|
-
* await muxer.addVideoTrack({ codec: 'avc1.64001E', ... });
|
|
27
|
-
* await muxer.addAudioTrack({ codec: 'mp4a.40.2', ... });
|
|
28
|
-
*
|
|
29
|
-
* for (const chunk of videoChunks) await muxer.writeVideoChunk(chunk);
|
|
30
|
-
* for (const chunk of audioChunks) await muxer.writeAudioChunk(chunk);
|
|
31
|
-
*
|
|
32
|
-
* const result = await muxer.closeWithResult();
|
|
33
|
-
* console.log(`Muxed with ${result.backend} in ${result.durationMs}ms`);
|
|
34
|
-
* ```
|
|
35
|
-
*/
|
|
36
|
-
export class MuxerWithFallback {
|
|
37
|
-
config;
|
|
38
|
-
videoConfig = null;
|
|
39
|
-
audioConfig = null;
|
|
40
|
-
videoChunks = [];
|
|
41
|
-
audioChunks = [];
|
|
42
|
-
_videoChunkCount = 0;
|
|
43
|
-
_audioChunkCount = 0;
|
|
44
|
-
isOpen = false;
|
|
45
|
-
usedBackend = null;
|
|
46
|
-
constructor(config) {
|
|
47
|
-
this.config = config;
|
|
48
|
-
}
|
|
49
|
-
async open(timeout) {
|
|
50
|
-
this.isOpen = true;
|
|
51
|
-
// We don't actually open anything yet - we buffer chunks
|
|
52
|
-
// and open the muxer during close()
|
|
53
|
-
}
|
|
54
|
-
async addVideoTrack(config) {
|
|
55
|
-
if (!this.isOpen) {
|
|
56
|
-
throw new MuxerError('Muxer not opened', 'node-av', 'addTrack');
|
|
57
|
-
}
|
|
58
|
-
this.videoConfig = config;
|
|
59
|
-
return 0;
|
|
60
|
-
}
|
|
61
|
-
async addAudioTrack(config) {
|
|
62
|
-
if (!this.isOpen) {
|
|
63
|
-
throw new MuxerError('Muxer not opened', 'node-av', 'addTrack');
|
|
64
|
-
}
|
|
65
|
-
this.audioConfig = config;
|
|
66
|
-
return this.videoConfig ? 1 : 0;
|
|
67
|
-
}
|
|
68
|
-
async writeVideoChunk(chunk) {
|
|
69
|
-
if (!this.isOpen || !this.videoConfig) {
|
|
70
|
-
throw new MuxerError('Video track not configured', 'node-av', 'write');
|
|
71
|
-
}
|
|
72
|
-
this.videoChunks.push(chunk);
|
|
73
|
-
this._videoChunkCount++;
|
|
74
|
-
}
|
|
75
|
-
async writeAudioChunk(chunk) {
|
|
76
|
-
if (!this.isOpen || !this.audioConfig) {
|
|
77
|
-
throw new MuxerError('Audio track not configured', 'node-av', 'write');
|
|
78
|
-
}
|
|
79
|
-
this.audioChunks.push(chunk);
|
|
80
|
-
this._audioChunkCount++;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Close the muxer and finalize the output file
|
|
84
|
-
*/
|
|
85
|
-
async close(timeout) {
|
|
86
|
-
await this.closeWithResult(timeout);
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Close the muxer and return detailed result including which backend was used
|
|
90
|
-
*/
|
|
91
|
-
async closeWithResult(timeout) {
|
|
92
|
-
if (!this.isOpen) {
|
|
93
|
-
return {
|
|
94
|
-
path: this.config.path,
|
|
95
|
-
videoChunkCount: 0,
|
|
96
|
-
audioChunkCount: 0,
|
|
97
|
-
durationMs: 0,
|
|
98
|
-
backend: 'node-av',
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
const startTime = Date.now();
|
|
102
|
-
// If force backend is specified, use only that
|
|
103
|
-
if (this.config.forceBackend === 'ffmpeg-spawn') {
|
|
104
|
-
await this.muxWithFFmpeg();
|
|
105
|
-
this.usedBackend = 'ffmpeg-spawn';
|
|
106
|
-
}
|
|
107
|
-
else if (this.config.forceBackend === 'node-av') {
|
|
108
|
-
await this.muxWithNodeAv(timeout);
|
|
109
|
-
this.usedBackend = 'node-av';
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
// Try node-av first, fallback to FFmpeg
|
|
113
|
-
try {
|
|
114
|
-
await this.muxWithNodeAv(timeout);
|
|
115
|
-
this.usedBackend = 'node-av';
|
|
116
|
-
}
|
|
117
|
-
catch (error) {
|
|
118
|
-
// Notify about fallback
|
|
119
|
-
if (this.config.onFallback) {
|
|
120
|
-
this.config.onFallback(error);
|
|
121
|
-
}
|
|
122
|
-
// Fall back to FFmpeg
|
|
123
|
-
await this.muxWithFFmpeg();
|
|
124
|
-
this.usedBackend = 'ffmpeg-spawn';
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
this.isOpen = false;
|
|
128
|
-
const durationMs = Date.now() - startTime;
|
|
129
|
-
return {
|
|
130
|
-
path: this.config.path,
|
|
131
|
-
videoChunkCount: this._videoChunkCount,
|
|
132
|
-
audioChunkCount: this._audioChunkCount,
|
|
133
|
-
durationMs,
|
|
134
|
-
backend: this.usedBackend,
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
async muxWithNodeAv(timeout) {
|
|
138
|
-
const muxer = new NodeAvMuxer({
|
|
139
|
-
path: this.config.path,
|
|
140
|
-
format: this.config.format,
|
|
141
|
-
});
|
|
142
|
-
try {
|
|
143
|
-
await muxer.open(timeout);
|
|
144
|
-
if (this.videoConfig) {
|
|
145
|
-
await muxer.addVideoTrack(this.videoConfig);
|
|
146
|
-
}
|
|
147
|
-
if (this.audioConfig) {
|
|
148
|
-
await muxer.addAudioTrack(this.audioConfig);
|
|
149
|
-
}
|
|
150
|
-
// Write all buffered chunks
|
|
151
|
-
for (const chunk of this.videoChunks) {
|
|
152
|
-
await muxer.writeVideoChunk(chunk);
|
|
153
|
-
}
|
|
154
|
-
for (const chunk of this.audioChunks) {
|
|
155
|
-
await muxer.writeAudioChunk(chunk);
|
|
156
|
-
}
|
|
157
|
-
await muxer.close(timeout);
|
|
158
|
-
}
|
|
159
|
-
catch (error) {
|
|
160
|
-
// Try to clean up partial file
|
|
161
|
-
try {
|
|
162
|
-
await muxer.close(1000);
|
|
163
|
-
}
|
|
164
|
-
catch {
|
|
165
|
-
// Ignore cleanup errors
|
|
166
|
-
}
|
|
167
|
-
throw error;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
async muxWithFFmpeg() {
|
|
171
|
-
const muxer = new FFmpegSpawnMuxer({
|
|
172
|
-
path: this.config.path,
|
|
173
|
-
format: this.config.format,
|
|
174
|
-
});
|
|
175
|
-
await muxer.open();
|
|
176
|
-
if (this.videoConfig) {
|
|
177
|
-
await muxer.addVideoTrack(this.videoConfig);
|
|
178
|
-
}
|
|
179
|
-
if (this.audioConfig) {
|
|
180
|
-
await muxer.addAudioTrack(this.audioConfig);
|
|
181
|
-
}
|
|
182
|
-
// Write all buffered chunks
|
|
183
|
-
for (const chunk of this.videoChunks) {
|
|
184
|
-
await muxer.writeVideoChunk(chunk);
|
|
185
|
-
}
|
|
186
|
-
for (const chunk of this.audioChunks) {
|
|
187
|
-
await muxer.writeAudioChunk(chunk);
|
|
188
|
-
}
|
|
189
|
-
await muxer.close();
|
|
190
|
-
}
|
|
191
|
-
get videoChunkCount() {
|
|
192
|
-
return this._videoChunkCount;
|
|
193
|
-
}
|
|
194
|
-
get audioChunkCount() {
|
|
195
|
-
return this._audioChunkCount;
|
|
196
|
-
}
|
|
197
|
-
/**
|
|
198
|
-
* Get which backend was used for muxing (available after close)
|
|
199
|
-
*/
|
|
200
|
-
get backend() {
|
|
201
|
-
return this.usedBackend;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Convenience function to mux video and audio chunks to a file
|
|
206
|
-
*
|
|
207
|
-
* @example
|
|
208
|
-
* ```typescript
|
|
209
|
-
* const result = await muxChunks({
|
|
210
|
-
* path: 'output.mp4',
|
|
211
|
-
* video: { config: videoTrackConfig, chunks: videoChunks },
|
|
212
|
-
* audio: { config: audioTrackConfig, chunks: audioChunks },
|
|
213
|
-
* });
|
|
214
|
-
* console.log(`Created ${result.path} using ${result.backend}`);
|
|
215
|
-
* ```
|
|
216
|
-
*/
|
|
217
|
-
export async function muxChunks(options) {
|
|
218
|
-
const muxer = new MuxerWithFallback({
|
|
219
|
-
path: options.path,
|
|
220
|
-
format: options.format,
|
|
221
|
-
onFallback: options.onFallback,
|
|
222
|
-
forceBackend: options.forceBackend,
|
|
223
|
-
});
|
|
224
|
-
await muxer.open();
|
|
225
|
-
if (options.video) {
|
|
226
|
-
await muxer.addVideoTrack(options.video.config);
|
|
227
|
-
for (const chunk of options.video.chunks) {
|
|
228
|
-
await muxer.writeVideoChunk(chunk);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
if (options.audio) {
|
|
232
|
-
await muxer.addAudioTrack(options.audio.config);
|
|
233
|
-
for (const chunk of options.audio.chunks) {
|
|
234
|
-
await muxer.writeAudioChunk(chunk);
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
return muxer.closeWithResult();
|
|
238
|
-
}
|
|
239
|
-
//# sourceMappingURL=MuxerWithFallback.js.map
|