0

목표는 동영상의 임의 부분을 내보내는 것입니다 (예 : 중간 세 번째, 마지막 절반). AVAssetExportSession은 시작 지점이 동영상의 시작 인 경우에만 성공합니다. cmStartTime가 0이 아니면임의의 동영상 세그먼트를 내보내는 방법은 무엇인가요? 마지막 X 초의 동영상을 내보낼 때 '작업이 중지되었습니다.'오류가 발생했습니다.

, 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 
    } 

답변

1

문제는 CMTimeRangeMakeinsertTimeRange을 이해하지에서 발생했다.

CMTimeRangeMake의 두 번째 값은 종료 시간이 아니라 클립 지속 시간이어야합니다. 당신의 시작 시간이 5 초 마크, 그리고 클립이 10 초 동안 지속하는 경우, 두 번째 값은 10이 아니라 15

해야한다 그래서 목표는 새로운 클립을 만들 수 있기 때문에 insertTimeRangeatTime 매개 변수는 kCMTimeZero을해야합니다. 즉,이 값은 의 새 트랙에서 소스 트랙의 클립을 삽입 할 위치를 나타냅니다.