2016-06-16 45 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。