首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >像Vine一样将视频片段拼接成一个视频

像Vine一样将视频片段拼接成一个视频
EN

Stack Overflow用户
提问于 2013-06-26 01:30:37
回答 2查看 1.6K关注 0票数 7

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

EN

回答 2

Stack Overflow用户

发布于 2013-09-03 18:11:57

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

票数 1
EN

Stack Overflow用户

发布于 2015-04-03 16:14:04

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

代码语言:javascript
代码运行次数:0
运行
复制
-(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"]];
  }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17303779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档