2016-06-16 99 views
1

- 如何删除视频上的绿线。 当在此时裁剪2或3次视频时,视频中的视频,左侧或底部或者左侧和底部显示绿色或混合绿色 - 红色眨眼线。iOS:裁剪视频奇怪的绿色线左侧和底部的视频

视频裁剪方法。视频后看到

-(void)cropButton 
{ 
     CGRect cropFrame = self.cropView.croppedImageFrame; 

     //load our movie Asset 
     AVAsset *asset; 
      asset = [AVAsset assetWithURL:[NSURL fileURLWithPath:[self.videoDataArr objectAtIndex:self.selectedIndex-1]]]; 

     //create an avassetrack with our asset 
     AVAssetTrack *clipVideoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 

     //create a video composition and preset some settings 
     AVMutableVideoComposition* videoComposition = [AVMutableVideoComposition videoComposition]; 
     videoComposition.frameDuration = CMTimeMake(1, 30); 

     //create a video instruction 
     AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; 
     instruction.timeRange = CMTimeRangeMake(kCMTimeZero, asset.duration); 

     AVMutableVideoCompositionLayerInstruction* transformer = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:clipVideoTrack]; 

     UIImageOrientation videoOrientation = [self getVideoOrientationFromAsset:asset]; 

     CGAffineTransform t1 = CGAffineTransformIdentity; 
     CGAffineTransform t2 = CGAffineTransformIdentity; 

     switch (videoOrientation) 
     { 
      case UIImageOrientationUp: 
       t1 = CGAffineTransformMakeTranslation(clipVideoTrack.naturalSize.height - cropFrame.origin.x, 0 - cropFrame.origin.y); 
       t2 = CGAffineTransformRotate(t1, M_PI_2); 
       break; 
      case UIImageOrientationDown: 
       t1 = CGAffineTransformMakeTranslation(0 - cropFrame.origin.x, clipVideoTrack.naturalSize.width - cropFrame.origin.y); // not fixed width is the real height in upside down 
       t2 = CGAffineTransformRotate(t1, - M_PI_2); 

       break; 
      case UIImageOrientationRight: 
       t1 = CGAffineTransformMakeTranslation(0 - cropFrame.origin.x, 0 - cropFrame.origin.y); 
       t2 = CGAffineTransformRotate(t1, 0); 
       break; 
      case UIImageOrientationLeft: 
       t1 = CGAffineTransformMakeTranslation(clipVideoTrack.naturalSize.width - cropFrame.origin.x, clipVideoTrack.naturalSize.height - cropFrame.origin.y); 
       t2 = CGAffineTransformRotate(t1, M_PI); 
       break; 
      default: 
       NSLog(@"no supported orientation has been found in this video"); 
       break; 
     } 

     CGAffineTransform finalTransform = t2; 
     videoComposition.renderSize = CGSizeMake(cropFrame.size.width,cropFrame.size.height); 

     [transformer setTransform:finalTransform atTime:kCMTimeZero]; 

     //add the transformer layer instructions, then add to video composition 
     instruction.layerInstructions = [NSArray arrayWithObject:transformer]; 
     videoComposition.instructions = [NSArray arrayWithObject: instruction]; 

     //Create an Export Path to store the cropped video 
     NSString * documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
     __block NSString *exportPath = [documentsPath stringByAppendingFormat:@"/CroppedVideo.mp4"]; 
     NSURL *exportUrl = [NSURL fileURLWithPath:exportPath]; 

     //Remove any prevouis videos at that path 
     [[NSFileManager defaultManager] removeItemAtURL:exportUrl error:nil]; 
     AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetHighestQuality] ; 
     exporter.videoComposition = videoComposition; 
     exporter.outputURL = exportUrl; 
     NSLog(@"exported url : %@",exportUrl); 
     exporter.outputFileType = AVFileTypeQuickTimeMovie; 

     [exporter exportAsynchronouslyWithCompletionHandler:^ 
     { 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       switch ([exporter status]) { 
        case AVAssetExportSessionStatusCompleted: 
        { 
         self.navigationController.toolbarHidden = YES; 
         NSError *error = nil; 
         NSString *targetPath; 
          targetPath = [self.videoDataArr objectAtIndex:self.selectedIndex-1]; 

         [FILEMANAGER removeItemAtPath:targetPath error:&error]; 
         if(error) 
         { 
          NSLog(@"Error is : %@",error); 
         } 
         error = nil; 
         [FILEMANAGER moveItemAtPath:exportPath toPath:targetPath error:&error]; 
         if(error) 
         { 
          NSLog(@"Error is : %@",error); 
         } 
         self.mySAVideoRangeSlider.videoUrl = self.videourl; 
         [self.mySAVideoRangeSlider getMovieFrame]; 

        } 
         break; 
        } 
        case AVAssetExportSessionStatusFailed: 
         NSLog(@"Export failed: %@", [[exporter error] localizedDescription]); 
         break; 
        case AVAssetExportSessionStatusCancelled: 
         NSLog(@"Export canceled"); 
         break; 
        default: 
         NSLog(@"NONE"); 
         dispatch_async(dispatch_get_main_queue(), ^{ 
         }); 
         break; 
       } 
      }); 
     }]; 
    } 

- 视频作物绿线裁剪,如何解决它。

回答

3

您的视频rendersize宽度应为偶数或整除4.

检查这个discussion link

注意。如果选择不能被16,8或4整除的分辨率,则最终可能会在帧的底部或右侧出现1px的绿色边框。我看到这个问题

“如果水平或垂直尺寸不能被16整除,那么编码器会在右边缘或底部边缘用合适数量的黑色”悬垂“样本填充图像,这些样本是在解码时丢弃,例如当在1920x1080下编码HDTV时,编码器将8行黑色像素附加到图像阵列,以使行数为1088。