0

これは非常に基本的な質問のように思えるかもしれませんが、答えを見つけるのに苦労しています。私の知る限り、 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 メソッドを使用するようにフォールバックする必要がありますか? 多くの価値があるのは、SpeechRecognizer の周りの WWDC コードから持ち上げられたものです。彼らがマイクの許可を処理している場所がわかりません

実際、アクセス許可を要求するためのアラートが常に表示されるとは限りません。私が見つけた例では、この許可ステップをスキップしているように見えるため、ここで何が欠けていますか

4

1 に答える 1

0

わかりましたので、ドキュメントを見て、これを見つけました:

オーディオの録音には、ユーザーからの明示的な許可が必要です。録音を有効にするカテゴリを使用しているときに、アプリのオーディオ セッションが初めてオーディオ入力ルートを使用しようとすると、システムはユーザーに許可を求めるプロンプトを自動的に表示します。このメソッドを呼び出すことで、明示的に事前に問い合わせることができます。ユーザーがアプリに録音の許可を与えるまで、アプリは無音のみを録音できます。

このメソッドは常にすぐに戻りますが、ユーザーが以前にアプリで記録する許可を付与または拒否していない場合、応答ブロックはユーザーの入力を待ちます。

ユーザーがアプリの録音許可プロンプトに応答すると、システムはその選択を記憶します。ユーザーが録音許可を拒否した場合は、[設定] > [プライバシー] > [マイク] で再度有効にすることができます。

そのため、最初にマイクを使用しようとしたときに自動的に実行されているように見えますが、理想的には、事前にこの許可を求める必要があります

于 2016-07-15T10:37:31.223 に答える