2016-06-24 1 views
1

я вижу исключение:Исключения в AVCaptureMovieFileOutput после установки AVCaptureDeviceFormat на видео AVCaptureDevice больше, чем 1080p

* Нагрузочное приложение из-за неперехваченное исключение 'NSInvalidArgumentException', причина: «* - [AVCaptureMovieFileOutput startRecordingToOutputFileURL : recordDelegate:] - нет активных/активированных подключений. ' ***

... при попытке записи видео после установки формата видеовхода (обратная камера) в формат разрешения более высокого разрешения.

Мой код захвата сильно смоделирован после того, как приложение IOS для Apple «AVCamManual», которое использует AVCaptureMovieFileOutput для записи видео в файл. Я могу вставить некоторые из кода установки из AVCamManual, если это необходимо, но я начну с простого добавления кода, которые позволят этой проблеме проявиться. Сначала добавьте кнопку и установите ее цель в nextButtonHandler.

добавить также следующие методу addObservers:

Новый код:

- (void) nextButtonHandler 
{ 
    AVCaptureDeviceFormat* activeFormat = _videoDevice.activeFormat; 
    bool foundActive = false; 

    for (AVCaptureDeviceFormat* vFormat in [_videoDevice formats]) 
    { 
     if (foundActive) 
     { 
      // skip the full range formats 
      if (CMFormatDescriptionGetMediaSubType(vFormat.formatDescription) == kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange) 
      { 
       [self setResolution:vFormat]; 
       break; 
      } 
      else 
      { 
       continue; 
      } 
     } 
     else if (activeFormat == vFormat) 
     { 
      // flag that we found the active format, so the next valid one is the one we'll switch to 
      foundActive = true; 
     } 
    } 
} 


- (void) setResolution:(AVCaptureDeviceFormat*)format 
{ 
    NSLog(@"Changing to"); 
    [AAPLCameraViewController dumpCaptureDeviceFormat:format]; 

    dispatch_async(_sessionQueue,^
    { 
     NSError* error = nil; 
     if ([_videoDevice lockForConfiguration:&error]) 
     { 
      _videoDevice.activeFormat = format; 
      [_videoDevice unlockForConfiguration]; 
     } 
     else 
     { 
      NSLog(@"Could not lock device for configuration: %@", error); 
     } 
    }); 
} 


- (void) formatDidChange:(NSNotification*)notification 
{ 
    NSLog(@"Changed to"); 
    [AAPLCameraViewController dumpCaptureDeviceFormat:_videoDevice.activeFormat]; 

    AVCaptureConnection* connection = [_movieFileOutput connectionWithMediaType:AVMediaTypeVideo]; 
    NSLog(@"connection: active=%@, enabled=%@", connection.active ? @"YES" : @"NO", connection.enabled ? @"YES" : @"NO"); 
} 


+ (void) dumpCaptureDeviceFormat:(AVCaptureDeviceFormat*)format 
{ 
#if DEBUG 
    CMVideoDimensions dims = CMVideoFormatDescriptionGetDimensions(format.formatDescription); 

    FourCharCode fourCC = CMFormatDescriptionGetMediaSubType(format.formatDescription); 
    unichar c[4]; 
    c[0] = (fourCC >> 24) & 0xFF; 
    c[1] = (fourCC >> 16) & 0xFF; 
    c[2] = (fourCC >> 8) & 0xFF; 
    c[3] = (fourCC >> 0) & 0xFF; 
    NSString* fourCCStr = [NSString stringWithCharacters:c length:4]; 

    NSLog(@"format: ........................................ (%d x %d) %@", dims.width, dims.height, fourCCStr); 
    NSLog(@" exposure range: %f - %f", CMTimeGetSeconds(format.minExposureDuration), CMTimeGetSeconds(format.maxExposureDuration)); 
    NSLog(@" ISO range: %f - %f", format.minISO, format.maxISO); 

    NSString* ratesStr = @""; 
    NSArray* supportedFrameRateRanges = [format videoSupportedFrameRateRanges]; 
    int count = 0; 
    for (AVFrameRateRange* range in supportedFrameRateRanges) 
    { 
     if (count > 0) 
     { 
      ratesStr = [ratesStr stringByAppendingString:@", "]; 
     } 
     NSString* rate = [NSString stringWithFormat:@"%f - %f", range.minFrameRate, range.maxFrameRate]; 
     ratesStr = [ratesStr stringByAppendingString:rate]; 
     count++; 
    } 
    NSLog(@" supported frame rates: %@", ratesStr); 
#endif 
} 

После того, как вы похлопал кнопку, формат устройства будет изменен. Вы можете продолжать делать это по мере необходимости, пока не достигнете формата с более высоким разрешением, чем 1080p, например «2592 x 1936». Когда вы находитесь в этом состоянии, если вы попытаетесь записать видео, вы увидите исключение.

Обратите внимание, что я добавил код, чтобы сбрасывать состояние соединения movieFileOutput после уведомления об изменении формата. И когда разрешение превышает 1080p, «активное» состояние при подключении переходит в НЕТ.

Я могу найти нулевую документацию по этому вопросу, и другие вопросы и ответы SO не упоминают об этом, кроме одной темы, в которой говорится, что вы должны проверить активное состояние соединения.

Мой главный вопрос: ПОЧЕМУ это происходит? С тех пор я узнал, что если я не использую AVCaptureMovieFileOutput и вместо этого использую AVCaptureVideoDataOutput, без указания аудиовхода, проблема не возникает. Является ли запись видео со звуком, не поддерживаемым в разрешениях захвата более 1080p? Если это так, почему Apple не говорит об этом в своей документации?

+0

Я хотел бы также быть заинтересованы в любой информации о том, как записать привет разрешения (> 1080p) видео со звуком, на IOS устройств. Я знаю, что это возможно, потому что приложение FiLMiC Pro iOS может сделать это на iPhone 6s. Когда я пытаюсь использовать AVCaptureVideoDataOutput и AVCaptureAudioDataOutput, активное состояние аудиосоединения становится НЕТ для любого формата> 1080p. –

+0

Вы поняли решение? –

ответ

0

Эта проблема связана с конкретным устройством означает, что вы получаете сбой на iPhone 4 & 5 или, возможно, 6 семейство, поскольку разрешение видео отличается от устройств.

Вы можете изменить разрешение, используя свойство sessionPreset. Значение по умолчанию для предварительной настройки сеанса: AVCaptureSessionPresetHigh, которое подходит для высококачественного видео и аудио вывода.

Вы можете установить только предустановку, если canSetSessionPreset: возвращает YES для , что предустановки. Наличие

Доступно в iOS 4.0 и новее.

Возможные значения сессии предустановка:

видеовхода Presets

константы для определения настройки захвата пресеты с помощью свойства sessionPreset .

NSString * const AVCaptureSessionPresetPhoto;

NSString * const AVCaptureSessionPresetHigh;

NSString * const AVCaptureSessionPresetMedium;

NSString * const AVCaptureSessionPresetLow;

NSString * const AVCaptureSessionPreset352x288;

NSString * const AVCaptureSessionPreset640x480;

NSString * const AVCaptureSessionPreset1280x720;

NSString * const AVCaptureSessionPreset1920x1080;

NSString * const AVCaptureSessionPresetiFrame960x540;

NSString * const AVCaptureSessionPresetiFrame1280x720;

AVCaptureSessionPreset1920x1080

настройки Определяет, подходящие для захвата качества 1080p (1920x1080 пикселей) выходного видеосигнала.

Доступно в iOS 5.0 и новее.

Объявлено в AVCaptureSession.h.

Пожалуйста, обратитесь: https://developer.apple.com/library/ios/#DOCUMENTATION/AVFoundation/Reference/AVCaptureSession_Class/Reference/Reference.html

+1

Это не отвечает на вопрос. Я пробовал: iPhone 5s, iPad Mini 4, iPhone 6s. Хотя эти устройства поддерживают несколько разных форматов ... все проявляют эту проблему. Я хочу знать, почему происходит этот сбой, и что еще более важно, как добиться высокой скорости записи видео с разрешением более 1080p. –

+1

Я не могу использовать предварительные настройки сеанса. Мне нужно больше контроля за выполнением таких функций, как установка более высокой частоты кадров. Вы не можете увеличить частоту кадров без установки свойства «activeFormat» на устройстве. –

+0

@ToddOrler Вы нашли способ записи видео без установки предустановки? –

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