Ios 如何将AVMutableVideoComposition转换为AVAsset

Ios 如何将AVMutableVideoComposition转换为AVAsset,ios,swift,avfoundation,Ios,Swift,Avfoundation,我正在做一些视频编辑,我需要把我正在处理的AVMutableVideoComposition放回一个播放器项目中。要进入玩家物品,它需要是一个AVAsset。如何做到这一点?您可以使用AVMutableComposition作为AVPlayerItem的资产,因为AVMutableComposition是AVAsset的子类 AVMutableVideoComposition不是AVAsset的子类,而是在AVMutableComposition中显示插入到AVAssetTracks中的视频的一

我正在做一些视频编辑,我需要把我正在处理的AVMutableVideoComposition放回一个播放器项目中。要进入玩家物品,它需要是一个AVAsset。如何做到这一点?

您可以使用
AVMutableComposition
作为
AVPlayerItem
的资产,因为
AVMutableComposition
AVAsset
的子类

AVMutableVideoComposition
不是
AVAsset
的子类,而是在
AVMutableComposition
中显示插入到
AVAssetTracks
中的视频的一种方式

(如果您的所有视频都按照您希望的方式放置,而没有
AVMutableVideoComposition
,则您可能不需要设置播放器项目的
videoComposition
属性)

ObjC:

斯威夫特:

let composition = AVMutableComposition(...
let videoComposition = AVMutableVideoComposition(...
let item = AVPlayerItem(asset: composition)
item.videoComposition = videoComposition

选中此选项-exportPath可以是保存视频的任何临时路径

    func ConvertAvcompositionToAvasset(avComp: AVComposition, completion:@escaping (_ avasset: AVAsset) -> Void){
        let exporter = AVAssetExportSession(asset: avComp, presetName: AVAssetExportPresetHighestQuality)
        let randNum:Int = Int(arc4random())
        //Generating Export Path
        let exportPath: NSString = NSTemporaryDirectory().appendingFormat("\(randNum)"+"video.mov") as NSString
        let exportUrl: NSURL = NSURL.fileURL(withPath: exportPath as String) as NSURL
        //SettingUp Export Path as URL
        exporter?.outputURL = exportUrl as URL
        exporter?.outputFileType = AVFileTypeQuickTimeMovie
        exporter?.shouldOptimizeForNetworkUse = true
        exporter?.exportAsynchronously(completionHandler: {() -> Void in
            DispatchQueue.main.async(execute: {() -> Void in
                if exporter?.status == .completed {
                    let URL: URL? = exporter?.outputURL
                    let Avasset:AVAsset = AVAsset(url: URL!)
                    completion(Avasset)
                }
                else if exporter?.status == .failed{
                    print("Failed")

                }
            })
        }) }
看看这个答案:
    func ConvertAvcompositionToAvasset(avComp: AVComposition, completion:@escaping (_ avasset: AVAsset) -> Void){
        let exporter = AVAssetExportSession(asset: avComp, presetName: AVAssetExportPresetHighestQuality)
        let randNum:Int = Int(arc4random())
        //Generating Export Path
        let exportPath: NSString = NSTemporaryDirectory().appendingFormat("\(randNum)"+"video.mov") as NSString
        let exportUrl: NSURL = NSURL.fileURL(withPath: exportPath as String) as NSURL
        //SettingUp Export Path as URL
        exporter?.outputURL = exportUrl as URL
        exporter?.outputFileType = AVFileTypeQuickTimeMovie
        exporter?.shouldOptimizeForNetworkUse = true
        exporter?.exportAsynchronously(completionHandler: {() -> Void in
            DispatchQueue.main.async(execute: {() -> Void in
                if exporter?.status == .completed {
                    let URL: URL? = exporter?.outputURL
                    let Avasset:AVAsset = AVAsset(url: URL!)
                    completion(Avasset)
                }
                else if exporter?.status == .failed{
                    print("Failed")

                }
            })
        }) }