HTML5 音频捕捉 - 如何截断录制的音频
HTML5 Audio Capture - How to truncate recorded audio
我正在开发一项功能,用于从 microphone/headset 的 HTML5 应用程序中捕获音频。使用效果很好的 MediaStreamRecorder,我能够捕获所有音频。但是,在播放录制的音频期间,我注意到还捕获了用户单击尖叫声上的“停止录制”按钮所产生的鼠标点击。我想以某种方式摆脱它。一个想法是从录音中删除最后 0.5-1 秒,但我不完全确定如何实现这一点。也许还有其他一些更合适的方法...
专家对代码示例的任何建议都很棒。
我可以看到针对您的问题的三个解决方案:
- 很简单,将其发送到服务器,使用
ffmpeg
n 东西进行剪辑。缺点:服务器参与。
- 就像 dandavis 在评论中说的那样,使用 RecorderJS,仅在从数组形成最终的 wav 文件时,忽略最后几个条目。缺点:乏味,wav 文件可能很大(因为它是未压缩的)
- 在客户端进行编辑,将录制的视频通过管道传输到音频元素(将其静音),然后使用
mozCaptureStream
创建一个流并进行录制,然后使用设置超时在实际播放前 0.5 秒停止播放结束。缺点:就像您猜到的那样,目前仅适用于 firefox
MediaStreamRecorder.js 不为任何一端的 trim 录音提供灵活性,并为客户端应用程序生成随时可用的 WAV 编码字节流。因为字节流已经是WAV编码了,所以在那个时候应用trimming是非常困难的。然而,核心 MediaStreamEncoder 中的一个小变化可以以可配置的方式提供此功能,即客户端应用程序认为它合适。
trimFromFront 和 trimFromEnd 属性必须添加到 Recorder,然后可以在 WAV 编码发生之前使用。
收集样本的最终缓冲区在 Float32Array 中管理。我们知道采样率通常是 44100 bps。我们可以应用它从最终缓冲区中提取一个子数组,截断感兴趣的部分。
interleaved = interleaved.subarray(trimFromFront * sampleRate, interleaved.length - trimFrontEnd * sampleRate)
这也让我们可以灵活地截断几分之一秒。
因此,如果我想从前面截断 2 秒,从结尾截断 5 秒,我会这样做
trimFromFront = 2;
trimFromEnd = 5;
就是这样。最终的 WAV 编码字节流是干净的。
我正在开发一项功能,用于从 microphone/headset 的 HTML5 应用程序中捕获音频。使用效果很好的 MediaStreamRecorder,我能够捕获所有音频。但是,在播放录制的音频期间,我注意到还捕获了用户单击尖叫声上的“停止录制”按钮所产生的鼠标点击。我想以某种方式摆脱它。一个想法是从录音中删除最后 0.5-1 秒,但我不完全确定如何实现这一点。也许还有其他一些更合适的方法...
专家对代码示例的任何建议都很棒。
我可以看到针对您的问题的三个解决方案:
- 很简单,将其发送到服务器,使用
ffmpeg
n 东西进行剪辑。缺点:服务器参与。 - 就像 dandavis 在评论中说的那样,使用 RecorderJS,仅在从数组形成最终的 wav 文件时,忽略最后几个条目。缺点:乏味,wav 文件可能很大(因为它是未压缩的)
- 在客户端进行编辑,将录制的视频通过管道传输到音频元素(将其静音),然后使用
mozCaptureStream
创建一个流并进行录制,然后使用设置超时在实际播放前 0.5 秒停止播放结束。缺点:就像您猜到的那样,目前仅适用于 firefox
MediaStreamRecorder.js 不为任何一端的 trim 录音提供灵活性,并为客户端应用程序生成随时可用的 WAV 编码字节流。因为字节流已经是WAV编码了,所以在那个时候应用trimming是非常困难的。然而,核心 MediaStreamEncoder 中的一个小变化可以以可配置的方式提供此功能,即客户端应用程序认为它合适。
trimFromFront 和 trimFromEnd 属性必须添加到 Recorder,然后可以在 WAV 编码发生之前使用。
收集样本的最终缓冲区在 Float32Array 中管理。我们知道采样率通常是 44100 bps。我们可以应用它从最终缓冲区中提取一个子数组,截断感兴趣的部分。
interleaved = interleaved.subarray(trimFromFront * sampleRate, interleaved.length - trimFrontEnd * sampleRate)
这也让我们可以灵活地截断几分之一秒。
因此,如果我想从前面截断 2 秒,从结尾截断 5 秒,我会这样做
trimFromFront = 2;
trimFromEnd = 5;
就是这样。最终的 WAV 编码字节流是干净的。