2015-04-04 2 views
5

Это ссылка на github https://github.com/spennyf/cropVid/tree/master, чтобы попробовать это самостоятельно и посмотреть, о чем я говорю, это займет 1 минуту, чтобы проверить. Благодаря!Кадрирование отличается от выбранной области в iOS?

Я снимаю видео с квадратом, чтобы показать, какая часть видео будет обрезана. Как это:

enter image description here

Прямо сейчас я делаю это кусок бумаги с 4-х линий в квадрате, а половина разница линии сверху и снизу. А потом я обрезать видео, используя код, который я отправлю, но потом, когда я показываю видео я вижу это (Игнорировать фон и зеленый круг):

enter image description here

Как вы можете видеть, что есть больше, чем четыре линии, поэтому я устанавливаю его для обрезки определенной части, но она добавляет больше, когда я использую тот же прямоугольник, который отображается в камере, и тот же прямоугольник, который используется для обрезки?

Так что мой вопрос в том, почему обрезка не того же размера?

Вот как я урожай и дисплей:

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

А вот код, который делает урожай:

- (UIImageOrientation)getVideoOrientationFromAsset:(AVAsset *)asset 
{ 
    AVAssetTrack *videoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 
CGSize size = [videoTrack naturalSize]; 
CGAffineTransform txf = [videoTrack preferredTransform]; 

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; 
} 

А вот остальная часть кода кадрирования:

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

Итак, мой вопрос в том, почему область видео не совпадает с областью обрезки/камеры, когда я использовал точно такие же координаты и ize квадрата?

+0

Просто убедитесь, что, как только обрезанное видео выполняется (так что в блоке завершения), необходимо сохранить на диске iphone. Пожалуйста, проверьте этот файл напрямую, я имею в виду доступ к файлу (подключение iphone к Mac и использование такого инструмента, как iExplorer или iFunBox). затем скопируйте его на mac и откройте его с помощью игрока Mac быстрого времени по умолчанию. Таким образом, вы убедитесь, что получившееся обрезанное видео - это именно то, что вы видите на этом квадрате. Кроме того, убедитесь, что область обрезки использует правильные координаты для указанного вида, как для оси x, так и для оси y –

+0

@LucaIaco. Хорошо, я использую iExplorer и помещаю видео на свой Mac и быстро проигрываю его, а обрезанная область по-прежнему не верно. Я смотрел на координаты снова и снова, и я уверен, что они правы. Я собираюсь сделать проект git hub ссылкой на ссылку, чтобы вы могли скачать и запустить и посмотреть сами, если не возражаете. Прямо сейчас я беру видео зеленого квадрата и только квадрата в обрезанной части, но тогда я вижу белый, когда его обрезают. Я был бы очень признателен, если бы вы посмотрели проект – iqueqiorio

+0

. Вот верная ссылка https://github.com/spennyf/cropVid – iqueqiorio

ответ

-2

Возможно Check This Previous Question.

Похоже, что это похоже на то, что вы испытываете. Пользователь на этот вопрос предложил кадрирование таким образом:

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

Я надеюсь, что это помогает или, по крайней мере, дает старт в правильном направлении.

+0

Этот ответ совершенно не имеет значения. Вопрос задает вопрос об обрезке видео, а не изображения. – bgfriend0

+0

Простите, я был довольно поздно и определенно неправильно понял этот! Спасибо за головы. – Kleigh

+0

Ха-ха, пп, случается со всеми нами. – bgfriend0

Смежные вопросы