Это может показаться очень простым вопросом, но я изо всех сил пытаюсь найти ответ. Насколько мне известно, AVAudioInputNode доступен с iOS 8, и его можно использовать, например, для записи с микрофона на iPhone.
Я знаю, что раньше я использовал AVAudioRecorderSession, чтобы запросить разрешение на запись и проверить, есть ли у меня разрешение и т. д. Я борюсь с тем, как запросить и проверить разрешение при использовании AVAudioEngine.
Итак, как я могу это сделать, как показано ниже?
import AVFoundation
class ViewController: UIViewController {
let audioEngine = AVAudioEngine()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func recordPressed(sender:AnyObject) {
try! startRecording()
}
func startRecording() throws{
let audioSession = AVAudioSession.sharedInstance()
try audioSession.setCategory(AVAudioSessionCategoryRecord)
try audioSession.setMode(AVAudioSessionModeMeasurement)
try audioSession.setActive(true, withOptions: .NotifyOthersOnDeactivation)
guard let inputNode = audioEngine.inputNode else { fatalError("Audio engine has no input node") }
let recordingFormat = inputNode.outputFormatForBus(0)
inputNode.installTapOnBus(0, bufferSize: 1024, format: recordingFormat) { (buffer: AVAudioPCMBuffer, when: AVAudioTime) in
}
audioEngine.prepare()
try audioEngine.start()
}
}
Я заметил, что сообщение о конфиденциальности микрофона можно установить в plist, и вызов audioEngine.inputNode, кажется, представляет это сообщение. Но я все еще не вижу, где проверить, было ли предоставлено это разрешение. Если я добавлю
if (audioSession.recordPermission() == AVAudioSessionRecordPermission.granted){
}else{
print("No permission")
}
сразу после строки guard let inputNode
он представляет сообщение, но всегда говорит мне, что разрешение не предоставлено, прежде чем я даже отвечу на предупреждение.
Как лучше всего это сделать? Должен ли я сначала вернуться к использованию методов audioSession? Как бы то ни было, многое из этого было взято из кода WWDC, относящегося к speechRecognizer. Я просто не вижу, где они управляют разрешением микрофона.
На самом деле не всегда появляется предупреждение о запросе разрешений. Что мне здесь не хватает, поскольку примеры, которые я нашел, похоже, пропускают этот шаг разрешения