访问Apple Watch的麦克风

13

随着越来越多的苹果手表文档浮出水面,是否有人找到了访问和使用设备麦克风的方法?

6个回答

12

您可以在watchOS 2上访问 Watch的麦克风。

1)创建一个文件URL以存储记录的输出。

NSArray *filePaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                         NSUserDomainMask,YES);
NSString *path = [[filePaths firstObject] stringByAppendingPathComponent:@"rec.m4a"];
NSURL *fileUrl = [NSURL fileURLWithPath:path];

您可以指定扩展名为 .wav、.mp4 和 .m4a。

2) 调用该方法的方式如下:

[self presentAudioRecordingControllerWithOutputURL:fileUrl
                                            preset:WKAudioRecordingPresetWideBandSpeech
                                   maximumDuration:5.0
                                       actionTitle:@"Some Title"
                                        completion:^(BOOL didSave, NSError * __nullable error) {

                                            NSLog(@"didSave:%d, error:%@", didSave, error);
                                        }];

除了上述内容外,您还可以选择预设。

  • WKAudioRecordingPresetNarrowBandSpeech(窄带语音)
  • WKAudioRecordingPresetHighQualityAudio(高质量音频)

在Swift中:

self.presentAudioRecordingControllerWithOutputURL(
    self.recFileURL(),
    preset: WKAudioRecordingPreset.WideBandSpeech,
    maximumDuration: 5.0,
    actionTitle: "SomeTitle") { (didSave, error) -> Void in

        print("didSave:\(didSave), error:\(error)")
}

你可以按照以下步骤播放录制的文件:

self.presentMediaPlayerControllerWithURL(
    fileURL,
    options: nil) { (didPlayToEnd, endTime, error) -> Void in

        print("didPlayToEnd:\(didPlayToEnd), endTime:\(endTime), error:\(error)")
}

您可以在这里查看详细规格。


2
我希望也能有一些实时访问麦克风缓冲区的方式,就像使用CoreAudio时一样。 - Josip B.
请问您能否演示一下如何在Swift中创建URL?我遇到了“Optional(Error Domain = com.apple.watchkit.errors Code = 3” The operation couldn't be completed. (com.apple.watchkit.errors error 3.) “的问题,我感觉是因为我没有正确地创建URL。 - William Robinson
有没有不使用控制器进行录制的方法? - BlackM

1

1

我在官方文档中没有找到具体提及,但在开发者论坛上,版主们表示目前还不可能。

WatchKit目前无法访问手表的麦克风。但是,您可以从WatchKit扩展中访问iPhone的麦克风。


0

是的,它在Watch OS 2中被引入。

但正如苹果所提到的,这部分API处于预览阶段,并且已经发生了很多变化。至于Watch OS 2 beta 5,相应的接口(用Swift编写)已更改为:

@available(watchOS 2.0, *)

public func presentAudioRecorderControllerWithOutputURL(URL: NSURL, preset: WKAudioRecorderPreset, options: [NSObject : AnyObject]?, completion: (Bool, NSError?) -> Void)

因此,如果您想尝试这个新功能,请始终参考您正在使用的SDK文档。

顺便说一下,这个示例项目将是一个很好的开始:

https://github.com/shu223/watchOS-2-Sampler

然而,示例中使用的一些API已经发生了变化,比如这个录制API。


0

我认为WWDC 2015和新的watchOS 2 beta带来了好消息:

WWDC watchOS

很抱歉,目前文档中没有关于音频的内容。


0

这是在 Interface.storyboard 中之前添加的按钮的操作中,也不要忘记在 info.plist 中添加隐私 - 使用麦克风说明字符串。

@IBAction func btnActionRecord() {
    var filePath: NSURL!
    if let dir: NSString = NSSearchPathForDirectoriesInDomains(.documentDirectory, .allDomainsMask, true).first as NSString? {
        let path = dir.appendingPathComponent("myRecord.wav")
        filePath = NSURL(string: path)
        let audioOptions = [
            WKAudioRecorderControllerOptionsActionTitleKey: "Save",
            WKAudioRecorderControllerOptionsAlwaysShowActionTitleKey: true,
            WKAudioRecorderControllerOptionsAutorecordKey: true,
            WKAudioRecorderControllerOptionsMaximumDurationKey: 5.0] as [String : Any]

        presentAudioRecorderController(withOutputURL: filePath! as URL, preset: .highQualityAudio, options: audioOptions, completion: {
            (didSave, error)  -> Void in
            if didSave {
                print("Audio saved")
                let options = [WKMediaPlayerControllerOptionsAutoplayKey: true]
                self.presentMediaPlayerController(with: self.filePath as URL, options: options) {
                (didPlayToEnd, endTime, error) -> Void in
                    if didPlayToEnd {
                        print("Audio finished")
                    }
                    if error != nil {
                        print(error!.self)
                        }
                }
            }
            if error != nil {
                    print(error!.localizedDescription)
            }
        })
    }

}

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