2017-09-15 10 views
8

AVAudioSession AVAudioSessionCategoryPlayAndRecord glitchこの質問を見ると、バックグラウンドミュージックを正しく再生してビデオ録画をしようとしました。私は、録音が始まると、オーディオの不具合が解決し、録音が終了すると、録音が​​初めて行われたときにうまく動作します。しかし、もう一度録音しようとすると、音楽は止まります。AVCaptureSessionとAVAudioSessionは、バックグラウンドミュージックが1回しか再生されない間にビデオを録画します。

なぜでしょうか?ここで

は、私のコードの抜粋です:

let audioSession = AVAudioSession.sharedInstance() 
    try! audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, 
                with: [.mixWithOthers, .allowBluetoothA2DP, .allowAirPlay]) 
    try! audioSession.setActive(true) 
    captureSession?.beginConfiguration() 
    if (captureSession?.canAddInput(audioDeviceInput!))! { 
     captureSession?.addInput(audioDeviceInput!) 
    } 
    captureSession?.commitConfiguration() 

と録音を停止するには:

captureSession = AVCaptureSession() 
    captureSession?.automaticallyConfiguresApplicationAudioSession = false 
    captureSession?.usesApplicationAudioSession = true 

    guard let captureSession = self.captureSession else { 
     print("Error making capture session") 
     return; 
    } 

    captureSession.sessionPreset = AVCaptureSessionPresetHigh 

    self.camera = self.defaultBackCamera() 
    self.audioDeviceInput = try? AVCaptureDeviceInput(device: getAudioDevice()) 

    cameraInput = try AVCaptureDeviceInput(device: camera) 
    captureSession.beginConfiguration() 
    if captureSession.inputs.count > 0 { 
     return 
    } 
    if captureSession.canAddInput(cameraInput) { 
     captureSession.addInput(cameraInput) 
     if captureSession.outputs.count == 0 { 
      photoOutput = AVCapturePhotoOutput() 
      if captureSession.canAddOutput(photoOutput!) { 
       captureSession.addOutput(self.photoOutput!) 
      } 
    } 
    captureSession.commitConfiguration() 
    if !captureSession.isRunning { 
     captureSession.startRunning() 
     self.previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
     self.previewLayer!.videoGravity = AVLayerVideoGravityResizeAspect 
     self.previewLayer!.connection.videoOrientation = .portrait 
     self.previewLayer!.frame = cameraView.layer.bounds 
     self.cameraView.layer.addSublayer(self.previewLayer!) 
     captureSession.beginConfiguration() 
     videoFileOut = AVCaptureMovieFileOutput() 
     if (captureSession.canAddOutput(videoFileOut)) { 
      captureSession.addOutput(videoFileOut) 
      if (videoFileOut?.connection(withMediaType: AVMediaTypeVideo).isVideoStabilizationSupported)! { 
       videoFileOut?.connection(withMediaType: AVMediaTypeVideo).preferredVideoStabilizationMode = .cinematic 
      } 
     } 
     captureSession.commitConfiguration() 
    } 

これは、録画を開始するためのコードです

let audioSession = AVAudioSession.sharedInstance() 
    try! audioSession.setCategory(AVAudioSessionCategoryAmbient, with: [.mixWithOthers, .allowAirPlay]) 

    captureSession?.beginConfiguration() 
    captureSession?.removeInput(audioDeviceInput) 
    captureSession?.commitConfiguration() 
+0

実行可能なコードスニペットをリンクできますか? –

+0

あなたはどのように音楽を演奏していますか?私は 'AVAudioEngine'を使用し、あなたのコードはそれでうまくいきました。 –

答えて

2

私が働いていますほぼ同じことをしなければならないプロジェクト:バックグラウンドでオーディオを再生するビデオを録画する。 (Xamarinで)

私のコードでは、私はonViewLoadでAudioSessionの設定を行います。

また、PlayAndRecordにカテゴリーを設定する前に、audioSession.SetActive(false)を実行します。録音を開始/停止するときにこれを試してください。

ブノワ

2

あなたのAVAudioSessionに関係しているように思えます。録音を停止するときに、audioSessionを非アクティブに設定しないでください。新しい録画を開始するときにAVAudioSessionカテゴリを変更すると、すぐにルートが変更されます。

録音を停止するときにAVAudioSessionを非アクティブに設定してみてください。

また、異なるAVAudioSessionカテゴリは、AirPlayに異なる影響を与えます。

https://developer.apple.com/documentation/avfoundation/avaudiosession/audio_session_categories

からフェッチされ、

オーディオセッションの再生専用カテゴリー(AVAudioSessionCategoryAmbient、AVAudioSessionCategorySoloAmbient "オーディオセッションカテゴリAVAudioSessionCategoryPlayAndRecordは唯一のAirPlayのミラーリングされたバリアントをサポートしています" と、 AVAudioSessionCategoryPlayback)は、AirPlayのミラーリングされたバリアントとミラーリングされていないバリアントの両方をサポートします。 "

AVAudioSessionを少し読んでみることをお勧めします。これは、AVAudioSession自体を制御するだけで、時には本当によく考えなければならないことがあります。

https://developer.apple.com/documentation/avfoundation/avaudiosession

関連する問題