Подтвердить что ты не робот

Как изменить ориентацию видео для AVCaptureVideoDataOutput


Вот проблема. Я использую AVCaptureVideoDataOutput для получения видеокадров с камеры и создания видео с ними с помощью AVAssetWriter. Он работает нормально, но видео, которое я получаю, перевернуто, потому что ориентация устройства для моего приложения по умолчанию - пейзаж, а не правый пейзаж, как указано по умолчанию в AVCaptureVideoDataOutput. Я пытаюсь изменить ориентацию в классе AVCaptureConnection, но isVideoOrientationSupported всегда false, возможно ли это исправить?

Вот какой код:

 AVCaptureDeviceInput *captureInput = [AVCaptureDeviceInput 
            deviceInputWithDevice:[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo] 
            error:nil];
 /*We setupt the output*/
 AVCaptureVideoDataOutput *captureOutput = [[AVCaptureVideoDataOutput alloc] init]; 
 captureOutput.alwaysDiscardsLateVideoFrames = YES; 
 captureOutput.minFrameDuration = CMTimeMake(1.0, 24.0); //Uncomment it to specify a minimum duration for each video frame
 [captureOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()];

 // Set the video output to store frame in BGRA (It is supposed to be faster)
 NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey; 
 NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA]; 



 NSDictionary* videoSettings = [NSDictionary dictionaryWithObject:value forKey:key]; 
 [captureOutput setVideoSettings:videoSettings]; 


 /*And we create a capture session*/
 self.captureSession = [[AVCaptureSession alloc] init];
 self.captureSession.sessionPreset = AVCaptureSessionPresetLow;
 /*We add input and output*/
 if ([self.captureSession canAddInput:captureInput]) 
 {
  [self.captureSession addInput:captureInput];
 }
 if ([self.captureSession canAddOutput:captureOutput]) 
 {
  [self.captureSession addOutput:captureOutput];
 }

 /*We add the preview layer*/
 self.prevLayer = [AVCaptureVideoPreviewLayer layerWithSession: self.captureSession];

 if ([self.prevLayer isOrientationSupported]) 
 {
  [self.prevLayer setOrientation:AVCaptureVideoOrientationLandscapeLeft];
 }

 self.prevLayer.frame = self.view.bounds; 

 self.prevLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
 [self.view.layer addSublayer: self.prevLayer];

 AVCaptureConnection *videoConnection = NULL;

 [self.captureSession beginConfiguration];

 for ( AVCaptureConnection *connection in [captureOutput connections] ) 
 {
  for ( AVCaptureInputPort *port in [connection inputPorts] ) 
  {
   if ( [[port mediaType] isEqual:AVMediaTypeVideo] ) 
   {
    videoConnection = connection;

   }
  }
 }
    if([videoConnection isVideoOrientationSupported]) // **Here it is, its always false**
     {
        [videoConnection setVideoOrientation:AVCaptureVideoOrientationLandscapeLeft];
     }

 [self.captureSession commitConfiguration];

 [self.captureSession startRunning]; 

Обновление: выяснилось, что при экспорте видео AVAssetExportSession теряет привилегированную информацию о Transform.

4b9b3361

Ответ 1

Я столкнулся с той же проблемой и ткнул вокруг AVCamDemo из WWDC. Я не знаю, почему (пока), но если вы запрашиваете свое видеосоединение сразу после создания всех входов/выходов/подключений, то оба являются: VideoOrientationSupported и поддерживаетVideoOrientation возвращает NO.

Однако , если вы запрашиваете поддержкуVideoOrientation или isVideoOrientationSupported в какой-то более поздней точке (после того, как, например, GUI настроен), он вернет YES. Например, я запрашиваю его сразу после того, как пользователь нажимает кнопку записи непосредственно перед тем, как я вызову [[self movieFileOutput] startRecordingToOutputFileURL...]

Дайте ему попробовать, работает для меня.

Ответ 2

Отсюда: http://developer.apple.com/library/ios/#qa/qa1744/_index.html#//apple_ref/doc/uid/DTS40011134

В настоящее время выходы захвата для файла фильма (AVCaptureMovieFileOutput) и неподвижное изображение (AVCaptureStillImageOutput) поддержка установки ориентации, но вывод данных для обработки видеокадров (AVCaptureVideoDataOutput) нет.