Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在视频AVCaptureDevice上设置大于1080p的AVCaptureDeviceFormat后,AVCaptureMovieFileOutput中出现异常_Ios_Video Capture - Fatal编程技术网

Ios 在视频AVCaptureDevice上设置大于1080p的AVCaptureDeviceFormat后,AVCaptureMovieFileOutput中出现异常

Ios 在视频AVCaptureDevice上设置大于1080p的AVCaptureDeviceFormat后,AVCaptureMovieFileOutput中出现异常,ios,video-capture,Ios,Video Capture,我看到了一个例外: *由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“*-[AVCaptureMovieFileOutput StartRecordToOutputFileURL:recordingDelegate:]-没有活动/启用的连接。”*** 。。。在将视频输入设备(背向摄像头)格式设置为高于默认分辨率的格式后尝试录制视频时 我的捕获代码在很大程度上模仿了苹果的“AVCamManual”iOS示例应用程序,该应用程序使用AVCaptureM

我看到了一个例外:

*由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“*-[AVCaptureMovieFileOutput StartRecordToOutputFileURL:recordingDelegate:]-没有活动/启用的连接。”***

。。。在将视频输入设备(背向摄像头)格式设置为高于默认分辨率的格式后尝试录制视频时

我的捕获代码在很大程度上模仿了苹果的“AVCamManual”iOS示例应用程序,该应用程序使用AVCaptureMovieFileOutput将视频录制到文件中。如果需要的话,我可以从AVCamManual中粘贴一些设置代码,但我将首先提供允许问题显现的代码添加。首先,添加一个按钮,并将其目标设置为nextButtonHandler

还要将以下内容添加到AddObserver方法中:

- (void)addObservers
{
    ...

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(formatDidChange:) name:AVCaptureInputPortFormatDescriptionDidChangeNotification object:nil];
}
新代码:

- (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时,连接上的“活动”状态变为NO

我找不到关于这个主题的任何文档,所以其他问题/答案都没有提到它,只有一个主题说你应该检查连接的活动状态


我的主要问题是,为什么会发生这种情况?后来我了解到,如果我不使用AVCaptureMovieFileOutput,而是使用AVCaptureVideoDataOutput,而不指定音频输入,那么问题就不会发生。在捕获分辨率大于1080p的情况下,是否不支持使用音频录制视频?如果是这样的话,为什么苹果不在他们的文档中这样说呢?

这个问题与特定的设备有关,这意味着你在iPhone 4&5或者6系列上会崩溃,因为视频的分辨率与设备不同

您可以使用
sessionPreset
属性更改分辨率。会话预设的默认值为
AVCaptureSessionPresetHigh
,适用于高质量的视频和音频输出

只有当
canSetSessionPreset
:返回“是”时,才能设置预设 那个预设。可用性

在iOS 4.0及更高版本中提供

会话预设的可能值为:

视频输入预设

使用sessionPreset定义捕获设置预设的常量 财产

NSString*const AVCaptureSessionPresetPhoto

NSString*常量AVCaptureSessionPresetHigh

NSString*const AVCaptureSessionPresetMedium

NSString*常量AVCaptureSessionPresetLow

NSString*const AVCaptureSessionPreset352x288

NSString*常量AVCaptureSessionPreset640x480

NSString*const AVCaptureSessionPreset1280x720

NSString*常量AVCaptureSessionPreset1920x1080

NSString*常量AVCaptureSessionPresetiFrame960x540

NSString*常量AVCaptureSessionPresetiFrame1280x720

AVCaptureSessionPreset1920x1080

指定适合1080p质量(1920x1080)的捕获设置 像素)视频输出

在iOS 5.0及更高版本中提供

在AVCaptureSession.h中声明


请参阅:

此问题与特定设备有关,意味着您将在iPhone 4&5或6系列上崩溃,因为设备的视频分辨率不同

您可以使用
sessionPreset
属性更改分辨率。会话预设的默认值为
AVCaptureSessionPresetHigh
,适用于高质量的视频和音频输出

只有当
canSetSessionPreset
:返回“是”时,才能设置预设 那个预设。可用性

在iOS 4.0及更高版本中提供

会话预设的可能值为:

视频输入预设

使用sessionPreset定义捕获设置预设的常量 财产

NSString*const AVCaptureSessionPresetPhoto

NSString*常量AVCaptureSessionPresetHigh

NSString*const AVCaptureSessionPresetMedium

NSString*常量AVCaptureSessionPresetLow

NSString*const AVCaptureSessionPreset352x288

NSString*常量AVCaptureSessionPreset640x480

NSString*const AVCaptureSessionPreset1280x720

NSString*常量AVCaptureSessionPreset1920x1080

NSString*常量AVCaptureSessionPresetiFrame960x540

NSString*常量AVCaptureSessionPresetiFrame1280x720

AVCaptureSessionPreset1920x1080

指定适合1080p质量(1920x1080)的捕获设置 像素)视频输出

在iOS 5.0及更高版本中提供

在AVCaptureSession.h中声明


请参阅:

我还想了解有关如何在iOS设备上录制高分辨率(>1080p)音频视频的任何信息。我知道这是可能的,因为FiLMiC Pro iOS应用程序可以在iPhone 6s上实现。当我尝试同时使用AVCaptureVideoDataOutput和AVCaptureAudioDataOutput时,音频连接的活动状态对于任何格式>1080p都会变为否。您找到解决方案了吗?我还想了解有关如何在iOS设备上用音频录制高分辨率(>1080p)视频的信息。我知道这是可能的,因为FiLMiC Pro iOS应用程序可以在iPhone 6s上实现。当我尝试同时使用AVCaptureVideoDataOutput和AVCaptureAudioDataOutput时,音频连接的活动状态将变为NO for any format>1080p。您是否找到了解决方案?这并不能回答问题。我