gpt4 book ai didi

ios - 如何导出任意一段视频?导出最后 X 秒视频时出现 "Operation Stopped"错误

转载 作者:行者123 更新时间:2023-11-29 00:53:36 27 4
gpt4 key购买 nike

目标是导出某个视频的任意片段(例如,中间三分之一、后半部分),但 AVAssetExportSession 只有在起点是视频的开头时才会成功。

如果 cmStartTime 不为 0,AVAssetExportSession 将失败并出现此错误:

Failed: Optional(Error Domain=AVFoundationErrorDomain Code=-11841 "Operation Stopped" UserInfo=0x175872d00 {NSLocalizedDescription=Operation Stopped, NSLocalizedFailureReason=The video could not be composed.}).

    // 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。

insertTimeRangeatTime 参数应该是kCMTimeZero,因为目标是创建一个新剪辑。换句话说,此值表示在新轨道中的何处插入来自源轨道的剪辑。

关于ios - 如何导出任意一段视频?导出最后 X 秒视频时出现 "Operation Stopped"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37844690/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com