0

私は問題に苦しんでいます:プレビューレイヤーを持つAVCaptureSessionがあり、ユーザーがボタンをタップすると触覚フィードバックを提供したいと考えています。私がAVCaptureSessionにaudioInputを追加すると、私は触覚フィードバックを全く生成できません。レコードを開始する直前にaudioInputを追加しようとしましたが、停止直後に削除するようにしましたが、キャプチャセッションの設定(シリアルキューで行った)を変更するとビデオプレビューの不具合が発生します。そして、私はSnapchatとInstagramがこのトリックをどのようにしているのかまだ分かりません。私の推測の1つは、どうにかAVAudioSessionを設定することでしたが、わかりませんでした。AVCaptureSessionにオーディオ入力を追加するには、ビデオプレビューを中断することなく録音する必要がありますか?

私のキャプチャセッションの初期化はかなり一般的であるので、私はそれを貼り付けないであろう(ここで注目すべき私はcaptureSession.automaticallyConfiguresApplicationAudioSession = falseラインと共有AVAudioSessionがそのようにAVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord, mode: AVAudioSessionModeVideoRecording, options: [.mixWithOthers])のように変更されていることである)が、私は、オーディオ入力を切り替えるには、私の試みを投稿します:

func addAudioInput() { 
    self.sessionQueue.async { [unowned self] in 
     self.captureSession.beginConfiguration() 
     let microphone = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeAudio) 
     if let audioInput = try? AVCaptureDeviceInput(device: microphone), self.captureSession.canAddInput(audioInput) { 
      self.captureSession.addInput(audioInput) 
     } 
     self.captureSession.commitConfiguration() 
    } 
} 

func removeAudioInput() { 
    self.sessionQueue.async { [unowned self] in 
     if let audioInput = self.captureSession.inputs.first(where: { ($0 as? AVCaptureDeviceInput)?.device.deviceType == .builtInMicrophone }) as? AVCaptureDeviceInput { 
      self.captureSession.beginConfiguration() 
      self.captureSession.removeInput(audioInput) 
      self.captureSession.commitConfiguration() 
     } 
    } 
} 

答えて

1

短時間で解決策を見つけられないほどの気分になります。そこで、ビデオキャプチャ(セッション1)とオーディオキャプチャ(セッション2)の2つを作成するという解決策がありました。セッション1は常に実行され、プレビューレイヤーを提供します。セッション2は、録画がすぐに開始および停止されたときにのみ開始されます。どちらのセッションも対応するAVCaptureOutputを持ち、両方ともデータバッファを同じデリゲートに出力し、同じデリゲートはAVAssetWriterを使用してビデオファイルに書き込みます。それで全部です。

+0

コードサンプルがある場合は答えを更新してください –

関連する問題