iOS使用AVFoundation合并视频与图片后出现黑屏该如何解决
视频合并黑屏故障修复方案
故障核心原因
你最初使用AVMutableVideoComposition(propertiesOf:)初始化合成对象时,未手动配置合成指令、渲染尺寸、帧率等参数,该初始化方法仅会继承原视频的基础属性,无法适配新增了Core Animation图层的自定义合成场景,导致导出时视频轨道渲染异常,出现黑屏。你后续修改的代码已经解决了核心的合成参数缺失问题,只需补充几个常见遗漏点即可完全修复。
修复步骤
- 修正图层坐标系翻转问题
Core Animation导出视频时使用的坐标系与UIKit坐标系Y轴方向相反,需给父动画层开启坐标翻转,避免视频内容渲染错位/黑屏:
animationLayer.isGeometryFlipped = true
- 补充图层指令的方向配置
将原视频的变换矩阵同步到合成图层指令中,避免视频方向异常导致的黑屏:
let layerinstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: videotrack) // 新增这行,同步原视频的方向变换 layerinstruction.setTransform(videoAssetTrack.preferredTransform, at: .zero)
- 修复资源校验逻辑
去掉代码中的强制解包风险,增加音频轨道、图片资源的非空判断,避免异常崩溃导致导出文件损坏黑屏:
// 音频轨道非空判断,无音频的视频跳过添加音频轨道的逻辑 if let audioAssetTrack = videoUrlAsset.tracks(withMediaType: .audio).first { let audioCompositionTrack = mutableComposition.addMutableTrack(withMediaType: .audio, preferredTrackID: kCMPersistentTrackID_Invalid) try? audioCompositionTrack?.insertTimeRange(CMTimeRange(start: .zero, duration: audioAssetTrack.timeRange.duration), of: audioAssetTrack, at: .zero) } // 图片资源非空判断,为空就不添加对应图层,避免空白图层盖住视频层 if let logoImg = UIImage(named: "icn_RandomDownload") { let imageLayer_LOGO = CALayer() imageLayer_LOGO.contents = logoImg.cgImage imageLayer_LOGO.frame = frame animationLayer.addSublayer(imageLayer_LOGO) } if let inputImg = img?.cgImage { let imageLayer = CALayer() imageLayer.contents = inputImg imageLayer.frame = frame animationLayer.addSublayer(imageLayer) }
- 验证资源有效性
提前校验后端返回的视频URL是否可以正常播放,避免无效、加密资源导致导出的文件为空黑屏。
内容的提问来源于stack exchange,提问作者user11587840
相关产品推荐
相关产品推荐

