iOS 中的蓝牙语音
Voice over bluetooth in iOS
我研究了四天,但我没有找到任何在一定距离内的两个 iOS 设备之间通过蓝牙呼叫的解决方案。
我发现使用多点连接框架可以在两个 iOS 设备之间进行音频流传输,但这对我没有帮助。我想通过蓝牙在两个设备之间进行实时语音聊天。
是否有用于蓝牙语音的 CO-DAC?
我的代码是:
var engine = AVAudioEngine()
var file: AVAudioFile?
var player = AVAudioPlayerNode()
var input:AVAudioInputNode?
var mixer:AVAudioMixerNode?
override func viewDidLoad() {
super.viewDidLoad()
mixer = engine.mainMixerNode
input = engine.inputNode
engine.connect(input!, to: mixer!, format: input!.inputFormat(forBus: 0))
}
@IBAction func btnStremeDidClicked(_ sender: UIButton) {
mixer?.installTap(onBus: 0, bufferSize: 2048, format: mixer?.outputFormat(forBus: 0), block: { (buffer: AVAudioPCMBuffer, AVAudioTime) in
let byteWritten = self.audioBufferToData(audioBuffer: buffer).withUnsafeBytes {
self.appDelegate.mcManager.outputStream?.write([=11=], maxLength: self.audioBufferToData(audioBuffer: buffer).count)
}
print(byteWritten ?? 0)
print("Write")
})
do {
try engine.start()
}catch {
print(error.localizedDescription)
}
}
func audioBufferToData(audioBuffer: AVAudioPCMBuffer) -> Data {
let channelCount = 1
let bufferLength = (audioBuffer.frameCapacity * audioBuffer.format.streamDescription.pointee.mBytesPerFrame)
let channels = UnsafeBufferPointer(start: audioBuffer.floatChannelData, count: channelCount)
let data = Data(bytes: channels[0], count: Int(bufferLength))
return data
}
提前致谢:)
为什么 MultipeerConnectivity 对您没有帮助?这是通过蓝牙甚至 wifi 传输音频的好方法。
当你这样调用时:
audioEngine.installTap(onBus: 0, bufferSize: 17640, format: localInputFormat) {
(buffer, when) -> Void in
您需要使用类型为AVAudioPCMBuffer 的缓冲区。然后您需要将其转换为 NSData 并写入您将与对等方打开的 outputStream:
data = someConverstionMethod(buffer)
_ = stream!.write(data.bytes.assumingMemoryBound(to: UInt8.self), maxLength: data.length)
然后在另一台设备上,您需要从流中读取并将NSData 转换回AVAudioPCMBuffer,然后您可以使用AVAudioPlayer 来播放缓冲区。
我以前以极短的延迟完成过此操作。
我研究了四天,但我没有找到任何在一定距离内的两个 iOS 设备之间通过蓝牙呼叫的解决方案。
我发现使用多点连接框架可以在两个 iOS 设备之间进行音频流传输,但这对我没有帮助。我想通过蓝牙在两个设备之间进行实时语音聊天。
是否有用于蓝牙语音的 CO-DAC?
我的代码是:
var engine = AVAudioEngine()
var file: AVAudioFile?
var player = AVAudioPlayerNode()
var input:AVAudioInputNode?
var mixer:AVAudioMixerNode?
override func viewDidLoad() {
super.viewDidLoad()
mixer = engine.mainMixerNode
input = engine.inputNode
engine.connect(input!, to: mixer!, format: input!.inputFormat(forBus: 0))
}
@IBAction func btnStremeDidClicked(_ sender: UIButton) {
mixer?.installTap(onBus: 0, bufferSize: 2048, format: mixer?.outputFormat(forBus: 0), block: { (buffer: AVAudioPCMBuffer, AVAudioTime) in
let byteWritten = self.audioBufferToData(audioBuffer: buffer).withUnsafeBytes {
self.appDelegate.mcManager.outputStream?.write([=11=], maxLength: self.audioBufferToData(audioBuffer: buffer).count)
}
print(byteWritten ?? 0)
print("Write")
})
do {
try engine.start()
}catch {
print(error.localizedDescription)
}
}
func audioBufferToData(audioBuffer: AVAudioPCMBuffer) -> Data {
let channelCount = 1
let bufferLength = (audioBuffer.frameCapacity * audioBuffer.format.streamDescription.pointee.mBytesPerFrame)
let channels = UnsafeBufferPointer(start: audioBuffer.floatChannelData, count: channelCount)
let data = Data(bytes: channels[0], count: Int(bufferLength))
return data
}
提前致谢:)
为什么 MultipeerConnectivity 对您没有帮助?这是通过蓝牙甚至 wifi 传输音频的好方法。
当你这样调用时:
audioEngine.installTap(onBus: 0, bufferSize: 17640, format: localInputFormat) {
(buffer, when) -> Void in
您需要使用类型为AVAudioPCMBuffer 的缓冲区。然后您需要将其转换为 NSData 并写入您将与对等方打开的 outputStream:
data = someConverstionMethod(buffer)
_ = stream!.write(data.bytes.assumingMemoryBound(to: UInt8.self), maxLength: data.length)
然后在另一台设备上,您需要从流中读取并将NSData 转换回AVAudioPCMBuffer,然后您可以使用AVAudioPlayer 来播放缓冲区。
我以前以极短的延迟完成过此操作。