美文网首页
iOS开发-视频转码报错-Error Domain=AVFoun

iOS开发-视频转码报错-Error Domain=AVFoun

作者: 闲云悠鹤蝶恋舞 | 来源:发表于2021-03-12 10:27 被阅读0次

在进行视频转码时报错如下:

Error Domain=AVFoundationErrorDomain Code=-11800 "这项操作无法完成
" UserInfo={NSLocalizedFailureReason=发生未知错误(-12769),
 NSLocalizedDescription=这项操作无法完成, NSUnderlyingError=0x283fe7990 
{Error Domain=NSOSStatusErrorDomain Code=-12769 "(null)"}}

原因:

生成该视频时编码器出现了问题,可以通过下面方式让AVAssetExportSession重新编码来解决。

解决办法:重新编码

// 对视频重新编码
    func resetComposition(avAsset: AVAsset) -> AVAsset {
         let mainComposition = AVMutableComposition()
         let compositionVideoTrack = mainComposition.addMutableTrack(withMediaType: AVMediaType.video, preferredTrackID: kCMPersistentTrackID_Invalid)
                     
         let timeScale:Double = 100000
         let seconds = CMTimeGetSeconds(avAsset.duration) - 0.001
         let videoDurationI = UInt(seconds * timeScale)
         let videoDuration = CMTimeMake(value: Int64(videoDurationI), timescale: Int32(timeScale))
         let videoTimeRange = CMTimeRangeMake(start: CMTime.zero, duration: videoDuration)
         
         let videoTracks: [AVAssetTrack] = avAsset.tracks(withMediaType: AVMediaType.video)
         let videoTrack = videoTracks.first

         try? compositionVideoTrack?.insertTimeRange(videoTimeRange, of: videoTrack!, at: .zero)
         return mainComposition
     }

使用示例:

private func videoExportMp4(assetItem:PHAsset){
        let options = PHVideoRequestOptions()
        options.isNetworkAccessAllowed = true
        PHCachingImageManager().requestAVAsset(forVideo: assetItem, options:options, resultHandler: { (asset, audioMix, info)in
            // 重新编码视频
            let  avAsset =  self.resetComposition(avAsset: asset!)
            //以当前时间来为文件命名
            let date = Date()
            let formatter = DateFormatter.init()
            formatter.dateFormat = "yyyyMMddHHmmss"
            let fileName = formatter.string(from: date) + ".mp4"
            
            //保存址沙盒路径
            let docPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0] as NSString
            let videoSandBoxPath = (docPath as String) + "/ablumVideo" + fileName
            
            
            let compatiblePresets = AVAssetExportSession.exportPresets(compatibleWith: avAsset)
            if compatiblePresets.contains(AVAssetExportPresetHighestQuality) {
                
                let exporter = AVAssetExportSession(asset: avAsset,
                                                    presetName:AVAssetExportPresetHighestQuality)!
                exporter.outputURL =  NSURL(fileURLWithPath: videoSandBoxPath as String) as URL
                exporter.outputFileType = AVFileType.mp4
                exporter.shouldOptimizeForNetworkUse = true
                exporter.exportAsynchronously(completionHandler: {
                    switch (exporter.status) {
                    
                    case .unknown:
                        break
                    case .waiting:
                        break
                    case .exporting:
                        break
                    case .completed:
                        print("转码成功" + videoSandBoxPath )
                        break
                    case .failed:
                        DispatchQueue.main.async {
                            print("\(String(describing: exporter.error))")
                            print("视频处理失败")
                        }
                        
                        break
                    case .cancelled:
                        break
                    @unknown default:
                        break
                    }
                })
            }
        })
    }

相关文章

网友评论

      本文标题:iOS开发-视频转码报错-Error Domain=AVFoun

      本文链接:https://www.haomeiwen.com/subject/mmoaqltx.html