将视频剪辑拼接成一个像Vine一样的视频

时间:2013-06-25 17:30:37

标签: iphone ios ipad uiimagepickercontroller

我想使用UIImagePickerController录制多个视频剪辑,然后将它们拼接成一个视频,类似于Vine应用程序的工作方式。任何人都能指出我如何将视频片段组合成一个视频吗?

2 个答案:

答案 0 :(得分:1)

Ray Wenderlich的网站有一个教程,涵盖了这一点。 http://www.raywenderlich.com/13418/how-to-play-record-edit-videos-in-ios

答案 1 :(得分:0)

以下是一个如何拼接视频的示例,部分基于Ray Wenderlich的博客。

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
  [appDelegate.playerLayer removeFromSuperlayer];

  if (self.firstAsset)
  {
    self.secondAssetURL = [info objectForKey:UIImagePickerControllerMediaURL];
    self.secondAsset = [AVAsset assetWithURL:self.secondAssetURL];
  }
  else
  {
    self.firstAssetURL = [info objectForKey:UIImagePickerControllerMediaURL];
    self.firstAsset = [AVAsset assetWithURL:self.firstAssetURL];
  }

  if (self.secondAsset)
  {
    CMTime recordTime = CMTimeMakeWithSeconds(self.recordTime, NSEC_PER_SEC);
    AVMutableComposition *mixComposition = [AVMutableComposition new];

    AVMutableCompositionTrack *videoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
    [videoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, self.firstAsset.duration) ofTrack:[[self.firstAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:nil];
    [videoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, self.secondAsset.duration)
                        ofTrack:[[self.secondAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:recordTime error:nil];

    AVURLAsset *firstAudioAsset = [[AVURLAsset alloc] initWithURL:self.firstAssetURL options:nil];
    AVURLAsset *secondAudioAsset = [[AVURLAsset alloc] initWithURL:self.secondAssetURL options:nil];

    AVAssetTrack *firstAudioTrack =  [[firstAudioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
    AVAssetTrack *secondAudioTrack = [[secondAudioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];

    AVMutableCompositionTrack *compositionAudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
    [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, firstAudioAsset.duration) ofTrack:firstAudioTrack atTime:kCMTimeZero error:nil];
    [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, secondAudioAsset.duration) ofTrack:secondAudioTrack atTime:recordTime error:nil];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *myPathDocs =  [documentsDirectory stringByAppendingPathComponent:
                             [NSString stringWithFormat:@"mergeVideo-%d.mov",arc4random() % 1000]];
    NSURL *url = [NSURL fileURLWithPath:myPathDocs];
    // 5 - Create exporter
    AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition
                                                                      presetName:AVAssetExportPresetHighestQuality];
    exporter.outputURL=url;
    exporter.outputFileType = AVFileTypeQuickTimeMovie;
    exporter.shouldOptimizeForNetworkUse = YES;
    [exporter exportAsynchronouslyWithCompletionHandler:^{
      NSLog(@"we are now exporting");
      int exportStatus = exporter.status;
      switch (exportStatus) {
        case AVAssetExportSessionStatusFailed: {
          // log error to text view
          NSError *exportError = exporter.error;
          NSLog (@"AVAssetExportSessionStatusFailed: %@", exportError);
          break;
        }
        case AVAssetExportSessionStatusCompleted: {
          NSLog (@"AVAssetExportSessionStatusCompleted");
          self.firstAssetURL = exporter.outputURL;
          self.firstAsset = [AVAsset assetWithURL:self.firstAssetURL];
          dispatch_async(dispatch_get_main_queue(), ^{
            [self layoutVideo:exporter.outputURL];
          });
          break;
        }
        default: { NSLog (@"didn't get export status"); break;}
      }

    }];
  }
  else
  {
    [self layoutVideo:[info objectForKey:@"UIImagePickerControllerMediaURL"]];
  }

}