- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在 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 完全是一个黑客,但我稍后会谈到)
最佳答案
您可以在通知中心捕获事件,然后切换它。
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 - 在 iOS 的 webrtc 上启用立体声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35281569/
我正在使用 libspotify 检索音乐以使用某些音频库播放。 Spotify 音乐应为原始 16 位、44100hz、立体声 LPCM。我一直在尝试用 NAudio 播放音乐,但不幸的是它不是立体
我在stackoverflow上找到了以下不可思议的代码。请任何人帮助我添加第二个 channel (立体声) 将有nchannels = 2 必须(以某种方式)增加文件大小,并且必须添加2.数组(即
我试图将我的音频通话强制设为单声道,我愿意使用 PCMU、G.729、OPUS 和 SpeeX 作为我的通话编解码器。 现在我正在使用以下代码在我的 sdp 消息中搜索所选的编解码器: functio
我正在使用 AudioKit 创建一个实验性 iOS 音频应用程序。目前,我正在尝试将 AKStereoInput 的左声道重新路由到 AudioKit.output 的右声道,并将 AKStereo
我目前正在使用 python 处理 .wav 文件,使用 Pyaudio 流式传输音频,使用 python wave 库加载文件数据。 我计划稍后包括处理单个立体声 channel ,关于信号的幅度和
我正在尝试获取空间中几个点的 3D 坐标,但我从 undistortPoints() 和 triangulatePoints() 都得到了奇怪的结果。 由于两个相机的分辨率不同,我分别校准,得到0,3
我正在尝试从具有以下音轨布局的 Prores 中提取只有 2.0 的 Prores 视频(L R 在同一轨道上)。如何使用 FFmpeg 库来做到这一点? 我无法从以下 ffmpeg 库规范 http
我正在使用javasound并具有格式的AudioInputStreamPCM_SIGNED 8000.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endi
我想要与此匹配的 FFmpeg cli 设置(这是手刹预设) 这是预设文件,我不明白这些对ffmpeg是什么。 { "AlignAVStart": false, "AudioCopyM
为了解决我遇到的 5.1 电影的对话非常好的问题,我使用 FFMPEG 将我的 MKV 电影的每个音轨转换为具有音频规范化的 2.0 音轨,从而使视频和字幕保持不变。 该命令如下所示: for /r
我试图理解 YouTube 在他们推荐的上传编码设置中列出的内容,以获得最佳质量。这是链接:https://support.google.com/youtube/answer/1722171#zipp
我有一个包含 16 个音频单声道流的 MXF 文件,我需要将其重新编码为一个 mp4 文件,其中 2<=n<=16 个 channel 合并输入流,例如在输出 channel 1 上输入 channe
我是一名优秀的程序员,十分优秀!