【问题标题】:Record Audio Stream from getUserMedia从 getUserMedia 录制音频流
【发布时间】:2012-08-16 01:32:07
【问题描述】:

最近几天,我尝试使用javascript来录制音频流。 我发现没有有效的示例代码。

有浏览器支持吗?

这是我的代码

navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia ||
                         navigator.mozGetUserMedia || navigator.msGetUserMedia; 

navigator.getUserMedia({ audio: true }, gotStream, null);
function gotStream(stream) {

        msgStream = stream;        
        msgStreamRecorder = stream.record(); // no method record :(
}

【问题讨论】:

    标签: javascript html audio webrtc getusermedia


    【解决方案1】:

    getUserMedia 允许您访问设备,但录制音频由您决定。为此,您需要“监听”设备,构建数据缓冲区。然后,当您停止收听设备时,您可以将该数据格式化为 WAV 文件(或任何其他格式)。格式化后,您可以将其上传到您的服务器、S3,或直接在浏览器中播放。

    要以对构建缓冲区有用的方式收听数据,您将需要一个 ScriptProcessorNode。 ScriptProcessorNode 基本上位于输入(麦克风)和输出(扬声器)之间,让您有机会在音频数据流式传输时对其进行操作。不幸的是,实现并不简单。

    你需要:

    • getUserMedia访问设备
    • AudioContext 创建一个 MediaStreamAudioSourceNode 和一个 ScriptProcessorNode
    • MediaStreamAudioSourceNode 表示音频流
    • ScriptProcessorNode 通过 onaudioprocessevent 访问流式音频数据。该事件公开了您将用来构建缓冲区的通道数据。

    把它们放在一起:

    navigator.getUserMedia({audio: true},
      function(stream) {
        // create the MediaStreamAudioSourceNode
        var context = new AudioContext();
        var source = context.createMediaStreamSource(stream);
        var recLength = 0,
          recBuffersL = [],
          recBuffersR = [];
    
        // create a ScriptProcessorNode
        if(!context.createScriptProcessor){
           node = context.createJavaScriptNode(4096, 2, 2);
        } else {
           node = context.createScriptProcessor(4096, 2, 2);
        }
    
        // listen to the audio data, and record into the buffer
        node.onaudioprocess = function(e){
          recBuffersL.push(e.inputBuffer.getChannelData(0));
          recBuffersR.push(e.inputBuffer.getChannelData(1));
          recLength += e.inputBuffer.getChannelData(0).length;
        }
    
        // connect the ScriptProcessorNode with the input audio
        source.connect(node);
        // if the ScriptProcessorNode is not connected to an output the "onaudioprocess" event is not triggered in chrome
        node.connect(context.destination);
      },
      function(e) {
        // do something about errors
    });
    

    我建议您使用AudioRecorder 代码,而不是自己构建所有这些,这太棒了。它还处理将缓冲区写入 WAV 文件。 Here is a demo.

    这是另一个great resource

    【讨论】:

    【解决方案2】:

    对于支持MediaRecorder API的浏览器,请使用它。

    对于不支持 MediaRecorder API 的旧浏览器,有三种方法可以做到这一点

    1. 作为wav
    2. 作为mp3
    3. as opus packets (可以得到输出为wav, mp3 or ogg)

    【讨论】:

      【解决方案3】:

      你可以查看这个网站: https://webaudiodemos.appspot.com/AudioRecorder/index.html

      它将音频存储到客户端的文件 (.wav) 中。

      【讨论】:

      • 请注意 link-only answers 是不鼓励的,所以答案应该是寻找解决方案的终点(与另一个中途停留的参考相比,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。
      • 如果我从上面的链接录制和下载,则无法使用 windows media player 播放音频。如果我使用 Windows 媒体播放器并使用该东西录制音频,那么如果我下载媒体播放器经典版,则可以播放损坏的音频。甚至 vlc 都无法播放该音频
      【解决方案4】:

      目前存在一个仅允许音频的错误。请看http://code.google.com/p/chromium/issues/detail?id=112367

      【讨论】:

        【解决方案5】:

        目前,如果不将数据发送到服务器端,这是不可能的。但是,如果他们开始支持MediaRecorder working draft,这将很快在浏览器中成为可能。

        【讨论】:

        • 这是此功能的错误跟踪器link
        猜你喜欢
        • 2021-07-11
        • 1970-01-01
        • 2018-10-13
        • 1970-01-01
        • 2013-11-22
        • 1970-01-01
        • 2015-12-05
        • 1970-01-01
        • 2018-10-30
        相关资源
        最近更新 更多