繁体   English   中英

如何导出视频的任意片段? 导出视频的最后X秒时出现“操作停止”错误

[英]How to export arbitrary segment of video? “Operation Stopped” error when exporting last X seconds of video

目标是导出某些视频的任意片段(例如,中间三分之一,最后一半),但是AVAssetExportSession仅在起点是视频的起点时成功。

如果cmStartTime不为0,则AVAssetExportSession失败,并显示以下错误:

失败:可选(错误域= AVFoundationErrorDomain代码= -11841“操作已停止” UserInfo = 0x175872d00 {NSLocalizedDescription =操作已停止,NSLocalizedFailureReason =无法合成视频。})。

    // Create main composition & its tracks
    let mainComposition = AVMutableComposition()
    let compositionVideoTrack = mainComposition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: CMPersistentTrackID(kCMPersistentTrackID_Invalid))
    let compositionAudioTrack = mainComposition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: CMPersistentTrackID(kCMPersistentTrackID_Invalid))

    // Get source video & audio tracks
    let videoURL = NSURL(fileURLWithPath: fileURL)
    let videoAsset = AVURLAsset(URL: videoURL, options: nil)
    let sourceVideoTrack = videoAsset.tracksWithMediaType(AVMediaTypeVideo)[0]
    let sourceAudioTrack = videoAsset.tracksWithMediaType(AVMediaTypeAudio)[0]

    // Define time values for video
    let timescale = Int32(600)
    let cmStartTime = CMTimeMake(Int64(CGFloat(0.5) * CGFloat(timescale)), timescale)
    let cmEndTime = CMTimeMake(10, 1)
    let timeRange = CMTimeRangeMake(cmStartTime, cmEndTime)

    // Add source tracks to composition
    do {
        try compositionVideoTrack.insertTimeRange(timeRange, ofTrack: sourceVideoTrack, atTime: cmStartTime)
        try compositionAudioTrack.insertTimeRange(timeRange, ofTrack: sourceAudioTrack, atTime: cmStartTime)
    } catch {
        printError("Error with insertTimeRange while exporting video: \(error)")
    }

    // Create video composition
    let renderSize = compositionVideoTrack.naturalSize
    let videoComposition = AVMutableVideoComposition()
    videoComposition.renderSize = renderSize
    videoComposition.frameDuration = CMTimeMake(Int64(1), Int32(frameRate))

    // Add layer instruction to video composition
    ...

    // Apply effects to video
    ...

    // Define export URL
    let exportPath = getUniqueTempPath(gMP4File)
    let exportURL = NSURL(fileURLWithPath: exportPath)

    // Create exporter
    let exporter = AVAssetExportSession(asset: mainComposition, presetName: AVAssetExportPresetHighestQuality)!
    exporter.videoComposition = videoComposition
    exporter.outputFileType = AVFileTypeMPEG4
    exporter.outputURL = exportURL
    exporter.shouldOptimizeForNetworkUse = true
    exporters.append(exporter)

    // Export video
    exporter.exportAsynchronouslyWithCompletionHandler() {
        // Finish stuff
    }

问题来自于不了解CMTimeRangeMakeinsertTimeRange

CMTimeRangeMake的第二个值应该是剪辑的持续时间,而不是结束时间。 因此,如果您的开始时间是5秒标记,并且剪辑持续10秒,则第二个值应该是10,而不是15。

atTime的参数insertTimeRangekCMTimeZero ,因为我们的目标是创建一个新的剪辑。 换句话说,此值表示要在新轨道中从源轨道插入剪辑的位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM