Ios 相机预览会冻结并停止录制音频(在一次或几次录制后)

Ios 相机预览会冻结并停止录制音频(在一次或几次录制后),ios,swift,camera,avfoundation,avcapturesession,Ios,Swift,Camera,Avfoundation,Avcapturesession,我已经使用iOS-Swift创建了一个定制的相机应用程序。问题是,有时在我用手机录制后,相机预览会冻结。更重要的是,在我录制一次视频后,摄像机也会停止录制音频。我似乎无法理解这是否是内存问题,因为应用程序内存没有显示任何问题。以下是可能出现问题的主要代码片段: func load_camera() { // Load the session capture_session = AVCaptureSession(); capture_ses

我已经使用iOS-Swift创建了一个定制的相机应用程序。问题是,有时在我用手机录制后,相机预览会冻结。更重要的是,在我录制一次视频后,摄像机也会停止录制音频。我似乎无法理解这是否是内存问题,因为应用程序内存没有显示任何问题。以下是可能出现问题的主要代码片段:

    func load_camera() {

        // Load the session
        capture_session = AVCaptureSession();
        capture_session?.beginConfiguration();
        capture_session?.usesApplicationAudioSession = true;
        capture_session?.automaticallyConfiguresApplicationAudioSession = true;
        capture_session?.sessionPreset = AVCaptureSessionPresetHigh
        camera_device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo);
        if(selfie) {
            guard let device = AVCaptureDevice.devices().filter({ $0.position == .Front })
                .first as? AVCaptureDevice else {
                    fatalError("No front facing camera found")
            }
            camera_device = device;
        }
        do {

            // Set up the camera image output
            let input = try AVCaptureDeviceInput(device: camera_device)
            if((capture_session?.canAddInput(input)) != nil) {
                capture_session?.addInput(input);
            }

            // Set up the camera video output
            video_output = AVCaptureMovieFileOutput();
            video_output?.movieFragmentInterval = kCMTimeInvalid;
            video_output?.maxRecordedDuration = CMTime(seconds: 10, preferredTimescale: 1);
            if((capture_session?.canAddOutput(video_output)) != nil) {
                capture_session?.addOutput(video_output);
                preview_layer = AVCaptureVideoPreviewLayer(session: capture_session);
                preview_layer?.videoGravity = AVLayerVideoGravityResizeAspect;
                preview_layer?.connection.videoOrientation = AVCaptureVideoOrientation.Portrait;
                self.camera_view.layer.addSublayer(preview_layer!);
                preview_layer!.frame = self.view.bounds;
            }

            // Set up camera audio output
            let audio_device: AVCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeAudio)
            let audio_input: AVCaptureDeviceInput = try AVCaptureDeviceInput(device: audio_device)
            if((capture_session?.canAddInput(audio_input)) != nil) {
                capture_session?.addInput(audio_input)
            }
            try self.camera_device!.lockForConfiguration()
            self.camera_device!.subjectAreaChangeMonitoringEnabled = true;
            self.camera_device!.unlockForConfiguration()

            // Focus camera when camera moves
            let subjectAreaDidChangeBlock = {(notification: NSNotification) -> Void in
                self.focus_camera();
            }
            NSNotificationCenter.defaultCenter().addObserverForName(AVCaptureDeviceSubjectAreaDidChangeNotification, object: nil, queue: nil, usingBlock: subjectAreaDidChangeBlock)

            // Done
            capture_session?.commitConfiguration();
        } catch _ { }
    }
然后我使用以下代码开始录制:

       // Record
       if let video_connection = self.video_output?.connectionWithMediaType(AVMediaTypeVideo) {

            // Start recording the video
            let recordingDelegate:AVCaptureFileOutputRecordingDelegate = self;
            let documentsURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
            let filePath = documentsURL.URLByAppendingPathComponent("recorded.mov")
            if(selfie) {
                video_connection.automaticallyAdjustsVideoMirroring = false;
                video_connection.videoMirrored = true;
            }

            // Video Orientation
            video_connection.videoOrientation = AVCaptureVideoOrientation.Portrait;
            if(self.orientation == "PortraitUpsideDown") {
                video_connection.videoOrientation = AVCaptureVideoOrientation.PortraitUpsideDown;
            }
            else if(self.orientation == "LandscapeLeft") {
                video_connection.videoOrientation = AVCaptureVideoOrientation.LandscapeRight;
            }
            else if(self.orientation == "LandscapeRight") {
                video_connection.videoOrientation = AVCaptureVideoOrientation.LandscapeLeft;
            }
            video_output!.startRecordingToOutputFileURL(filePath, recordingDelegate: recordingDelegate);
        }
然后,我使用以下代码停止视频录制:

        // Stop recording
        self.video_output!.stopRecording();

        // Stop the camera
        self.capture_session?.stopRunning();
        self.preview_layer?.connection.enabled = false;
        self.capture_session = nil;
我似乎在我的代码中找不到任何问题。有人能告诉我哪里出了问题吗?我是否在录制视频或设置相机时做了一些事情,以便相机预览层开始冻结,音频停止随机录制?我错过了什么

发生了一些奇怪的事情:

  • 如果我将应用程序放在后台并返回,相机会再次解冻/开始录制音频
  • 只有在我第一次录制内容后,摄像机才会停止录制音频
  • 只有在我第一次录制某些内容后,相机才开始冻结预览层,但有时会发生,有时不会
  • 我想知道这是否是一个多线程问题,但我不知道该怎么办

  • 任何帮助都将不胜感激

    你找到解决方案了吗?有更新吗?我也有同样的问题,你有什么解决办法吗?请帮忙!