2

我有4个视频文件,我已编辑并添加到一个可变的作文。我试图用出口会话但是导出的文件,当我出口中,只有第一条轨道在下面的曲目列表被出口导出多个曲目:AVMutableComposition和AVAssetExportSession

<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文件?

回答

1

感谢jlw的帮助。我发现的问题是,我添加了多个视频曲目来改变组合。相反,我应该完成的是制作单个视频轨道,并将来自其他资产轨道的所有编辑应用到单个视频轨道上。似乎AVAssetExportSession只会按照jlw的说明导出一个单曲。

摘要:

  1. 创建可变组成
  2. 创建可变组成的轨道
  3. 应用资产的曲目组成(insertTimeRange)
  4. 出口易变的成分
2

您只能使用AVAssetExportSession输出到一个NSURL。如果你想导出4个单独的文件,你将不得不导出4次。

+0

理想情况下,我想要做的是将这4个轨道导出到一个视频输出而不是4个独立的视频文件。 – Edwin 2014-10-02 15:35:02

+1

您可以将4首曲目合并为一个合成文件并导出到一个文件,但无论您使用哪个播放器播放该文件,都必须能够解释具有多个视频轨道的视频文件。我相信iOS中的照片应用只会播放一首曲目,您无法在曲目之间切换。 – jlw 2014-10-02 15:36:42

+0

我在Mac上使用QuickTime播放器。我认为这将能够顶级播放多首曲目? – Edwin 2014-10-02 15:48:55

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 { 
     } 
    } 
} 
相关问题