我可以使用下面的代码捕获视频。在我的任务中,我需要连续捕获视频,但我需要每5秒保存一次outputFileURL。前5秒它工作正常,但没有连续循环。有谁能指导我完成这项任务吗?
func VideoCaptureMethod() {
//self.cameraView = self.view
// self.cameraManager.resumeCaptureSession()
let devices = AVCaptureDevice.devices(for: AVMediaType.video)
for device in devices {
if (device as AnyObject).position == AVCaptureDevice.Position.back{
do{
let input = try AVCaptureDeviceInput(device: device )
if captureSession.canAddInput(input){
captureSession.addInput(input)
sessionOutput.outputSettings = [AVVideoCodecKey : AVVideoCodecJPEG]
if captureSession.canAddOutput(sessionOutput){
captureSession.addOutput(sessionOutput)
previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
previewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
previewLayer.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
cameraView.layer.addSublayer(previewLayer)
previewLayer.position = CGPoint(x: self.cameraView.frame.width / 2, y: self.cameraView.frame.height / 2)
previewLayer.bounds = cameraView.frame
}
captureSession.addOutput(movieOutput)
captureSession.startRunning()
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let fileUrl = paths[0].appendingPathComponent("output.mov")
try? FileManager.default.removeItem(at: fileUrl)
movieOutput.startRecording(to: fileUrl, recordingDelegate: self)
let delayTime = DispatchTime.now() + 5
DispatchQueue.main.asyncAfter(deadline: delayTime) {
print("stopping")
self.movieOutput.stopRecording()
}
}
}
catch{
print("Error")
}
}
}
}
func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {
print(outputFileURL)
self.VideoCaptureMethod()
}
最佳答案
下面是代码示例:
import UIKit
import AVFoundation
class ViewController: UIViewController, AVCaptureFileOutputRecordingDelegate
{
var captureSession = AVCaptureSession()
var sessionOutput = AVCaptureStillImageOutput()
var movieOutput = AVCaptureMovieFileOutput()
var previewLayer = AVCaptureVideoPreviewLayer()
var timer = Timer()
@IBOutlet var cameraView: UIView!
override func viewWillAppear(_ animated: Bool) {
self.cameraView = self.view
let session = AVCaptureDevice.DiscoverySession.init(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaType.video, position: .back)
let devices = session.devices
guard let audioDevice = AVCaptureDevice.default(for: .audio) else { return }
for device in devices
{
if device.position == AVCaptureDevice.Position.back
{
do{
let input = try AVCaptureDeviceInput(device: device )
let audioDeviceInput = try AVCaptureDeviceInput(device: audioDevice)
if captureSession.canAddInput(input){
captureSession.addInput(input)
captureSession.addInput(audioDeviceInput)
sessionOutput.outputSettings = [AVVideoCodecKey : AVVideoCodecType.jpeg]
if captureSession.canAddOutput(sessionOutput)
{
captureSession.addOutput(sessionOutput)
previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
previewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
previewLayer.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
cameraView.layer.addSublayer(previewLayer)
previewLayer.position = CGPoint(x: self.cameraView.frame.width / 2, y: self.cameraView.frame.height / 2)
previewLayer.bounds = cameraView.frame
}
captureSession.addOutput(movieOutput)
captureSession.startRunning()
self.handleCaptureSession()
}
}
catch{
print("Error")
}
}
}
}
func handleCaptureSession()
{
print("-----------Starting-----------")
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let dateFormatter : DateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MMM-dd HH:mm:ss"
let date = Date()
let dateString = dateFormatter.string(from: date)
let fileName = dateString + "output.mov"
let fileUrl = paths[0].appendingPathComponent(fileName)
try? FileManager.default.removeItem(at: fileUrl)
self.movieOutput.startRecording(to: fileUrl, recordingDelegate: self)
DispatchQueue.main.asyncAfter(deadline: .now() + 5.0, execute:
{
print("-----------Stopping-----------")
self.movieOutput.stopRecording()
})
}
func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {
print("FINISHED \(error )")
// save video to camera roll
if error == nil {
print("---------------FilePath--------------\(outputFileURL.path)")
UISaveVideoAtPathToSavedPhotosAlbum(outputFileURL.path, nil, nil, nil)
self.handleCaptureSession()
}
}
}