通过对等连接发送具有Web音频效果的MediaStream对象
Send MediaStream object with Web Audio effects over PeerConnection
我正在尝试通过WebRTC的PeerConnection发送由getUserMedia()
获得并使用Web audio API更改的音频。Web Audio API和WebRTC似乎有能力做到这一点,但我很难理解如何做到这一步。在Web Audio API中,AudioContext
对象包含一个方法createMediaStreamSource()
,该方法提供了一种连接getUserMedia()获得的MediaStream的方法。此外,还有一个createMediaStreamDestination()
方法,它似乎返回一个具有流属性的对象。
我从getUserMedia()方法获得音频和视频。我遇到的问题是如何将这个流对象(包括音频和视频)传递到这些方法(例如:createMediaStreamSource())中?我是否首先需要以某种方式从流中提取音频(getAudioTracks),并找到将其与视频组合的方法?还是我按原样传递它,使视频不受影响?音频只能更改一次吗(在添加到对等连接之前)?
createMediaStreamSource()
方法将一个MediaStream
对象作为其参数,然后将该对象中的第一个AudioMediaStreamTrack
用作音频源。这可以用于从getUserMedia()
方法接收的MediaStream对象,即使该对象同时包含音频和视频。例如:
var source = context.createMediaStreamSource(localStream);
在上面的代码中,"context"是一个AudioContext
对象,"localStream"是从getUserMedia()获得的MediaStream对象。createMediaStreamDestination()
方法创建一个目标节点对象,该对象的"流"属性中有一个MediaStream对象。这个MediaStream对象只包含一个AudioMediaStreamTrack(即使源的输入流同时包含音频和视频或许多音轨):从源内的流中获得的音轨的更改版本。例如:
var destination = context.createMediaStreamDestination();
现在,在访问新创建的目标变量的流属性之前,必须通过将所有节点链接在一起来创建音频图。对于这个例子,假设我们有一个名为filter的BiquadFilter节点:
source.connect(filter);
filter.connect(destination);
然后,我们可以从目标变量中获得流属性。这可以用于添加到PeerConnection
对象以发送到远程对等端:
peerConnection.addStream(destination.stream);
注意:stream属性包含一个MediaStream对象,该对象仅具有更改后的AudioMediaStreamTrack。因此,没有视频。如果你也想发送视频,你必须将此曲目添加到包含视频曲目的流对象中:
var audioTracks = destination.stream.getAudioTracks();
var track = audioTracks[0]; //stream only contains one audio track
localStream.addTrack(track);
peerConnection.addStream(localStream);
请记住,如果MediaStream对象中已经有一个具有相同id的轨道,addTrack
方法将不会添加该轨道。因此,您可能必须首先删除在源节点中获得的轨道。
通过调整中间节点(源和目的地之间)内的值,可以随时更改声音。这是因为流在发送到另一个对等体之前要经过节点。看看这个关于动态改变录制声音效果的例子(对于流应该是一样的)。注意:我还没有测试过这个代码。尽管它在理论上有效,但可能存在一些跨浏览器问题,因为Web Audio API和WebRTC都处于工作草案阶段,尚未标准化。我认为它可以在Mozilla Firefox和Google Chrome中工作。
参考
- 媒体捕获和流
- 网络音频API
@Android Student的响应很好,根据当前的规范-然而,Firefox和Chrome在规范的实现中都存在问题。
上次我登录Chrome时,它无法通过WebAudio处理WebRTC的输出,而Firefox可以。
然而,有两个错误阻止Firefox在对等连接中获取WebAudio生成的源流,其中一个错误现在已经在Nightly&奥罗拉,另一个应该很快就会来。然而,Firefox还没有实现stream.addTrack,这是另一个复杂的问题。Chrome显然可以在对等连接中处理WebAudio来源的流。
- 如何设置音频对象的音量
- 为一个声音元素数组创建一个音频对象jquery,javascript
- 从PHP脚本获取音频文件时,更改JavaScript音频对象的当前时间
- 用javascript重放音频对象
- Android Chrome:音频对象需要很长时间才能开始流式传输mp3
- HTML5 音频对象无法在 iPad 上播放(从 setTimeout 调用时)
- 通过javascript下载音频对象
- 音频对象未在 IE10 中播放
- 音频对象未在移动设备的回调中播放
- 如何将淡入/淡出方法添加到 JS 音频对象
- 如何在页面中有一个jQuery播放器对象的多个实例(音频对象)
- 使用 JavaScript 代码创建音频对象
- Javascript音频对象onload事件
- 需要帮助控制iE8中的音频对象音量
- 克隆音频对象
- 动态创建的音频对象不能在Android Chrome浏览器中播放
- WebAudioAPI:将JS音频对象附加到
- 当在Javascript中创建太多音频对象时,浏览器会崩溃
- 如何使用html范围滑块更改音频对象的音量
- 如何改变Javascript音频对象src