javascript - 如何实现 JavaScript getUserMedia stub 来发送自定义音频字节

标签 javascript webrtc getusermedia

我想通过 WebRTC 发送自定义音频字节,这就是为什么我需要使用自己的 MediaTrack 编写自定义 getUserMedia 方法。现在的样子:

     exports.navigator.getUserMedia = getUserMedia;


     function getUserMedia (constraints, successCallback) {
      console.log("window navigator: ",  exports.parent.navigator);
      console.log("call getUserMedia callback method callback = ", successCallback)
      console.log("createMediaStreamSource is: ",  exports.AudioContext.prototype.createMediaStreamSource);

      return new Promise(function(resolve, reject) {
                          postMessage('WKWebViewGetUserMediaShim_MediaStream_new', constraints, function (trackData) {
                                      var stream = new MediaStream()

                                      for (var i in trackData) {
                                      var data = trackData[i]
                                      var track = new MediaStreamTrack()

                                      track.id = data.id
                                      track.kind = data.kind
                                      track._meta = data.meta
                                      track._stream = stream
                                      console.log("track in promise = ", track);
                                      stream._tracks.push(track)
                                      exports.parent.navigator.tracks[track.kind] = exports.parent.navigator.tracks[track.kind] || {}
                                      exports.parent.navigator.tracks[track.kind][track.id] = track
                                      console.log("tracks in promise = ", tracks);
                                      }
                                     console.log("success callback = ", successCallback)
                                      resolve(stream)
                                      }, function(error){reject(error)})
                        });



    }

  getUserMedia._onmedia = function (kind, data) {

    var tracksByKind = exports.parent.navigator.tracks[kind]
    if (kind === 'audio') {
      data = new Float32Array(base64ToData(data))
    } else if (kind === 'video') {
      data = data
    }
//    console.log("onmedia tracks ", exports.parent.navigator.tracks);
    for (var i in tracksByKind) {
      var track = tracksByKind[i]
//      console.log("data came with data ", data);
//      console.log("track = : ", track);


      track._ondataavailable && track._ondataavailable(data)
    }
}

_onmedia 方法是我获取自定义字节的地方,而 getUserMedia 我正在尝试 stub 。但我不知道如何正确地将自定义字节流设置为 MediaStreamTrack 类。

最佳答案

要从网络浏览器生成音频,请使用 Web Audio API 。 有多种方法可以让您生成合成声音。

如果您希望控制每个样本,您可以使用 ScriptProcessorNode 并为其提供 AudioProcessEventoutputBuffer

Web Audio API 甚至有一个 MediaStreamAudioDestinationNode 对象,允许在 MediaStream 对象内输出生成的音频:

btn.onclick = start;

function start() {

  const ctx = new (window.AudioContext || window.webkitAudioContext);

  const processor = ctx.createScriptProcessor(256,1,1);
  processor.onaudioprocess = makeSomeNoise;
  
  const streamNode = ctx.createMediaStreamDestination();
  processor.connect(streamNode);
  const mediaStream = streamNode.stream;

  // for demo output to a MediaElement
  aud.srcObject = mediaStream;
  aud.volume = 0.5;
  aud.play();

}


function makeSomeNoise(evt) {

  const output = evt.outputBuffer.getChannelData(0);
  // loop through the 4096 samples
  for (let sample = 0; sample < output.length; sample++) {
    // noise
    output[sample] = (Math.random() - 0.5) * 0.5;         
  }
  
}
<button id="btn">start</button>
<audio id="aud" controls></audio>

关于javascript - 如何实现 JavaScript getUserMedia stub 来发送自定义音频字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54749339/

相关文章:

webrtc - 如何使用 OpenTok 选择音频输出

javascript - 如何使用 getUserMedia 流中的数据更新 Angular 绑定(bind)?

audio - GetUserMedia 获取电脑音频

javascript - ExtJS4 树面板改变节点颜色

javascript - 无论如何,是否可以在数据映射内执行 if 语句?

firefox - Moz RTCPeerConnection() 上 FireFox 中的 NS_ERROR_UNEXPECTED

javascript - 在 webrtc 中动态控制视频发送帧率

webkit - 减少 navigator.webkitGetUserMedia 的 CPU 使用率(Electron : DesktopCapturer)

java - GPS 设备和编程

javascript - YouTube - 如何只播放没有音频的视频?