【问题标题】:Stream audio from microphone via bluetooth to another iPhone通过蓝牙将音频从麦克风流式传输到另一部 iPhone
【发布时间】:2015-08-23 17:25:39
【问题描述】:

我正在尝试接收传入的麦克风音频并将其流式传输到另一部 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 的HERE - StreamReaderStreamReader

使用:

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 )

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

它似乎不起作用,我认为这不是一种实用的方法。我进行了多次搜索,但在通过蓝牙流式传输数据方面并没有看到太多。关键字流(可以理解)将我带到有关服务器流的页面。

我的问题是,如何从麦克风获取音频并通过蓝牙将其发送到另一部 iPhone?我已经设置了蓝牙部分,效果很好。我的问题与THIS 非常相似,除了 iPhone 和 Swift - 我想通过蓝牙打电话。

提前谢谢你。

【问题讨论】:

  • 哪个部分不起作用?音频捕获还是数据传输?将您的问题分解为捕获、传输,然后转换回音频。我做了一些搜索,发现有(复杂的)将流式音频捕获到 NSData 的方法。缓冲数据,然后使用 MCSession startStreamWithName 将其流式传输到您的对等方。假设您想要最小的延迟,所以不要费心写入文件并将其读回。
  • 好的,MCSession,我现在就试一试。是的,我的问题是传输。开始录音,得到传输部分,但传输直到完整的乐句被录制后才发送。所以你按住按钮,说话,它记录,然后释放按钮,传输。
  • 还是不行。你能举一个在这种情况下缓冲的例子吗?
  • 你有没有得到这个工作?我很想和你谈谈这件事,因为我正在做一些非常相似的事情。
  • @iSkore 你做了这个应用程序。有效吗?

标签: ios iphone swift audio bluetooth


【解决方案1】:

要同时记录和重定向输出,您需要使用类别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/

它支持多个输出端点。

希望这会有所帮助。

【讨论】:

  • 通过蓝牙多路输出?就像我可以通过蓝牙流式传输一样。
  • 从一部 iPhone 到另一部? (都使用同一个应用)
  • @iSkore 你有没有发现你是否可以使用同一个应用程序从一部手机流式传输到另一部手机?
  • @ijsnow,是的,我做到了,到目前为止,有几个人问过我,所以我将在 gist 上发布 sn-ps 或将其发布到 github 并在此处评论链接。谢谢。
  • 曾经接触过那些 sn-ps 吗?谢谢!
猜你喜欢
  • 2018-07-29
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
  • 2014-12-20
  • 2014-10-23
  • 1970-01-01
相关资源
最近更新 更多