2017-09-15 17 views
8

이 질문을보고 나면 : AVAudioSession AVAudioSessionCategoryPlayAndRecord glitch, 배경 음악이 제대로 재생되는 비디오 녹화를 시도하는 중 찔 렸습니다. 녹음이 시작될 때 오디오 결함에 대해 정착하고 있습니다. 녹음이 끝나면 처음 녹음이 시작될 때 제대로 작동합니다. 하지만 다시 녹음하려고하면 음악이 멈 춥니 다.AVCaptureSession 및 AVAudioSession은 배경 음악 재생 중 비디오를 한 번만 재생합니다.

왜 그런가?

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 설정을 수행합니다.

또한 AudioGeneration을 PlayAndRecord로 설정하기 전에 audioSession.SetActive (false)를 수행합니다. 어쩌면 녹음을 시작/정지 할 때 이것을 시도해야합니다.

벤와

2

이 당신의 AVAudioSession과 관련이있다 나에게 보인다. 녹음을 중지 할 때는 audioSession을 비활성으로 설정하지 마십시오. 새로운 녹음을 시작할 때 AVAudioSession 카테고리를 변경하면 즉각적인 경로 변경이 발생합니다.

녹음을 중지 할 때 AVAudioSession을 비활성으로 설정해보십시오.

다른 AVAudioSession 카테고리는 AirPlay에 미치는 영향이 다릅니다.

반입

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

"AVAudioSessionCategoryPlayAndRecord는 에어 플레이의 미러 변형 지원 오디오 세션 카테고리"및

"오디오 세션 재생 전용 카테고리 (AVAudioSessionCategoryAmbient, AVAudioSessionCategorySoloAmbient로부터 AVAudioSessionCategoryPlayback)은 AirPlay의 미러링 된 버전과 미러링되지 않은 버전을 모두 지원합니다. "

AVAudioSession을 제어하는 ​​것 자체가 때로는 잘 고려해야 할 필요가 있기 때문에 Apple 문서에서는 AVAudioSession에 대한 약간의 읽기를 권장합니다.

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