swift AVAssetExportSession exportAsynchronously非常慢

2ledvvac  于 2023-05-28  发布在  Swift
关注(0)|答案(1)|浏览(198)

bounty将在17小时后到期。回答此问题可获得+200声望奖励。SwiftiSwift正在寻找典型答案

答案应包括应用CIFilter的视频与快速出口和良好的质量
即使我不应用任何过滤器,AVAssetExportSession exportAsynchronously的性能也非常非常差。导出一个26秒的视频需要10多秒左右的时间。我该怎么弥补?

let avPlayerItem = AVPlayerItem(asset: video)
avVideoComposition = AVVideoComposition(asset: avPlayerItem.asset, applyingCIFiltersWithHandler: { request in
    request.finish(with: request.sourceImage, context: nil)
})
avPlayerItem.videoComposition = avVideoComposition

// -----------

func exportFilterVideo(videoComposition:AVVideoComposition , completion: @escaping
(_ outputURL : NSURL?) -> ()) {
    let exportSession = AVAssetExportSession(asset: self, presetName: AVAssetExportPresetHighestQuality)!
    let croppedOutputFileUrl = URL( fileURLWithPath: NSTemporaryDirectory() + NSUUID().uuidString + ".mov")
    exportSession.outputURL = croppedOutputFileUrl
    exportSession.outputFileType = AVFileType.mov
    exportSession.videoComposition = videoComposition
    exportSession.exportAsynchronously(completionHandler: {
        guard exportSession.status != .failed else {
            completion(nil)
            return
        }
        if exportSession.status == .completed {
            DispatchQueue.main.async(execute: {
                completion(croppedOutputFileUrl as NSURL)
            })
        }
        else {
            completion(nil)
        }
    })
}

即使我使用AVAssetExportPresetLowQuality也没有帮助!

8fsztsew

8fsztsew1#

第一种解决方案:

如果您使用AVAssetExportPresetMediumQualityAVAssetExportPresetLowQuality尝试了exportSession,但没有帮助!则考虑AVAssetExportPresetHighestQuality
A preset to export a high-quality movie file.

let exportSession = AVAssetExportSession(asset: self, presetName: AVAssetExportPresetHighestQuality)!

然后尝试将videoComposition设置为nil,如果您不需要应用任何滤镜,则会导致videoComposition中所述的
视频合成:
一个可选对象,提供有关如何合成视频帧的说明。
默认值为nil。

exportSession.videoComposition = nil

尝试使用**.mp4视频编码格式,因为它可能比.mov**性能更好

exportSession.outputFileType = AVFileType.mp4 // or AVFileType.mov

如果你需要你的视频优化网络使用然后尝试这个

exportSession.shouldOptimizeForNetworkUse = true

但请注意,导出会话可能需要更长的时间!

第二种解决方案:

我经历了同样的问题,而前一段时间,我最终解决了这个问题,首先压缩视频,然后应用更改,以提高整个程序的速度。
我使用了以下库
LightCompressor_iOS
LightCompressor_example
这是一个示例代码

let compression: Compression = videoCompressor.compressVideo(source: url, destination: url, quality: .very_high, keepOriginalResolution: true, progressQueue: .main, progressHandler: nil) { (result) in
    print("Compression result \(result)")
    switch result {
    case .onStart:
        print("🏁onStart🏁")
        break
    case .onSuccess(_):
        print("✅onSuccess✅")
        break
    case .onFailure(_):
        print("❌onFailure❌")
        break
    case .onCancelled:
        print("✅Size after compression is \(Int(videoLocalPath!.fileSizeInMB()))MB✅")
    }
}

compression.cancel = true
视频编辑器iOS应用(仅供参考)

您可以从以下项目中获取并运行该应用程序,因为它是一个iOS应用程序,用于将过滤器,贴纸和图像应用于视频,以便您可以识别它在设备上的表现。OptiVideoEditor-for-iOS
我想你会有兴趣阅读的代码在下面的链接中
OptiVideoEditor

相关问题