2016-10-03 4 views
6

Я сделал код, который захватывает входной видеосигнал устройства, и пока он работает нормально. Вот то, что я поставилКак изменить ориентацию видео AVCaptureMovieFileOutput во время сеанса?

// add preview layer 
_previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:_session]; 
_previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 
[self.videoView.layer addSublayer:_previewLayer]; 

// add movie output 
_movieFileOutput = [[AVCaptureMovieFileOutput alloc] init]; 
[_session addOutput:_movieFileOutput]; 
AVCaptureConnection *movieFileOutputConnection = [_movieFileOutput connectionWithMediaType:AVMediaTypeVideo]; 
movieFileOutputConnection.videoOrientation = [self videoOrientationFromCurrentDeviceOrientation]; 

// start session 
[_session startRunning]; 

где:

- (AVCaptureVideoOrientation) videoOrientationFromCurrentDeviceOrientation { 
    switch ([[UIApplication sharedApplication] statusBarOrientation]) { 
     case UIInterfaceOrientationPortrait: { 
      return AVCaptureVideoOrientationPortrait; 
     } 
     case UIInterfaceOrientationLandscapeLeft: { 
      return AVCaptureVideoOrientationLandscapeLeft; 
     } 
     case UIInterfaceOrientationLandscapeRight: { 
      return AVCaptureVideoOrientationLandscapeRight; 
     } 
     case UIInterfaceOrientationPortraitUpsideDown: { 
      return AVCaptureVideoOrientationPortraitUpsideDown; 
     } 
     case UIInterfaceOrientationUnknown: { 
      return 0; 
     } 
    } 
} 

Теперь, когда изменения ориентации интерфейса я хочу, чтобы мой вывод также измениться, поэтому у меня есть это:

- (void) updatePreviewLayer { 
    _previewLayer.frame = CGRectMake(0, 0, self.videoView.frame.size.width, self.videoView.frame.size.height); 
    _previewLayer.connection.videoOrientation = [self videoOrientationFromCurrentDeviceOrientation]; 
    [_session beginConfiguration]; 
    AVCaptureConnection *movieFileOutpurConnection = [_movieFileOutput connectionWithMediaType:AVMediaTypeVideo]; 
    movieFileOutpurConnection.videoOrientation = [self videoOrientationFromCurrentDeviceOrientation]; 
    [_session commitConfiguration]; 
} 

Но увы, он не работает. Кажется, что когда я впервые установил ориентацию видео на выходе фильма, он остается прежним, его нельзя изменить позже. Поэтому, если я начну снимать в альбомном режиме, а затем перейду на портрет, видео будет в порядке для ландшафтного режима, но портретный режим будет повернут. Это то же самое, если я начну в портретном режиме, чем пейзаж будет повернут.

Есть ли способ сделать это правильно?

ответ

1

Попробуйте добавить это перед началом сеанса:

[_movieFileOutput setRecordsVideoOrientationAndMirroringChanges:YES asMetadataTrackForConnection:movieFileOutputConnection]; 

Документация заголовочный файл для этого метода делает его звук очень похож на то, что вы ищете:

управления или нет выход файла видео создаст временную дорожку метаданных, в которой записываются образцы, которые отражают изменения, сделанные в отношении видеоопределения и видеоизображения данного соединения во время записи .

Там есть более интересная информация, я бы все прочитал.

Однако этот метод фактически не вращает ваши фреймы, он использует временные метаданные, чтобы инструктировать игроков делать это во время воспроизведения, поэтому возможно, что не все игроки будут поддерживать эту функцию. Если это дело выключатель, то вы можете отказаться от AVCaptureMovieFileOutput в пользу нижнего уровня AVCaptureVideoDataOutput + AVAssetWriter комбинации, где ваши videoOrientation изменения фактически вращаются кадры, в результате чего файлы, которые будут правильно воспроизводиться на любом проигрывателе:

Если AVCaptureVideoDataOutput для подключения к видеообъявлениям или видеоМирредованные свойства устанавливаются в значения, отличные от значений по умолчанию, на выходе применяются требуемое зеркалирование и ориентация путем физического поворота и перевертывания пробных буферов при их прохождении.

p.s. Я не думаю, что вам нужна пара beginConfiguration/commitConfiguration, если вы только меняете одно свойство, так как оно предназначено для пакетной обработки нескольких модификаций в одно атомное обновление.

1

Вы пытались приостановить сеанс перед изменением конфигурации?

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