【问题标题】:Stitch video clips together into a single video like Vine将视频剪辑拼接成一个视频,例如 Vine
【发布时间】:2013-06-25 17:30:36
【问题描述】:

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

【问题讨论】:

    标签: iphone ios ipad uiimagepickercontroller


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      以下是如何将视频拼接在一起的示例,部分基于 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"]];
        }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-02
        • 1970-01-01
        相关资源
        最近更新 更多