¿Área de cultivo diferente al área seleccionada en iOS?

Aquí hay un enlace en github https://github.com/spennyf/cropVid/tree/master para probarlo y ver de qué estoy hablando, tomaría 1 minuto para probar. ¡Gracias!

Estoy tomando un video con un cuadrado para mostrar qué parte del video será recortada. Me gusta esto:

introduzca la descripción de la imagen aquí

En este momento estoy haciendo esto de un trozo de papel con 4 líneas en el cuadrado, y media diferencia de línea en la parte superior e inferior. Y luego recorté el video usando el código que publicaré, pero luego cuando muestro el video veo esto (ignora el background y el círculo verde):

introduzca la descripción de la imagen aquí

Como puede ver, hay más de cuatro líneas, así que lo estoy configurando para recortar una parte determinada, pero agrega más cuando estoy usando el mismo rectángulo que se muestra en la camera y el mismo rectángulo que se usa para recortar ?

Entonces mi pregunta es ¿por qué el cultivo no es del mismo tamaño?

Aquí es cómo recorto y muestro:

//this is the square on the camera UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height-80)]; UIImageView *image = [[UIImageView alloc] init]; image.layer.borderColor=[[UIColor whiteColor] CGColor]; image.frame = CGRectMake(self.view.frame.size.width/2 - 58 , 100 , 116, 116); CALayer *imageLayer = image.layer; [imageLayer setBorderWidth:1]; [view addSubview:image]; [picker setCameraOverlayView:view]; //this is crop rect CGRect rect = CGRectMake(self.view.frame.size.width/2 - 58, 100, 116, 116); [self applyCropToVideoWithAsset:assest AtRect:rect OnTimeRange:CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(assest.duration.value, 1)) ExportToUrl:exportUrl ExistingExportSession:exporter WithCompletion:^(BOOL success, NSError *error, NSURL *videoUrl) { //here is player AVPlayer *player = [AVPlayer playerWithURL:videoUrl]; AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:player]; layer.frame = CGRectMake(self.view.frame.size.width/2 - 58, 100, 116, 116); }]; 

Y aquí está el código que hace la cosecha:

 - (UIImageOrientation)getVideoOrientationFromAsset:(AVAsset *)asset { AVAssetTrack *videoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; CGSize size = [videoTrack naturalSize]; CGAffineTransform txf = [videoTrack prefernetworkingTransform]; if (size.width == txf.tx && size.height == txf.ty) return UIImageOrientationLeft; //return UIInterfaceOrientationLandscapeLeft; else if (txf.tx == 0 && txf.ty == 0) return UIImageOrientationRight; //return UIInterfaceOrientationLandscapeRight; else if (txf.tx == 0 && txf.ty == size.width) return UIImageOrientationDown; //return UIInterfaceOrientationPortraitUpsideDown; else return UIImageOrientationUp; //return UIInterfaceOrientationPortrait; } 

Y aquí está el rest del código de recorte:

 - (AVAssetExportSession*)applyCropToVideoWithAsset:(AVAsset*)asset AtRect:(CGRect)cropRect OnTimeRange:(CMTimeRange)cropTimeRange ExportToUrl:(NSURL*)outputUrl ExistingExportSession:(AVAssetExportSession*)exporter WithCompletion:(void(^)(BOOL success, NSError* error, NSURL* videoUrl))completion { // NSLog(@"CALLED"); //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); CGFloat cropOffX = cropRect.origin.x; CGFloat cropOffY = cropRect.origin.y; CGFloat cropWidth = cropRect.size.width; CGFloat cropHeight = cropRect.size.height; // NSLog(@"width: %f - height: %f - x: %f - y: %f", cropWidth, cropHeight, cropOffX, cropOffY); videoComposition.renderSize = CGSizeMake(cropWidth, cropHeight); //create a video instruction AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; instruction.timeRange = cropTimeRange; 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 - cropOffX, 0 - cropOffY ); t2 = CGAffineTransformRotate(t1, M_PI_2 ); break; case UIImageOrientationDown: t1 = CGAffineTransformMakeTranslation(0 - cropOffX, clipVideoTrack.naturalSize.width - cropOffY ); // not fixed width is the real height in upside down t2 = CGAffineTransformRotate(t1, - M_PI_2 ); break; case UIImageOrientationRight: t1 = CGAffineTransformMakeTranslation(0 - cropOffX, 0 - cropOffY ); t2 = CGAffineTransformRotate(t1, 0 ); break; case UIImageOrientationLeft: t1 = CGAffineTransformMakeTranslation(clipVideoTrack.naturalSize.width - cropOffX, clipVideoTrack.naturalSize.height - cropOffY ); t2 = CGAffineTransformRotate(t1, M_PI ); break; default: NSLog(@"no supported orientation has been found in this video"); break; } CGAffineTransform finalTransform = t2; [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]; //Remove any prevouis videos at that path [[NSFileManager defaultManager] removeItemAtURL:outputUrl error:nil]; if (!exporter){ exporter = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetHighestQuality] ; } // assign all instruction for the video processing (in this case the transformation for cropping the video exporter.videoComposition = videoComposition; exporter.outputFileType = AVFileTypeQuickTimeMovie; if (outputUrl){ exporter.outputURL = outputUrl; [exporter exportAsynchronouslyWithCompletionHandler:^{ switch ([exporter status]) { case AVAssetExportSessionStatusFailed: NSLog(@"crop Export failed: %@", [[exporter error] localizedDescription]); if (completion){ dispatch_async(dispatch_get_main_queue(), ^{ completion(NO,[exporter error],nil); }); return; } break; case AVAssetExportSessionStatusCancelled: NSLog(@"crop Export canceled"); if (completion){ dispatch_async(dispatch_get_main_queue(), ^{ completion(NO,nil,nil); }); return; } break; default: break; } if (completion){ dispatch_async(dispatch_get_main_queue(), ^{ completion(YES,nil,outputUrl); }); } }]; } return exporter; } 

Entonces, mi pregunta es ¿por qué el área de video no es lo mismo que el área de cultivo / camera, cuando he usado exactamente las mismas coorderadas y el tamaño del cuadrado?

Quizás verifique esta pregunta anterior .

Parece que podría ser similar a lo que estás experimentando. Un usuario en esa pregunta sugirió recortar de esta manera:

 CGImageRef imageRef = CGImageCreateWithImageInRect([originalImage CGImage], cropRect); UIImage *croppedImage = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); 

Espero que esto ayude o al less le dé un comienzo en la dirección correcta.