【问题标题】:Getting empty blob from MediaRecorder when Web Audio API is silentWeb Audio API 静默时从 MediaRecorder 获取空 blob
【发布时间】:2021-08-02 11:24:40
【问题描述】:

我正在使用MediaRecorder JS 类将动画画布 (WebGL) 和 Web 音频 API 输出一起录制为视频。如果某些音频正在播放,一切都会按预期工作,但如果没有,那么在停止 MediaRecorder 实例时我会得到空 blob。

以下是我的部分代码:

const chunks = [];
var recorder = null, captureStream = null;

function dataAvailable(event) {
    chunks.push(event.data);
}

function startCapture() {
    const streamDestination = audio.context.createMediaStreamDestination();
    masterGain.connect(streamDestination);
    captureStream = canvas.captureStream();

    // This line adds audio to the recording if audio is playing
    // but if audio isn't playing at the moment, I get empty chunks
    // at the end of recording
    captureStream.addTrack(streamDestination.stream.getAudioTracks()[0]);

    recorder = new MediaRecorder(captureStream);

    recorder.ondataavailable = dataAvailable;
    recorder.onstop = exportVideo;
    recorder.start();
}

function exportVideo() {
    // Here chunks will be empty if Web Audio API
    // didn't played anything during recording
    new Blob(chunks, {'type': 'video/webm'});
    ...
}

如何在 Web Audio 静音时获得正确的录音?

在 Windows 10 上使用 Chrome v92。

【问题讨论】:

    标签: javascript web-audio-api web-mediarecorder


    【解决方案1】:

    我相信这是我一个月前开设的https://crbug.com/1223382,但从那以后就没有太大的吸引力了。

    基本上,他们在处理静音轨道时仍然有很多麻烦。

    作为一种解决方法,您可以通过将振荡器连接到增益设置为 0 的 GainNode 并将此 GainNode 连接到您的目标流来强制您的轨道永不静音。

    const streamDestination = audio.context.createMediaStreamDestination();
    const osc = audio.context.createOscillator();
    const gainNode = audio.context.createGain();
    gainNode.gain.value = 0;
    osc.connect(gainNode);
    gainNode.connect(streamDestination);
    // then your current code
    masterGain.connect(streamDestination);
    captureStream = canvas.captureStream();
    ...
    

    A fiddle with this snippet,修复my repro case from the bug report

    注意事项

    • 这对树来说不是很好,但与 WebGL 动画和实时 MediaRecorder 相比,我想它可以被视为最低成本。
    • 这将生成带有音轨的媒体文件,静音但不静音。

    Ps:您可能还想在MediaRecorder.start(timeslice) 中传递一个(相对较小的)时间片来解决这个other related bug,如果由于某种原因您的画布或音频流之一会被静音(例如,如果你停止在画布上绘图超过 5 秒)。

    【讨论】:

    • 感谢您提供详细信息,我已经实施了解决方法,它对我有用。
    • 我有同样的问题,但没有视频。你将如何实现它?例如添加黑屏?谢谢
    猜你喜欢
    • 2014-01-27
    • 2019-06-28
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    相关资源
    最近更新 更多