簡體   English   中英

攝像頭打開時自動開始錄像?

[英]Video recording start automatically when camera Open?

我已經閱讀了很多視頻播放器的教程。 但是如何在有時間限制的自定義視圖中打開相機時開始錄制。

這是快速版本的工作解決方案

var session: AVCaptureSession?
var userreponsevideoData = NSData()
var userreponsethumbimageData = NSData()

override func viewDidLoad() {
    super.viewDidLoad()
     createSession()
}

func for stopRecording(){
  session?.stopRunning()
}

func createSession() {

var input: AVCaptureDeviceInput?
let  movieFileOutput = AVCaptureMovieFileOutput()
videosPreviewLayer?.frame.size = photoPreviewImageView.frame.size
session = AVCaptureSession()
let error: NSError? = nil
do { input = try AVCaptureDeviceInput(device: self.cameraWithPosition(position: .back)!) } catch {return}
if error == nil {
    session?.addInput(input!)
} else {
    print("camera input error: \(String(describing: error))")
}
videosPreviewLayer = AVCaptureVideoPreviewLayer(session: session!)
videosPreviewLayer?.frame.size = self.photoPreviewImageView.frame.size
videosPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
videosPreviewLayer?.connection?.videoOrientation = .portrait
photoPreviewImageView.layer.sublayers?.forEach { $0.removeFromSuperlayer() }
photoPreviewImageView.layer.addSublayer(videosPreviewLayer!)

switchCameraButton.isHidden=true
flashButton.isHidden=true
msgLabel.isHidden=true
galleryCollectionView.isHidden=true
timerLabel.isHidden=false

let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
fileURL = URL(string:"\(documentsURL.appendingPathComponent("temp"))" + ".mov")
print("*****fileurl%@",fileURL ?? "00000")

let maxDuration: CMTime = CMTimeMake(600, 10)
movieFileOutput.maxRecordedDuration = maxDuration
movieFileOutput.minFreeDiskSpaceLimit = 1024 * 1024
if self.session!.canAddOutput(movieFileOutput) {
    self.session!.addOutput(movieFileOutput)
}
session?.startRunning()
movieFileOutput.startRecording(to: fileURL!, recordingDelegate: self)
}

func cameraWithPosition(position: AVCaptureDevice.Position) -> AVCaptureDevice? {
let devices = AVCaptureDevice.devices(for: AVMediaType.video)
for device in devices {
    if device.position == position {
        return device
    }
}
return nil
}
}
extension SwipeGallerymainViewController: AVCaptureFileOutputRecordingDelegate
{

func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {
print(outputFileURL)
let filemainurl = outputFileURL

do
{
    let asset = AVURLAsset(url:filemainurl as URL, options:nil)
    print(asset)
    let imgGenerator = AVAssetImageGenerator(asset: asset)
    imgGenerator.appliesPreferredTrackTransform = true
    let cgImage = try imgGenerator.copyCGImage(at: CMTimeMake(0, 1), actualTime: nil)
    let uiImage = UIImage(cgImage: cgImage)
    previewImage = uiImage
    userreponsethumbimageData = NSData(contentsOf: filemainurl as URL)!
    print(userreponsethumbimageData.length)
    print(uiImage)

}
catch let error as NSError
{
    print(error)
    return
}
let VideoFilePath = URL(fileURLWithPath:NSTemporaryDirectory()).appendingPathComponent("mergeVideo\(arc4random()%1000)d").appendingPathExtension("mp4").absoluteString
if FileManager.default.fileExists(atPath: VideoFilePath)
{
    print("exist")
    do
    {
        try FileManager.default.removeItem(atPath: VideoFilePath)
    }
    catch { }
}

let tempfilemainurl =  NSURL(string: VideoFilePath)!
let sourceAsset = AVURLAsset(url:filemainurl as URL, options:nil)
let assetExport: AVAssetExportSession = AVAssetExportSession(asset: sourceAsset, presetName: AVAssetExportPresetMediumQuality)!
assetExport.outputFileType = AVFileType.mov
assetExport.outputURL = tempfilemainurl as URL
assetExport.exportAsynchronously { () -> Void in
    switch assetExport.status
    {
    case AVAssetExportSessionStatus.completed:
        DispatchQueue.main.async {
            do
            {

                self.userreponsevideoData = try NSData(contentsOf: tempfilemainurl as URL, options: NSData.ReadingOptions())
                print("MB - \(self.userreponsevideoData.length) byte")
                self.isVideoLoad=true
                self.performSegue(withIdentifier:"previewSegue", sender:self)
            }
            catch
            {

                print(error)
            }
        }

    case  AVAssetExportSessionStatus.failed:
        print("failed \(String(describing: assetExport.error))")
    case AVAssetExportSessionStatus.cancelled:
        print("cancelled \(String(describing: assetExport.error))")
    default:
        print("complete")

    }

}
}

 func captureOutput(captureOutput: AVCaptureFileOutput!, didStartRecordingToOutputFileAtURL fileURL: NSURL!, fromConnections connections: [AnyObject]!) {
print(fileURL)
}


}

我在筆記本電腦上使用 Robot 類在 java 中做了同樣的事情。 Robot 類能夠自動發送擊鍵和鼠標移動。 你可以在你的平台上嘗試同樣的事情。 自動化按鈕按下事件,以便開始錄制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM