iOS:在video中裁剪video奇怪的绿线左侧和底侧
– 如何删除video上的绿线 当在此时裁剪2或3次video时,在video中显示绿色或混合绿色 – 红色闪烁线,在video中左边或底部或左右两侧。
video裁剪方法。
-(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剪辑后看到的video剪裁绿线,如何解决。
你的video渲染宽度应该是4或者4整除。
检查这个讨论链接
意识到。 如果select不能被16,8或4整除的分辨率,则可能会在帧的底部或右侧以1px的绿色边框结束。 我已经看到了这个问题
如果水平或垂直尺寸不能被16整除,那么编码器会在右边缘或底部边缘用合适数量的黑色“悬垂”样本填充图像,这些样本在解码时被丢弃。 1920×1080,编码器将8行黑色像素附加到图像arrays,使得行数为1088。