iPhone相册保存H265/HEVC编码视频报错问题咨询
问题原因及修复方案
你当前的实现存在4个核心问题,是触发HEVC格式保存相册报错的主要原因:
问题明细
- 重复写入相册逻辑冲突
你先调用了UIVideo.SaveToPhotosAlbum写入相册,又在该方法的回调中调用PHPhotoLibrary.PerformChanges执行第二次写入,重复操作对兼容性要求更高的HEVC格式触发了写入冲突,H264因为系统容错性更高没有报错。 - FFmpeg导出HEVC编码标识不符合iOS要求
iOS相册仅支持带hvc1标签的HEVC封装MP4,默认FFmpeg-c:v copy封装HEVC到MP4时用的是hev1标签,系统无法识别就会抛出:
The operation couldn’t be completed. (PHPhotosErrorDomain error -1.)
- 本地URL生成方式错误
你用NSUrl.FromString(mFilePath)生成本地文件URL,该方法仅适用于带scheme的网络/标准格式路径,本地文件路径需要用NSUrl.FromFilename(mFilePath)生成带file://前缀的合法URL,路径不合法导致HEVC文件读取失败。 - 冗余文件覆盖逻辑异常
你在获取到相册内视频资源后,又执行了NSFileManager.DefaultManager.Copy将相册资源覆盖回原文档目录路径,该操作完全多余(你本身文档目录就存在原视频文件),甚至会因为权限问题触发写入异常。
修复步骤
- 删除重复写入逻辑,仅保留一套写入相册的代码
推荐直接使用PHPhotoLibrary的方案,移除UIVideo.SaveToPhotosAlbum调用,避免重复写入。 - 修改FFmpeg导出命令,添加HEVC标签指定参数
在原有命令中添加-tag:v hvc1强制输出iOS兼容的HEVC封装格式,修改后命令如下:
-loglevel trace -r 20 -i inputfile -c:v copy -tag:v hvc1 -f mp4 -y -r 20 outputfile
- 修正本地路径生成方式
所有本地文件路径生成NSUrl时统一使用NSUrl.FromFilename,替换所有NSUrl.FromString处理本地路径的逻辑。 - 删除冗余的文件复制逻辑
移除从相册复制资源回文档目录的代码,直接使用原有文档目录的视频路径做后续分享即可。 - 可选:增加设备HEVC兼容判断
写入前先判断当前设备是否支持HEVC写入,对于iPhone7以下不支持HEVC的设备,先将HEVC转码为H264再写入相册,避免兼容问题。
内容的提问来源于stack exchange,提问作者Manthan
相关产品推荐
相关产品推荐

