Chrome M34 中 MediaStreamDestination 的 AudioContext 立体声输出
Posted
技术标签:
【中文标题】Chrome M34 中 MediaStreamDestination 的 AudioContext 立体声输出【英文标题】:AudioContext stereo output from MediaStreamDestination in Chrome M34 【发布时间】:2014-04-15 20:21:35 【问题描述】:AudioContext.createMediaStreamDestination() 似乎默认为单声道输出。这个默认is being changed,但是有没有办法手动设置所需的输出通道数?
或者有没有其他方法可以在保留正确数量的频道的同时将流从 WebAudio 获取到 WebRTC?
【问题讨论】:
【参考方案1】:目前这似乎很难做到。经过一番研究,我发现documentation 表示可以设置更多频道。尽管打电话给context.createMediaStreamDestination(2)
,我仍然在另一边收到一个单声道流。根据this 的讨论,您似乎可以添加多个流。尝试此操作时,本地(流媒体)和远程(接收者)在分别调用 pc.getLocalStreams()
和 pc.getRemoteStreams()
时似乎都显示了正确的流。所以你可以做的是使用channel splitter 将输入分成两个单声道
可以一起流式传输的输出。
遗憾的是,由于 webRTC 和 webAudio 仍在开发中,我们还不能通过网络音频 API(使用 context.createMediaStreamSource(<RTCStream>)
,这仅适用于麦克风流)传输接收到的流,然后通过通道合并发送它让它再次上线。我仍在测试是否将接收到的流添加到两个单独的音频元素中以提供同步音频。
小更新
在向一个流中添加多个轨道然后发送该流进行了一些测试之后,接收方的<audio>
标签同时播放了两个轨道,它实际上将它们加起来,就像包含左声道的轨道在两个扬声器上播放一样, 正确的也是如此。所以我还不能在接收端拆分它们,但至少能够通过两个不同的通道发送左右音频。是的,是时候让开发人员有机会通过网络音频 API 管道接收到的音频了。
另一个更新
似乎streamDestinationNode
自动创建的流是立体声流。您可以找到 here 的示例(记得在 src
字段中添加一些音乐)。
这种行为也是 not related 对我们现在播放接收到的流的方式 - 从中创建一个 objectURL 并将其分配给 <audio>
元素的 src。
这意味着它与 RTC 流媒体系统本身有关。用RTCPeerConnection
测试了上面的代码后,似乎它只是混合了通道。
所以我决定使用另一个编解码器 Opus。我找到了一些将其更改为该编解码器的代码,并搜索了将编解码器设置为使用立体声的方法。我找到了this 和this,虽然我不知道如何使用它。除此之外,更改为 Opus 并不会自动将其更改为立体声(如果编解码器设置为自动执行此操作,则可能是这样)。
我找到了为 Opus 创建 sdp 的 draft。我正在调查。
编辑:找到了
我在rtp opus draft 的第三版中找到了它。这是一个例子,它非常简单。将stereo=1; sprop-stereo=1
添加到a=fmtp
行,就完成了。该文档还包含这些属性的规范:
stereo:指定解码器是否更喜欢接收立体声或 单声道信号。可能的值为 1 和 0,其中 1 指定 立体声信号是首选,0 指定只有单声道信号 是首选。独立于每个接收器的立体声参数 必须能够接收和解码立体声信号但发送立体声 信号发送到接收器,表示偏好单声道信号 导致高于必要的网络利用率和编码 复杂。如果未指定任何值,则假定为单声道 (stereo=0)。
sprop-stereo:指定发送者是否可能产生 立体声音频。可能的值为 1 和 0,其中 1 指定 立体声信号可能被发送,并且 0 指定发送者 可能只会发送单声道。这不能保证发件人 永远不会发送立体声音频(例如,它可以发送预先录制的 使用立体声的提示),但它向接收器表明 接收到的信号可以安全地缩混为单声道。这个参数是 有助于避免通过操作音频来浪费接收器资源 不处理时以立体声处理管道(例如回声消除) 必要的。如果未指定值,则假定为单声道 (sprop-stereo=0)。
我希望这对你有帮助。我希望这是为了获得更高质量的音频,我建议您通读 doc 以了解有关高质量音频流的更多信息。
缺点
在与朋友一起测试后,似乎编码端(发送音频的端)在 chrome 34 中产生了噪音。我一直在使用 chrome 36(开发和金丝雀),并且没有出现此错误。 (当从 chrome 34 流式传输到 36 时,你会得到噪音,当从 36 流到 34 时,你不会,所以这是编码方面的问题)。
(为什么要写这么详细的答案?我也想了解自己:D)。
【讨论】:
以上是关于Chrome M34 中 MediaStreamDestination 的 AudioContext 立体声输出的主要内容,如果未能解决你的问题,请参考以下文章
为啥转换后的 UIView 会与层次结构中较高的其他视图重叠?