通过蓝牙从麦克风实时传输音频到另一台iPhone

15

我正在尝试获取麦克风输入的音频并将其流式传输到另一台iPhone。基本上是通过蓝牙进行电话通话。我正在使用AVAudioRecorder接收音频:

func startRecording() {
    audioRecorder = nil
    let audioSession:AVAudioSession = AVAudioSession.sharedInstance()
    audioSession.setCategory(AVAudioSessionCategoryRecord, error: nil)

    var recordSettings:NSMutableDictionary = NSMutableDictionary(capacity: 10)
    recordSettings.setObject(NSNumber(integerLiteral: kAudioFormatLinearPCM), forKey: AVFormatIDKey)
    recordSettings.setObject(NSNumber(float: 44100.0), forKey: AVSampleRateKey)
    recordSettings.setObject(NSNumber(int: 2), forKey: AVNumberOfChannelsKey)
    recordSettings.setObject(NSNumber(int: 16), forKey: AVLinearPCMBitDepthKey)
    recordSettings.setObject(NSNumber(bool: false), forKey: AVLinearPCMIsBigEndianKey)
    recordSettings.setObject(NSNumber(bool: false), forKey: AVLinearPCMIsFloatKey)

    soundPath = documentsDirectory.stringByAppendingPathComponent("record.caf")
    refURL = NSURL(fileURLWithPath: soundPath as String)
    var error:NSError?

    audioRecorder = AVAudioRecorder(URL: refURL, settings: recordSettings as [NSObject : AnyObject], error: &error)

    if audioRecorder.prepareToRecord() == true {
        audioRecorder.meteringEnabled = true
        audioRecorder.record()
    } else {
        println(error?.localizedDescription)
    }
}

然后我尝试使用这里 - 来自@martin-r 的 StreamReader

使用:

if let aStreamReader = StreamReader(path: documentsDirectory.stringByAppendingPathComponent("record.caf")) {
                while let line = aStreamReader.nextLine() {
                    let dataz = line.dataUsingEncoding(NSUTF8StringEncoding)
                    println (line)

然后使用以下方法将数据发送到另一个设备:

self.appDelegate.mpcDelegate.session.sendData(data: NSData!, toPeers: [AnyObject]!, withMode: MCSessionSendDataMode, error: NSErrorPointer )

我将线路转换为NSData,然后使用dispatch_after 0.5秒不断运行,通过蓝牙发送到另一设备。

这似乎没有起作用,而且我认为这不是一个实际的方法。我已经进行了多次搜索,并没有看到有关通过蓝牙流式传输数据的信息。理解上,关键词“streaming”会将我带到有关服务器流式传输的页面。

我的问题是,我该如何从麦克风中获取音频并通过蓝牙发送到另一个iPhone?我已经设置好了蓝牙部分,它的效果很好。我的问题与THIS非常相似,只是涉及到使用Swift在iPhone之间进行电话通话。

提前感谢您的回答。


哪一部分出了问题?音频捕获还是数据传输?将您的问题分解为捕获、传输,然后再转换回音频。我进行了一些搜索,并发现有(复杂的)方法可以将流式音频捕获到NSData中。缓冲数据,然后使用MCSession startStreamWithName将其流式传输到对等方。假设您想要最小延迟,因此不必写入文件并将其读取回来。 - Dan Loughney
1
好的,那么MCSession,我现在将尝试一下。是的,我的问题出在传输上。已经开始录音,已经有了传输部分,但直到完整短语录制完毕后,传输才会发送。因此,您按住按钮,讲话,它会记录,然后在按钮释放时进行传输。 - iSkore
还是不行。你能给一个在这种情况下的缓冲区示例吗? - iSkore
你好,你有这个功能的可用示例代码吗? - Ulysses
@iSkore,你能提供一下示例代码的Git URL吗? - Saurabh Jain
显示剩余2条评论
1个回答

9
为了同时记录和重定向输出,您需要使用类别AVAudioSessionCategoryMultiRoute
这是类别列表的链接: https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVAudioSession_ClassReference/#//apple_ref/doc/constant_group/Audio_Session_Categories 如果一切都失败了,您可以使用预先制作的解决方案: http://audiob.us 它有一个API,可以让您将音频流从一个应用程序集成到另一个应用程序中: https://developer.audiob.us/ 它支持多个输出终端。
希望这可以帮助您。

1
可以通过蓝牙实现多个输出吗?比如说,我能否通过蓝牙进行流媒体传输。 - iSkore
1
从一个 iPhone 到另一个 iPhone?(两个 iPhone 都使用相同的应用程序) - iSkore
@iSkore,你有没有找到一种方法,可以使用同一个应用程序从一个手机流式传输到另一个手机? - ijsnow
@ijsnow,是的,我做了,到目前为止有几个人问过我,所以我会在gist上发布片段或将其发布到github并在此处评论链接。谢谢。 - iSkore
你有时间处理那些代码片段了吗?谢谢! - Daniel Naftalovich
你好,你有这个功能的可用示例代码吗? - Ulysses

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接