2016-07-18 17 views
4

私はlivephotoからビデオを取得し、これ以上の時間にビデオをエクスポートします。
元のライブ写真よりも赤くなっています。それはバグですか?
ここにエクスポートコードがあり、最後にデモプロジェクトがあります。AVAssetExportSession、AVMutableVideoCompositionビデオをより赤くする

- (void)clipMovie:(NSString *)path block:(void (^)(BOOL success))completionBlock 
    { 
     UIColor *bgcolor = (UIColor *)[UIColor blackColor]; 

     AVURLAsset *videoasset = [[AVURLAsset alloc]initWithURL:[NSURL fileURLWithPath:path] options:nil]; 

     AVMutableComposition *composition = [AVMutableComposition composition]; 
     NSError *error; 
     [composition insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoasset.duration) ofAsset:videoasset atTime:kCMTimeZero error:&error]; 

     AVMutableVideoCompositionInstruction *videoInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; 
     videoInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, composition.duration); 
     videoInstruction.backgroundColor = bgcolor.CGColor; 


     if ([[composition tracksWithMediaType:AVMediaTypeVideo] count] > 0) 
     { 
      AVAssetTrack *videoTrack = [[composition tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 

      AVMutableVideoCompositionLayerInstruction *cropLayer = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack]; 

    //  CGSize naturalSize = videoTrack.naturalSize; 

      CGSize renderSize = CGSizeMake(1080, 1080); 

      AVAssetTrack *videoTracktmp = [[videoasset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 
      CGAffineTransform transform = videoTracktmp.preferredTransform; 

      CGRect drawrect = CGRectMake(0, 0, 1080, 1080); 

      [cropLayer setTransform:transform atTime:kCMTimeZero]; 

      CALayer *backgroundLayer = [CALayer layer]; 
      //  [backgroundLayer setContents:(id)self.patternBgView.image.CGImage]; 
      backgroundLayer.frame = CGRectMake(0, 0, renderSize.width, renderSize.height); 
      [backgroundLayer setMasksToBounds:YES]; 
      backgroundLayer.backgroundColor = bgcolor.CGColor; 

      CALayer *videoLayer = [CALayer layer]; 


      videoLayer.frame = CGRectMake(drawrect.origin.x, (renderSize.height-drawrect.size.height-drawrect.origin.y), drawrect.size.width, drawrect.size.height); 
      CALayer *parentLayer = [CALayer layer]; 
      parentLayer.frame = CGRectMake(0, 0, renderSize.width, renderSize.height); 
      [parentLayer addSublayer:backgroundLayer]; 
      [parentLayer addSublayer:videoLayer]; 

      AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition]; 
      videoComposition.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer]; 
      videoInstruction.layerInstructions = @[cropLayer]; 
      videoComposition.instructions = @[videoInstruction]; 

      videoComposition.renderSize = CGSizeMake(renderSize.width, renderSize.height); 
      videoComposition.frameDuration = CMTimeMake(1, 15); 

      AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:videoasset presetName:AVAssetExportPresetHighestQuality]; 
      exportSession.shouldOptimizeForNetworkUse = YES; 
      exportSession.videoComposition = videoComposition; 
      //  exportSession.metadata = videoasset.metadata; 

      NSString *path = [[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"] stringByAppendingPathComponent:@"a"]; 
      BOOL bo = [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil]; 
      NSString *result = [path stringByAppendingPathComponent:@"a.mov"]; 

      NSString *exportVideoPath = result; 
    //  NSLog(@"%@",result); 

      if ([[NSFileManager defaultManager] fileExistsAtPath:exportVideoPath]) { 
       [[NSFileManager defaultManager] removeItemAtPath:exportVideoPath error:nil]; 
      } 

      NSURL *exportURL = [NSURL fileURLWithPath:exportVideoPath]; 
      exportSession.outputURL = exportURL; 
    //  exportSession.metadata = [self updateMetadata:videoasset.metadata]; 
      exportSession.outputFileType = AVFileTypeQuickTimeMovie; 
      [exportSession exportAsynchronouslyWithCompletionHandler:^{ 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        switch ((int)exportSession.status) { 
         case AVAssetExportSessionStatusFailed:{ 
          //     NSLog (@"FAIL"); 
          completionBlock(NO); 
          break; 
         } 
         case AVAssetExportSessionStatusCompleted: { 
          //     NSLog (@"SUCCESS"); 
          completionBlock(YES); 
          break; 
         } 
        }; 
       }); 

      }]; 
     } 

    } 

動画は元のライブ写真よりも赤いです。

は、ここではそれが1秒後にimagepickerを紹介しますdemo link on github

  1. 実行プロジェクト
  2. です。
  3. アルバムに保存して新しい動画を
  4. を選んだlivephoto
  5. を選択し、クリックしてください。それは赤くなっています!

答えて

2

Opps! ちょうだい!

AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:videoasset presetName:AVAssetExportPresetPassthrough]; 

このエクスポートオプションは、通常、理由の制約のパススルーが不可能であるため トラックを除き、すべてのトラックのメディアは、ソース資産に保存されているとおりに出力に渡されることになります指定されたoutputFileTypeで示されるコンテナ形式 このオプションは、-allExportPresetsおよび-exportPresetsCompatibleWithAssetによって返される配列には含まれていません。

関連する問題