Невозможно воспроизвести URL-адрес, заданный функцией AVCaptureFileOutputRecordingDelegate - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь создать приложение в стиле Snapchat, где пользователь может снять видео, удерживая нажатой кнопку.Тем не менее, когда пользователь завершает съемку видео, а делегат вызывает fileOutput, данный URL outputFileURL не может быть воспроизведен с использованием AVPlayer.Я знаю, что видео действительно было записано, потому что я могу загрузить файл в Firebase и скачать его оттуда.

Вот мой код для функции fileOutput:

func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {
    if error == nil {
        videoURL = outputFileURL
        flipHiddenViews()

        // playback video
        player = AVPlayer(url: outputFileURL)
        playerLayer = AVPlayerLayer(player: player)
        playerLayer?.frame = self.view.bounds
        self.view.layer.addSublayer(playerLayer!)
        player?.play()
    } else {
        print(error?.localizedDescription)
    }

}

Вот как я инициализирую кнопку, удерживаемую пользователем:

let photoButton:UIButton = {
    let but = UIButton(type: .custom)
    but.layer.cornerRadius = 40
    but.layer.borderColor = UIColor.white.cgColor
    but.layer.borderWidth = 4
    but.clipsToBounds = true
    but.addTarget(self, action: #selector(takeVideo), for: .touchDown)
    but.addTarget(self, action: #selector(stopVideo), for: [.touchUpInside, .touchUpOutside])
    but.translatesAutoresizingMaskIntoConstraints = false
    return but
}()

Вот takeVideo function:

@objc func takeVideo() {
    let recordingDelegate:AVCaptureFileOutputRecordingDelegate? = self
    if captureSession?.outputs != nil && videoFileOutput != nil {
        captureSession?.removeOutput(videoFileOutput!)
    }
    videoFileOutput = AVCaptureMovieFileOutput()
    self.captureSession?.addOutput(videoFileOutput!)

    let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    let filePath = documentsURL.appendingPathComponent("temp")

    // Do recording and save the output to the `filePath`
    videoFileOutput?.startRecording(to: filePath, recordingDelegate: recordingDelegate!)
}

И, наконец, stopVideo function:

@objc func stopVideo() {
    videoFileOutput?.stopRecording()
}

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Добавление .mov в конце имени "temp" сделало это для меня:

let filePath = documentsURL.appendingPathComponent("temp.mov")
0 голосов
/ 22 мая 2018

Попробуйте вместо этого:

// playback video
player = AVPlayer(url: outputFileURL)
let playerController = AVPlayerViewController()
playerController.player = player
present(playerController, animated: true) {
    player?.play()
}
...