我使用WebGL类将动画画布( MediaRecorder
)和Web输出作为视频记录在一起。如果有些音频正在播放,一切都会像预期的那样工作,但如果没有,那么当停止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'});
...
}
如何在网络音频安静的情况下获得适当的录音?
在Windows 10上使用Chrome v92。
发布于 2021-08-03 17:06:02
我相信这是我一个月前开的https://crbug.com/1223382,但从那以后就没有什么吸引力了。
基本上,他们在处理沉默的痕迹方面仍然有很多困难。
为了解决这一问题,您可以通过将振荡器连接到增益设置为GainNode的0
,并将此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();
...
注意事项
Ps:您还可能希望在MediaRecorder.start(timeslice)
中传递一个(相对较小的)时间片段来解决此其他相关缺陷问题,如果由于任何原因,您的画布或音频流会被静音(例如,如果您停止在画布上绘制超过5s),则可能会发生这种情况。
https://stackoverflow.com/questions/68620750
复制相似问题