You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 12:21:03