导入3000px以上FHD或多段视频时AVPlayer报错-11819黑屏无法播放
问题原因与解决方案
你遇到的-11819错误对应AVErrorCannotComplete,是AVFoundation的通用执行失败报错,在自定义视频合成+高分辨率/多素材的场景下,通常由以下几个原因触发:
触发原因与修复方案
- 渲染尺寸超出设备实时渲染上限
苹果硬件对实时视频播放的渲染尺寸有严格阈值,主流iOS设备的实时渲染最大分辨率通常在4096×4096以内,导入3000px以上分辨率的素材时,如果直接把原始尺寸设为AVVideoComposition的renderSize,很容易触发硬件解码限制,导致播放失败。
修复方式:- 先对素材尺寸做等比下采样,保证
renderSize的宽高都不超过3840px(4K标准值) - 确保设置的
renderSize宽高均为16的整数倍,不符合的话补黑边处理,这是AVFoundation的硬件渲染强制要求
- 先对素材尺寸做等比下采样,保证
- 自定义合成器配置不规范
多段素材拼接时如果不同素材的像素格式、色彩空间、帧率不一致,自定义合成器没有做兼容处理的话,会触发内部渲染错误。
修复方式:- 统一设置合成器的
sourcePixelBufferAttributes和requiredPixelBufferAttributesForRenderContext,优先使用兼容性最好的kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange格式 - 所有导入素材统一转码为相同帧率(比如25/30fps)、相同色彩空间(比如sRGB)后再加入合成轨道
- 统一设置合成器的
- 内存溢出触发AVFoundation内部保护
3000px分辨率的单张原始帧大小约30MB以上,多段素材同时解码时如果没有及时释放像素缓冲区,很容易爆内存。
修复方式:- 用
@autoreleasepool包裹自定义合成器的render(in:)渲染逻辑,及时释放临时产生的像素缓冲区 - 不要持有任何渲染帧的强引用,处理完成后立刻调用
CVPixelBufferRelease释放手动创建的缓冲区
- 用
- 素材校验不完整
你当前异步加载的asset键没有覆盖合成必需的参数,会导致拼接的时候轨道属性读取异常。
修复方式:- 在加载的asset键列表中加入
tracks,合成前必须确认所有素材的轨道属性都加载完成 - 每段素材加入合成轨道前,单独校验是否有可用的视频轨道、时间范围是否有效
- 在加载的asset键列表中加入
排查验证方法
你可以先替换自定义合成器为系统默认的AVVideoComposition,播放相同的高分辨率/多段素材:
- 如果错误消失,说明问题出在自定义合成器的逻辑中,可以逐行排查渲染代码
- 如果仍然报错,说明是合成轨道构建或素材本身的参数问题,优先检查
renderSize和素材属性
内容的提问来源于stack exchange,提问作者Eugen C.
相关产品推荐
相关产品推荐

