javascript - MediaRecorder - 是否可以同时录制和播放?

标签 javascript webrtc html5-audio

我正在尝试构建一个简单的录音机,使用 WebRTC 和 MediaRecorder 同时(同步)录制和播放用户的声音。所以,这是我到目前为止所做的:

完整的 Html 代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Audio Recorder</title>
    <style>
        audio{
            display: block;
        }
    </style>
</head>
<body>
    <audio id="audio" controls autoplay></audio>
    <button type="button" onclick="mediaRecorder.start(1000)">Start</button>
    <button type="button" onclick="mediaRecorder.stop()">Stop</button>


    <script type="text/javascript">
        var mediaRecorder = null,
            chunks = [],
            audio = document.getElementById('audio');

        function onSuccess( stream ) {

            mediaRecorder = new MediaRecorder( stream );

            audio.srcObject  = stream ;


            mediaRecorder.ondataavailable = function( event ) {
                chunks.push( event.data );
            }
        }

        var onError = function(err) {
            console.log('Error: ' + err);
        }

        navigator.mediaDevices.getUserMedia({ audio: true }).then(onSuccess, onError);
    </script>
</body>
</html>

这段代码的问题在于,它播放了整个流,而我想要的只是录制的部分(由 MediaRecorder 录制的音频)。

问题:这是可能的还是唯一的选择是停止记录器然后获取记录的部分(代码中的“ block ”)?

Note: A yes/no answer would be more than enough for me. Thanks.

代码解释:

当您运行代码时,您的浏览器会询问您是否允许访问您的麦克风:

enter image description here

如果你点击允许,即使你没有点击开始按钮,你也会听到你的声音,这是因为音频元素的源设置为整个流。

enter image description here

enter image description here

我想要的是只听到录制的部分,在录制时(点击开始按钮),换句话说,将录制的部分转换为流

我在找什么:

enter image description here

最佳答案

只需从您的音频元素中删除autoplay,然后执行

mediaRecorder.start(1000);
audio.play();

mediaRecorder.stop();
audio.pause();

然后麦克风的音频将仅在录制期间可听到。

您不需要将录制的部分转换为流。如果这样做,只会引入延迟。

OTOH,如果您正在尝试回放您已经录制的内容,请参阅 my answer to another question .

关于javascript - MediaRecorder - 是否可以同时录制和播放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50188867/

相关文章:

javascript - 带有 REST API 身份验证的 WebRTC 的 TURN 服务器

javascript - HTML5 音频 currentTime 属性并不总是相同的

javascript - 在 Node 中限制 API AJAX 请求(速率受到限制) - 使用 AXIOS 进行 AJAX 调用...

safari - 无法在 Safari 上设置远程应答 sdp

javascript - 如何在没有任何元素 id 的情况下检索表中的文本内容

javascript - Vline.js 给出了神秘的错误消息

javascript - 显示音频的缓冲百分比

html5-audio - HTML5 音频 : createMediaElementSource breaks audio output

javascript - 删除了以下划线开头的 Firebase 数据库键

javascript - 适用于所有数字或仅一个特定符号的正则表达式