【问题标题】:Resize video and keeping 1:1 scale调整视频大小并保持 1:1 比例
【发布时间】:2016-09-04 20:29:37
【问题描述】:

我有一个 800x800 的视频,我想将此视频转换为 375x375。

它应该看起来像这样:

但最终的结果是:

我做错了什么?

我的代码:

  let mixComposition = AVMutableComposition()

  // 2 - Create video tracks
  let compositionVideoTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: Int32(kCMPersistentTrackID_Invalid))
  let clipVideoTrack = videoAsset.tracksWithMediaType(AVMediaTypeVideo)[0]

  do {
      try compositionVideoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), ofTrack: clipVideoTrack, atTime: kCMTimeZero)
  } catch _ {

  }
  clipVideoTrack.preferredTransform

  // Video size
  let videoSize = clipVideoTrack.naturalSize
  let scale = imageLayer.frame.size.width / videoSize.width
  let scaledSize = CGSizeMake(videoSize.width * scale, videoSize.height * scale)
  let transform = CGAffineTransformMakeScale(scale, scale)

  // sorts the layer in proper order and add title layer
  let parentLayer = CALayer()
  let videoLayer = CALayer()
  parentLayer.frame = CGRectMake(0, 0, imageLayer.frame.size.width, imageLayer.frame.size.height)
  videoLayer.frame = CGRectMake(0, 0, imageLayer.frame.size.width, imageLayer.frame.size.height)
  parentLayer.addSublayer(videoLayer)
  parentLayer.addSublayer(imageLayer)

  let videoComp = AVMutableVideoComposition()
  videoComp.renderSize = scaledSize
  videoComp.frameDuration = CMTimeMake(1, 30)
  videoComp.animationTool = AVVideoCompositionCoreAnimationTool(postProcessingAsVideoLayer: videoLayer, inLayer: parentLayer)

  /// instruction
  let instruction = AVMutableVideoCompositionInstruction()
  instruction.timeRange = CMTimeRangeMake(kCMTimeZero, mixComposition.duration)
  //let videoTrack = mixComposition.tracksWithMediaType(AVMediaTypeVideo)[0]

  //let layerInstruction = self.videoCompositionInstructionForTrack(compositionVideoTrack, asset: videoAsset)

  let layerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: clipVideoTrack)
  layerInstruction.setTransform(transform, atTime: kCMTimeZero)

  instruction.layerInstructions = [layerInstruction]
  videoComp.instructions = [instruction]

【问题讨论】:

    标签: ios swift core-graphics calayer avvideocomposition


    【解决方案1】:

    这是由于计算之间的细微差别

    let scaledSize = CGSizeMake(videoSize.width * scale, videoSize.height * scale)
    let transform = CGAffineTransformMakeScale(scale, scale)
    

    解决方法是将缩放后的尺寸减小 2 px

    let scaledSize = CGSizeMake(videoSize.width * scale - 2, videoSize.height * scale - 2)
    let transform = CGAffineTransformMakeScale(scale, scale)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-01
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-14
      相关资源
      最近更新 更多