Наклейка и текст, растянутые на видео

#ios #swift

#iOS #swift

Вопрос:

Я добавляю наклейку и текст на видео. При сохранении видео отображается правильно, но текст и наклейка отображаются растянутыми, я прикрепил скриншот.

 func convertVideoAndSaveTophotoLibrary(videoURL: URL) {
    let documentsDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
    let myDocumentPath = URL(fileURLWithPath: documentsDirectory).appendingPathComponent("temp.mp4").absoluteString
    _ = NSURL(fileURLWithPath: myDocumentPath)
    let documentsDirectory2 = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as URL
    let filePath = documentsDirectory2.appendingPathComponent("video.mp4")
    deleteFile(filePath: filePath as NSURL)

    //Check if the file already exists then remove the previous file
    if FileManager.default.fileExists(atPath: myDocumentPath) {
        do { try FileManager.default.removeItem(atPath: myDocumentPath)
        } catch let error { print(error) }
    }

    // File to composit
    let asset = AVURLAsset(url: videoURL as URL)
    let composition = AVMutableComposition.init()
    composition.addMutableTrack(withMediaType: AVMediaType.video, preferredTrackID: kCMPersistentTrackID_Invalid)

    let clipVideoTrack = asset.tracks(withMediaType: AVMediaType.video)[0]


    // Rotate to potrait
    let transformer = AVMutableVideoCompositionLayerInstruction(assetTrack: clipVideoTrack)

   
    let videoTransform:CGAffineTransform = clipVideoTrack.preferredTransform



    //fix orientation
    var videoAssetOrientation_  = UIImage.Orientation.up
    
    var isVideoAssetPortrait_  = false
    
    if videoTransform.a == 0 amp;amp; videoTransform.b == 1.0 amp;amp; videoTransform.c == -1.0 amp;amp; videoTransform.d == 0 {
        videoAssetOrientation_ = UIImage.Orientation.right
        isVideoAssetPortrait_ = true
    }
    if videoTransform.a == 0 amp;amp; videoTransform.b == -1.0 amp;amp; videoTransform.c == 1.0 amp;amp; videoTransform.d == 0 {
        videoAssetOrientation_ =  UIImage.Orientation.left
        isVideoAssetPortrait_ = true
    }
    if videoTransform.a == 1.0 amp;amp; videoTransform.b == 0 amp;amp; videoTransform.c == 0 amp;amp; videoTransform.d == 1.0 {
        videoAssetOrientation_ =  UIImage.Orientation.up
    }
    if videoTransform.a == -1.0 amp;amp; videoTransform.b == 0 amp;amp; videoTransform.c == 0 amp;amp; videoTransform.d == -1.0 {
        videoAssetOrientation_ = UIImage.Orientation.down;
    }
    

    transformer.setTransform(clipVideoTrack.preferredTransform, at: CMTime.zero)
    transformer.setOpacity(0.0, at: asset.duration)

    
    //adjust the render size if neccessary
    var naturalSize: CGSize
    if(isVideoAssetPortrait_){
        
        print("its portrait")
        naturalSize = CGSize(width: clipVideoTrack.naturalSize.height, height: clipVideoTrack.naturalSize.width)
    } else {
        
        print("its landscape")
        naturalSize = clipVideoTrack.naturalSize;
    }
    
 
    var renderWidth: CGFloat!
    var renderHeight: CGFloat!

    renderWidth = naturalSize.width
    renderHeight = naturalSize.height

    let parentlayer = CALayer()
    let videoLayer = CALayer()
    let watermarkLayer = CALayer()


    let videoComposition = AVMutableVideoComposition()
    videoComposition.renderSize = CGSize(width: renderWidth, height: renderHeight)
    videoComposition.frameDuration = CMTimeMake(value: 1, timescale: 30)
    videoComposition.renderScale = 1.0
    

    watermarkLayer.contents = tempImageView.asImage().cgImage

   
    parentlayer.frame = CGRect(origin: CGPoint(x: 0, y: 0), size: naturalSize)
    videoLayer.frame = CGRect(origin: CGPoint(x: 0, y: 0), size: naturalSize)
    watermarkLayer.frame = CGRect(origin: CGPoint(x: 0, y: 0), size: naturalSize)

    parentlayer.addSublayer(videoLayer)
    
    print("parent layer frame --%@",parentlayer.frame)
    print("videoLayer frame --%@",videoLayer.frame)
    print("watermarkLayer.frame frame --%@",watermarkLayer.frame)
    
    parentlayer.addSublayer(watermarkLayer)

  parent layer frame --%@ (0.0, 0.0, 568.0, 320.0)
  videoLayer frame --%@ (0.0, 0.0, 568.0, 320.0)
   watermarkLayer.frame frame --%@ (0.0, 0.0, 568.0, 320.0)
  

tempImageView — это ImageView, в который я добавляю изображение и текст.

 tempImageView.frame = CGRect(x: 0, y: 0, width:self.view.frame.size.width, height: self.view.frame.size.height)
  

введите описание изображения здесь

Комментарии:

1. может быть, вы установили размер изображения таким же, как размер видео, чтобы он был растянутым, попробуйте исправить размер, он работает, watermarkLayer.contents = tempImageView.asImage().CGImage

2. @Dhawal Я пробовал оба варианта, но это та же проблема watermarkLayer.frame = CGRect(источник: CGPoint (x: 0, y: 0), размер: CGSize(ширина: tempImageView.frame.size.width, высота: tempImageView.frame.size.height)) watermarkLayer.frame = CGRect (источник: CGPoint (x: 0, y: 0), размер: CGSize(ширина: naturalSize.height, высота: naturalSize.width) )

3. попробуйте исправить размер, подобный этому watermarkLayer.frame = CGRect(источник: CGPoint (x: 0, y: 0), размер: CGSize (ширина: 50, высота: 50))

4. @Dhawal Я уже пытаюсь, спасибо, слой водяных знаков находится на уровне выше слоя видео

Ответ №1:

Попробуйте:

 let watermarkLayer = CALayer()
watermarkLayer.contents = someView.getImage().cgImage
watermarkLayer.contentsGravity = .resizeAspectFill
watermarkLayer.frame = CGRect(origin: .zero, size: videoSize)
parentlayer.addSublayer(watermarkLayer)
  

Или попытаться использовать его:
https://github.com/vabe1337/VBVideoEditor