Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c AVMutableVideoComposition有时获胜';我不能播放视频_Objective C_Swift_Avplayer_Avasset_Avvideocomposition - Fatal编程技术网

Objective c AVMutableVideoComposition有时获胜';我不能播放视频

Objective c AVMutableVideoComposition有时获胜';我不能播放视频,objective-c,swift,avplayer,avasset,avvideocomposition,Objective C,Swift,Avplayer,Avasset,Avvideocomposition,我正在使用这个短片段来设置我的视频。出于一些未知的原因-有时视频根本无法显示,而对于其他视频,它可以完美地工作 let videoTrack: AVAssetTrack = asset.tracksWithMediaType(AVMediaTypeVideo)[0] let composition: AVMutableComposition = AVMutableComposition() let videoComposition: AVMutableVideo

我正在使用这个短片段来设置我的视频。出于一些未知的原因-有时视频根本无法显示,而对于其他视频,它可以完美地工作

let videoTrack: AVAssetTrack = asset.tracksWithMediaType(AVMediaTypeVideo)[0]
        let composition: AVMutableComposition = AVMutableComposition()

        let videoComposition: AVMutableVideoComposition = AVMutableVideoComposition()
        var videoSize: CGSize = videoTrack.naturalSize
        let isPortrait_: Bool = self.isVideoPortrait(asset)
        if isPortrait_ {
            NSLog("video is portrait ")
            videoSize = CGSizeMake(videoSize.height, videoSize.width)
        }
        composition.naturalSize = videoSize
        videoComposition.renderSize = videoSize
        // videoComposition.renderSize = videoTrack.naturalSize; //
        videoComposition.frameDuration = CMTimeMake(1, 30)

        let compositionVideoTrack = composition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: 1)
        let timeRange = videoTrack.timeRange
        do {
            try compositionVideoTrack.insertTimeRange(timeRange, ofTrack: videoTrack, atTime: kCMTimeZero)
        } catch {
            print("error")

        }
        let layerInst = AVMutableVideoCompositionLayerInstruction(assetTrack: videoTrack)

        layerInst.setTransform(videoTrack.preferredTransform, atTime: kCMTimeZero)
        let inst: AVMutableVideoCompositionInstruction = AVMutableVideoCompositionInstruction()
        inst.timeRange = timeRange

        inst.layerInstructions = [layerInst]
        videoComposition.instructions = [inst]

        let playerItem = AVPlayerItem(asset: composition)
        playerItem.videoComposition = videoComposition
但对于一些视频,它根本不会显示出来


有什么建议吗?谢谢您好,我有一个相对类似的代码,希望这能帮助您解决问题

class func MergeVideosSequentially(URLS : [NSURL], callback : (error : ErrorType? , outURL : NSURL?) -> Void){
    let composition = AVMutableComposition()

    //videoTrack
    let videoTrack = composition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid)
    let audioTrack = composition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid)

    var cursorTime = kCMTimeZero
    for URL in URLS {           
        let asset = AVAsset(URL: URL)
        let assetVideoTrack = asset.tracksWithMediaType(AVMediaTypeVideo).first! as AVAssetTrack
        let assetAudioTrack = asset.tracksWithMediaType(AVMediaTypeAudio).first! as AVAssetTrack

        var duration : CMTimeRange? = nil
        duration = CMTimeRangeMake(kCMTimeZero, asset.duration)

        do {
            try videoTrack.insertTimeRange(duration!, ofTrack: assetVideoTrack, atTime: cursorTime)
            try audioTrack.insertTimeRange(duration!, ofTrack: assetAudioTrack, atTime: cursorTime)
        }catch {
            print(error)
        }
        cursorTime = CMTimeAdd(cursorTime, asset.duration)
    }

    let directory = NSTemporaryDirectory()
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateStyle = .LongStyle
    dateFormatter.timeStyle = .ShortStyle
    let date = dateFormatter.stringFromDate(NSDate())
    let savePath = "\(directory)/mergedVideo-\(date).mp4"
    let url = NSURL(fileURLWithPath: savePath)

    let exporter = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetHighestQuality)
    exporter!.outputURL = url
    exporter!.shouldOptimizeForNetworkUse = true
    exporter!.outputFileType = AVFileTypeMPEG4

    exporter!.exportAsynchronouslyWithCompletionHandler({ () -> Void in
        let outputURL = exporter!.outputURL

        switch exporter!.status {
        case .Completed :
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                callback(error: nil, outURL: outputURL)
            })
        default:
            callback(error: CCMovieWriterError.CannotMergeClips, outURL: nil)
        }

    })
}