Reputation: 99
I am able to capturing video by using the below code. In My task, I need to capture the video continuously but I need to save outputFileURL of every 5 seconds.First 5 seconds its working fine but continuous looping is not happening.Could any one guide me to do this task?
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()
}
Upvotes: 0
Views: 995
Reputation: 99
func videoPreviewUiimage(fileName:URL) -> UIImage? {
// let filePath = NSString(string: "~/").expandingTildeInPath.appending("/Documents/").appending(fileName)
// let vidURL = NSURL(fileURLWithPath:filePath)
let asset = AVURLAsset(url: fileName as URL)
let generator = AVAssetImageGenerator(asset: asset)
generator.appliesPreferredTrackTransform = true
let timestamp = CMTime(seconds: 2, preferredTimescale: 60)
do {
let imageRef = try generator.copyCGImage(at: timestamp, actualTime: nil)
return UIImage(cgImage: imageRef)
}
catch let error as NSError
{
print("Image generation failed with error \(error)")
return nil
}
}
// For Capturing image while video recording
func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {
print("FINISHED \(String(describing: error ))")
// save video to camera roll
if error == nil {
print("---------------FilePath--------------\(outputFileURL.path)")
UISaveVideoAtPathToSavedPhotosAlbum(outputFileURL.path, nil, nil, nil)
//let asset = AVURLAsset(URL: fileUrl)
print(self.videoPreviewUiimage(fileName: outputFileURL)!)
// self.iconImage.isHidden = true
self.iconImage.image = self.videoPreviewUiimage(fileName: outputFileURL)!
let imageData: Data? = UIImageJPEGRepresentation(self.videoPreviewUiimage(fileName: outputFileURL)!, 0.4)
let imageStr = imageData?.base64EncodedString(options: .lineLength64Characters) ?? ""
// print(strBase64)
print("imageStr\(imageStr)")
// MyAwesomeAlbum.shared.
self.handleCaptureSession()
}
}
Upvotes: 0
Reputation: 988
Here is the code sample :
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()
}
}
}
Upvotes: 2