ios - 如何缩放使用 AVMutableVideoComposition 渲染的视频以使其全屏显示
问题描述
我正在使用AVAssetExportSession导出具有四个不同图层的视频。三层没有问题,但第四层包含视频。当分辨率较高时,例如当我从 iPad Pro 录制视频时,它会缩放到全屏,但当分辨率较低时(当我使用 iPad 第 8 代的前置摄像头时),它会缩小。
我认为这个问题是因为较低分辨率的视频。以红色突出显示缩小的视频。
我的问题是如果分辨率低于输出视频,如何将视频缩放到全屏。我设置了renderSize
ofAVMutableVideoComposition
但没有效果。是否有任何属性可以CALayer
将AVMutableVideoComposition
其缩放到全屏?
我已经尝试了一些替代方案和这个答案,但还没有运气。
在此处发布代码以获取更多详细信息:-
// 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
}
}
解决方案
推荐阅读
- csv - 我们可以在 LOAD CSV(neo4j) 中使用超过 1 行吗?
- function - 任何人都可以帮助理解函数调用中的递归 lambda 表达式和 double () () 语法吗?
- json - 如何在 Postman JSON [FromBody] 中给出文件路径?
- javascript - 遍历 Puppeteer 元素数组并进一步解析每个元素
- angular - 创建类型数组并用角度分配它
- android - 单击 android studio 中的查看购物车按钮后,我的购物车项目再次出现
- oracle - 处理其他模式的源代码中的错误
- settings - Ubuntu 20.04 LTS 中的外观设置损坏
- python - 逐行读取文件会跳过每一行
- flutter - 为什么我的 Flutter BottomSheet 给我一个 GestureDetector 错误?