определить URL-адрес видео в качестве uiview в вашем классе - PullRequest
1 голос
/ 11 января 2020

Мой быстрый код должен быть в состоянии сделать снимок видео, а затем сделать это изображение и отобразить в виде uiimageview. Вместо того, чтобы использовать онлайн-ссылку, я просто хочу, чтобы URL был uiview в моем классе. Так что URL-адрес видео должен быть previewView, а не ссылка https, которую я имею ниже. Весь код ниже в этом классе

   import UIKit;import AVFoundation



class ViewController: UIViewController, AVCapturePhotoCaptureDelegate {



@IBOutlet var previewView : UIView!

@IBOutlet var captureImageView : UIImageView!

var captureSession: AVCaptureSession!
var stillImageOutput: AVCapturePhotoOutput!
var videoPreviewLayer: AVCaptureVideoPreviewLayer!

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    // Setup your camera here...
    captureSession = AVCaptureSession()
    captureSession.sessionPreset = .medium


    guard let backCamera = AVCaptureDevice.default(for: AVMediaType.video)
        else {
            print("Unable to access back camera!")
            return
    }

    do {
        let input = try AVCaptureDeviceInput(device: backCamera)
        //Step 9
        stillImageOutput = AVCapturePhotoOutput()
        stillImageOutput = AVCapturePhotoOutput()

        if captureSession.canAddInput(input) && captureSession.canAddOutput(stillImageOutput) {
            captureSession.addInput(input)
            captureSession.addOutput(stillImageOutput)
            setupLivePreview()
        }
    }
    catch let error  {
        print("Error Unable to initialize back camera:  \(error.localizedDescription)")
    }
}

func setupLivePreview() {

    videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)

    videoPreviewLayer.videoGravity = .resizeAspect
    videoPreviewLayer.connection?.videoOrientation = .portrait
    previewView.layer.addSublayer(videoPreviewLayer)

    //Step12
    DispatchQueue.global(qos: .userInitiated).async { //[weak self] in
        self.captureSession.startRunning()
        //Step 13
        DispatchQueue.main.async {
            self.videoPreviewLayer.frame = self.previewView.bounds
        }
    }


}
@IBAction func startRecord(_ sender: Any) {

}
@IBAction func Save(_ sender: Any) {
    //what do I put in the 2 highlighted blocks
    let videoURL = "https://www.youtube.com/watch?v=Txt25dw-lIk"



    self.getThumbnailFromUrl(videoURL) { [weak self] (img) in

        guard let _ = self else { return }

        if let img = img {

            self?.captureImageView.image = img

        }

    }
}

func getThumbnailFromUrl(_ url: String?, _ completion: @escaping ((_ image: UIImage?)->Void)) {

    guard let url = URL(string: url ?? "") else { return }
    DispatchQueue.main.async {
        let asset = AVAsset(url: url)
        let assetImgGenerate = AVAssetImageGenerator(asset: asset)
        assetImgGenerate.appliesPreferredTrackTransform = true

        let time = CMTimeMake(value: 2, timescale: 1)
        do {
            let img = try assetImgGenerate.copyCGImage(at: time, actualTime: nil)
            let thumbnail = UIImage(cgImage: img)
            completion(thumbnail)
        } catch {
            print("Error :: ", error.localizedDescription)
            completion(nil)
        }
    }
}
@IBAction func didTakePhoto(_ sender: Any) {

    let settings = AVCapturePhotoSettings(format: [AVVideoCodecKey: AVVideoCodecType.jpeg])
    stillImageOutput.capturePhoto(with: settings, delegate: self)
}

func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {

    guard let imageData = photo.fileDataRepresentation()
        else { return }

    let image = UIImage(data: imageData)
    captureImageView.image = image
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    self.captureSession.stopRunning()
}



}
...