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