2017-09-15 15 views
8

Po obejrzeniu tego pytania: AVAudioSession AVAudioSessionCategoryPlayAndRecord glitch, starałem się podjąć próbę uzyskania nagrania wideo z muzyką w tle działa poprawnie. Rozgrywka dobiegła końca, kiedy zaczyna się nagrywanie, a kiedy się kończy, i działa dobrze po raz pierwszy nagrywanie się dzieje. Ale jeśli spróbuję nagrać ponownie, muzyka się skończy.AVCaptureSession i AVAudioSession nagrywanie wideo podczas odtwarzania muzyki w tle działa tylko raz

Jakieś pomysły, dlaczego?

Oto fragment mojego kodu:

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() 
    } 

Jest to kod, aby rozpocząć nagrywanie:

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() 

i zatrzymać nagrywanie:

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

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

Czy masz fragment kodu runnable można połączyć? –

+0

Jak grasz w muzykę? Użyłem "AVAudioEngine" i twój kod działał dobrze z tym. –

Odpowiedz

2

pracuję nad projekt, w którym muszę wykonać prawie to samo: nagraj wideo z odtwarzaniem dźwięku tła. (w Xamarin)

W moim kodzie wykonuję instalację AudioSession w onViewLoad.

Wykonuję również audioSession.SetActive (false) przed ustawieniem catogory na PlayAndRecord. Może powinieneś spróbować tego przy rozpoczynaniu/kończeniu nagrywania.

Benoit

2

Wydaje mi się, że ma to związek z AVAudioSession. Nie ustawiasz audioSession na nieaktywny, gdy zatrzymujesz nagrywanie. Powoduje to natychmiastową zmianę trasy po zmianie kategorii AVAudioSession podczas rozpoczynania nowego nagrania.

Spróbuj wyłączyć ustawienie AVAudioSession podczas zatrzymywania nagrywania.

Także różne kategorie AVAudioSession mają różny wpływ na AirPlay.

pobierane z

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

"Dźwięk kategoria sesja AVAudioSessionCategoryPlayAndRecord obsługuje tylko lustrzany wariant AirPlay" i

"sesji Odtwarzanie audio tylko do kategorii (AVAudioSessionCategoryAmbient, AVAudioSessionCategorySoloAmbient i AVAudioSessionCategoryPlayback) obsługuje zarówno dublowane, jak i nie dublowane warianty AirPlay: "

Polecam trochę czytania na temat AVAudioSession w dokumentach Apple, ponieważ samo kontrolowanie samego AVAudioSession musi być naprawdę dobrze przemyślane.

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

Powiązane problemy