在 iOS 的 webrtc 上启用立体声

Posted

技术标签:

【中文标题】在 iOS 的 webrtc 上启用立体声【英文标题】:Enabling stereo sound on webrtc for iOS 【发布时间】:2016-05-18 19:40:10 【问题描述】:

我在 ios 上使用 Opus 编解码器进行 webrtc 音频流 (libjingle_peerconnection)。如何为音频播放启用立体声?

我从这里的这篇博文中借鉴了一些想法,希望我可以让它发挥作用。我们能够为我们的 Web 客户端启用立体声,但不能为我们的 iOS 客户端启用立体声。

https://www.webrtcexample.com/blog/?go=all/how-to-support-stereo-in-a-webrtc-application/

我正在为优惠和对等连接约束禁用回声消除,如下所示:

private func initializeConstraints() -> RTCMediaConstraints 
    let mandatoryConstraints = [
        RTCPair(key: "OfferToReceiveAudio", value: "true"),
        RTCPair(key: "OfferToReceiveVideo", value: "false"),
        RTCPair(key: "echoCancellation", value: "false"),
        RTCPair(key: "googEchoCancellation", value: "false")
    ]
    let optionalConstraints = [
        RTCPair(key: "internalSctpDataChannels", value: "true"),
        RTCPair(key: "DtlsSrtpKeyAgreement", value: "true")
    ]
    return RTCMediaConstraints(mandatoryConstraints: mandatoryConstraints, optionalConstraints: optionalConstraints)

我正在为 Opus 音频编解码器启用立体声,如下所示:

func peerConnection(peerConnection: RTCPeerConnection!, didCreateSessionDescription sdp: RTCSessionDescription!, error: NSError?) 
    LOGD("created sdp")

    guard error == nil else 
        LOGE("error creating session description: \(error!)")
        delegate.onError(self, description: "Error creating sdp")
        return
    

    dispatch_async(dispatch_get_main_queue()) 
        let replaceThis = "fmtp:111 minptime=10; useinbandfec=1"
        let replaceWith = "fmtp:111 minptime=10; useinbandfec=1; stereo=1; sprop-stereo=1"
        let sdpDescriptionWithStereo = sdp.description.stringByReplacingOccurrencesOfString(replaceThis, withString: replaceWith)
        let sdpWithStereo = RTCSessionDescription(type: sdp.type, sdp: sdpDescriptionWithStereo)
        peerConnection.setLocalDescriptionWithDelegate(self, sessionDescription: sdpWithStereo)

        self.delegate.onLocalSDP(self, type: sdp.type, sdp: sdpDescriptionWithStereo)
    

我在sdpDescriptionWithStereo 中得到了想要的结果。但我仍然无法让立体声工作。

(而且,是的,我知道 stringByReplacingOccurrencesOfString 完全是 hack,但我稍后会谈到)

【问题讨论】:

找到任何解决方案?如何解决 ios webrtc 中的回声停止 @AvinashVaghasiya 我从未找到解决方案。但我认为我们得出的结论是 iOS 不支持 WebRTC 立体声。 【参考方案1】:

您可以在通知中心捕捉事件,然后切换它。

     NotificationCenter.default.addObserver(self, selector: #selector(JanusCommunicationManager.didSessionRouteChange), name: NSNotification.Name.AVAudioSessionRouteChange, object: nil)

     @objc func didSessionRouteChange(notification:Notification) 
        let dict = notification.userInfo
        let routeChangeReason = dict![AVAudioSessionRouteChangeReasonKey] as! UInt
        let error:Error? = nil
        switch routeChangeReason 
        case AVAudioSessionRouteChangeReason.categoryChange.rawValue:
            try? AVAudioSession.sharedInstance().overrideOutputAudioPort(.none)
            break
        default:
            break
        

    

【讨论】:

以上是关于在 iOS 的 webrtc 上启用立体声的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 webrtc 录制高质量的立体声音频?

WebRTC回声抵消模块简要分析

如何在 Android webRTC 上启用 H264

如何在平板电脑/智能手机上启用立体声录音,尽管有两个内置麦克风,但只产生单声道?

WebRTC 远程视频在 ios Safari 上一直冻结

在 iOS 上解码/播放 HE-AAC v2(参数立体声)?