首页 > 解决方案 > 如何缩放使用 AVMutableVideoComposition 渲染的视频以使其全屏显示

问题描述

我正在使用AVAssetExportSession导出具有四个不同图层的视频。三层没有问题,但第四层包含视频。当分辨率较高时,例如当我从 iPad Pro 录制视频时,它会缩放到全屏,但当分辨率较低时(当我使用 iPad 第 8 代的前置摄像头时),它会缩小。

我认为这个问题是因为较低分辨率的视频。以红色突出显示缩小的视频。

在此处输入图像描述

我的问题是如果分辨率低于输出视频,如何将视频缩放到全屏。我设置了renderSizeofAVMutableVideoComposition但没有效果。是否有任何属性可以CALayerAVMutableVideoComposition其缩放到全屏?

我已经尝试了一些替代方案和这个答案,但还没有运气。

在此处发布代码以获取更多详细信息:-

    // settings.frameSize is = (x: 0, y = 0, width: 1920, height: 1080)

    // Main Output layer
    let outputLayer = CALayer()
    outputLayer.frame = settings.frameSize
    
    // Add Video Layer
    let videoLayer = CALayer()
    videoLayer.frame = CGRect(
      x: 20,
      y: 20,
      width: settings.frameSize.width - 40 ,
      height: settings.frameSize.height - 40)

    outputLayer.addSublayer(videoLayer)
    
    // Add Canvas Overlay
    let canvasImage = settings.canvasView
    let canvasOverlay = CALayer()
    canvasOverlay.frame = videoLayer.frame
    canvasOverlay.contents = canvasImage.cgImage
    outputLayer.addSublayer(canvasOverlay)
    
    // Add Frame Layer
    let frameImage = settings.storyFrame
    let frameLayer = CALayer()
    frameLayer.frame = settings.frameSize
    frameLayer.contents = frameImage.cgImage
    outputLayer.addSublayer(frameLayer)
    
    // Add Author Layer
    let authorImage = settings.authorAndSubtitleView
    let autoherLayer = CALayer()
    autoherLayer.frame = settings.frameSize
    autoherLayer.contents = authorImage.cgImage
    outputLayer.addSublayer(autoherLayer)
            
    let frameWidth = settings.frameSize.width
    let frameHeight = settings.frameSize.height
    let videoComposition = AVMutableVideoComposition()
    videoComposition.renderSize = CGSize(width: frameWidth, height: frameHeight)
    videoComposition.frameDuration = CMTime(value: 1, timescale: 60)
    videoComposition.animationTool = AVVideoCompositionCoreAnimationTool(
      postProcessingAsVideoLayer: videoLayer,
      in: outputLayer)
    
    let instruction = AVMutableVideoCompositionInstruction()
    instruction.timeRange = CMTimeRange(
      start: CMTime.zero,
      duration: composition.duration)
    videoComposition.instructions = [instruction]
    let layerInstruction = compositionLayerInstruction(
      for: compositionTrack,
      assetTrack: assetTrack)
    instruction.layerInstructions = [layerInstruction]
    
    var quality = AVAssetExportPresetHighestQuality
    
    if #available(iOS 13, *) {
        quality = AVAssetExportPresetHEVCHighestQualityWithAlpha
    }
    
    guard let export = AVAssetExportSession(
      asset: composition,
      presetName: quality)
      else {
        print("Cannot create export session.")
        onComplete(nil)
        return
    }
    
    let videoName = UUID().uuidString
    let exportURL = URL(fileURLWithPath: NSTemporaryDirectory())
      .appendingPathComponent(videoName)
      .appendingPathExtension("mov")
    
    export.videoComposition = videoComposition
    export.outputFileType = .mov
    export.outputURL = exportURL
    
    export.exportAsynchronously {
        switch export.status {
        case .completed:
          onComplete(exportURL)
        default:
          print("Something went wrong during export.")
          print(export.error ?? "unknown error")
          onComplete(nil)
          break
        }
    }

标签: iosswiftxcodeavkitavmutablevideocomposition

解决方案


推荐阅读