2016-06-16 2 views
1

-Wie zu entfernen grüne Linie auf dem Video. Wenn Sie ein Video 2 oder 3 Mal zu diesem Zeitpunkt zuschneiden, zeigen Sie grün oder mischen Sie grün-rote Blinklinie im Video, links oder unten oder links und unten im Video.iOS: Crop Video seltsame grüne Linie links und unten in Video

Video-Ernte-Methode.

-(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; 
       } 
      }); 
     }]; 
    } 

-Video Ernte grüne Linie nach Video gesehen abgeschnitten, wie man es gelöst.

Antwort

3

Ihr Video Render Breite sollte auch oder teilbar sein durch 4.

Kontrolle dieses discussion link

bewusst sein. Wenn Sie eine Auflösung wählen, die nicht durch 16, 8 oder 4 teilbar ist, erhalten Sie möglicherweise einen grünen 1-Pixel-Rand an der unteren oder rechten Seite des Rahmens. Ich habe dieses Problem mit

gesehen "Wenn die horizontale oder vertikale Größe nicht durch 16 teilbar ist, packt der Encoder das Bild mit einer geeigneten Anzahl von schwarzen" Überhang "-Proben an der rechten Kante oder unteren Kante Zum Beispiel bei der Kodierung von HDTV bei 1920x1080 hängt ein Kodierer 8 Reihen von schwarzen Pixeln an das heimage-Array, um die Zeile 1088 zu zählen.