UNPKG

@omnimedia/omnitool

Version:

open source video processing tools

43 lines 1.72 kB
import { AudioMix } from "./audio-mix.js"; import { ms } from "../../../../units/ms.js"; import { resampleToPlanar } from "./resamplers.js"; import { applyGainToPlanar } from "./audio-gain.js"; import { resolveAudioGain } from "../../../parts/audio.js"; import { createAudioSampler } from "../../parts/samplers/audio/sampler.js"; export function produceAudio({ timeline, resolveMedia }) { const mixer = new AudioMix(); const audio = streamAudio(timeline, resolveMedia); const stream = new TransformStream(); const writer = stream.writable.getWriter(); async function produce() { for await (const chunk of mixer.mix(audio)) { const data = new AudioData({ format: 'f32-planar', sampleRate: chunk.sampleRate, numberOfFrames: chunk.frames, numberOfChannels: chunk.channels, timestamp: Math.round((chunk.startFrame / chunk.sampleRate) * 1_000_000), data: new Float32Array(chunk.planar) }); await writer.write(data); } await writer.close(); } produce(); return stream.readable; } async function* streamAudio(timeline, resolveMedia) { const audioSampler = createAudioSampler(resolveMedia); const masterGain = resolveAudioGain(timeline.audio); for await (const { sample, timestamp, gain } of audioSampler.sampleAudio(timeline, ms(0))) { const { data } = resampleToPlanar(sample, 48000); applyGainToPlanar(data, gain * masterGain); yield { planes: data, sampleRate: 48000, timestamp }; sample.close(); } } //# sourceMappingURL=produce-audio.js.map