2

我有 4 个视频文件,我已对其进行编辑并添加到可变组合中。我正在尝试使用导出会话来导出文件,但是,当我导出时,只有下面曲目列表中的第一首曲目被导出

<AVAssetExportSession: 0x60800001da50, asset = <AVMutableComposition: 0x6080002240a0 tracks = (
    "<AVMutableCompositionTrack: 0x600000224ca0 trackID = 1, mediaType = vide, editCount = 8>",
    "<AVMutableCompositionTrack: 0x600000226da0 trackID = 2, mediaType = vide, editCount = 10>",
    "<AVMutableCompositionTrack: 0x60000023e180 trackID = 3, mediaType = vide, editCount = 3>",
    "<AVMutableCompositionTrack: 0x60000023e500 trackID = 4, mediaType = vide, editCount = 7>"
)>, presetName = AVAssetExportPreset1280x720, outputFileType = (null)

只有 trackID = 1 的第一首曲目被导出。这是导出会话源:

   // Create path to output file
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *myPathDocs =  [documentsDirectory stringByAppendingPathComponent:
                             [NSString stringWithFormat:@"ProcessedVideo-%d.mov", arc4random() % 1000]];
    NSURL *url = [NSURL fileURLWithPath:myPathDocs];

    AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:batchComposition presetName:AVAssetExportPreset1280x720];

    NSLog(@"%@", exporter);

    exporter.outputURL = url;
    exporter.outputFileType = AVFileTypeQuickTimeMovie;

    [exporter exportAsynchronouslyWithCompletionHandler:^(void) {
        switch (exporter.status) {
            case AVAssetExportSessionStatusCompleted:
                NSLog(@"Completed");
                break;
            case AVAssetExportSessionStatusFailed:
                NSLog(@"Failed:%@",exporter.error);
                break;
            case AVAssetExportSessionStatusCancelled:
                NSLog(@"Canceled:%@",exporter.error);
                break;
            default:
                break;
        }
    }];

有谁知道如何使用导出会话将所有 4 个曲目导出到单个 .mov 文件?

4

3 回答 3

3

您只能使用 导出到NSURL一个AVAssetExportSession。如果要导出 4 个单独的文件,则必须导出 4 次。

于 2014-10-02T15:16:41.420 回答
1

感谢 jlw 的帮助。我发现问题在于我将多个视频轨道添加到可变合成中。相反,我应该做的是制作一个视频轨道,并将其他资产轨道的所有编辑应用到单个视频轨道上。似乎 AVAssetExportSession 将仅导出 jlw 指出的单个曲目。

概括:

  1. 创建可变组合
  2. 创建可变合成轨道
  3. 将资产轨道应用于合成 (insertTimeRange)
  4. 导出可变组合
于 2014-10-02T16:24:06.207 回答
1

我认为没有必要创建新的AVMutableComposition. 相反,只需将您分配给您的出口商AVVideoComposition?videoComposition财产。

guard let playerItem = getPlayerItem() as? AVPlayerItem else {
    return
}

let asset = playerItem.asset
let videoComposition: AVVideoComposition? = playerItem.videoComposition

let path = NSTemporaryDirectory().stringByAppendingFormat("/video.mov")
if NSFileManager.defaultManager().fileExistsAtPath(path) {
    do {
        try NSFileManager.defaultManager().removeItemAtPath(path)
    } catch {
        print("Temporary file removing error.")
    }
}
let outputURL = NSURL.fileURLWithPath(path)

guard let exporter = AVAssetExportSession(asset: asset,
                                          presetName: AVAssetExportPresetHighestQuality) else {
                                            return
}

exporter.outputURL = outputURL
exporter.outputFileType = AVFileTypeQuickTimeMovie
exporter.shouldOptimizeForNetworkUse = true
exporter.videoComposition = videoComposition // 

exporter.exportAsynchronouslyWithCompletionHandler {
    PHPhotoLibrary.sharedPhotoLibrary().performChanges({
        PHAssetChangeRequest.creationRequestForAssetFromVideoAtFileURL(outputURL)
    }) { (success: Bool, error: NSError?) -> Void in
        if success {
        } else {
        }
    }
}
于 2016-04-26T00:34:33.790 回答