iPhone 5S上的AVCaptureMovieFileOutput崩溃

时间:2013-11-21 20:16:31

标签: iphone avfoundation avcapturemoviefileoutput

我的应用程序在iPhone 5S上崩溃,而不是在任何其他设备上,它指向startRecordingToOutputFileURL中引发的异常:recordingDelegate:

   Date/Time:           2013-11-01 13:18:03.672 -0400
   OS Version:          iOS 7.0.3 (11B511)
   Report Version:      104

   Exception Type:  EXC_CRASH (SIGABRT)
   Exception Codes: 0x0000000000000000, 0x0000000000000000
   Triggered by Thread:  0

    Last Exception Backtrace:
    0   CoreFoundation                  0x2f164e83 __exceptionPreprocess + 131
    1   libobjc.A.dylib                 0x394c56c7 objc_exception_throw + 38
    2   AVFoundation                    0x2e0679b9 -[AVCaptureMovieFileOutput startRecordingToOutputFileURL:recordingDelegate:] + 512

我没有iPhone 5S进行测试,也不想为此目的买一个。我检查了明显的错误,比如nil文件URL,nil委托,并且没有一个被击中。

我如何调试这个,任何想法?是否有可能进行远程测试并从beta测试仪的设备中提取日志?我检查过大多数日志提取应用程序无法在iOS 7上运行。

编辑:我强烈怀疑它与我设置AVCaptureDevice的方式有关。这是我的代码,如果我正确地做了,请指出。

以下是设置设备输入的方法。

    AVCaptureDeviceFormat *bestFormat = nil;

    CMVideoDimensions bestDimensions = {0.f, 0.f};
    CMVideoDimensions dimensions;

    NSInteger width = [self videoTrackWidth];
    NSInteger height = [self videoTrackHeight];

    NSInteger fps = [[self currentFPSFromSettings] integerValue];

    if (fps > 30) {
        [self configureCameraForHighFrameRate:device]; //No crash if this path is executed
    } else {
    /* crashes only if this path is executed */
        for ( AVCaptureDeviceFormat *format in [device formats] ) {
            CMFormatDescriptionRef formatDesc = [format formatDescription];
            dimensions = CMVideoFormatDescriptionGetDimensions(formatDesc);

            if (dimensions.width >= width && dimensions.height >= height) {
                for ( AVFrameRateRange *range in format.videoSupportedFrameRateRanges ) {
                    if (range.maxFrameRate >= fps) {
                        bestDimensions = dimensions;
                        bestFormat = format;
                        MPLog(@" -- Max FPS = %f", range.maxFrameRate);
                        break;
                    }
                }
            }
        }

        if (!bestFormat) {
            bestFormat = [[device formats] lastObject];
        }

        if ( bestFormat ) {
            if ( [device lockForConfiguration:NULL] == YES ) {
                device.activeFormat = bestFormat;
                MPLog(@"Device Max Zoom = %f", bestFormat.videoMaxZoomFactor);
                self.maxZoomSupportedByDevice = bestFormat.videoMaxZoomFactor;
                [device unlockForConfiguration];
            }
        }
    }

2 个答案:

答案 0 :(得分:0)

我有同样的问题。创建AVCaptureSession时,我的应用程序在iPhone 5s上崩溃。 在iTunes Connect中检查我的构建我发现它只在支持的体系结构下有armv7。 也许当我第一次创建存档时,我将我的iPhone 5c连接到Xcode,但是在没有连接手机的情况下重新创建它会创建一个支持armv7和arm64的新版本。 现在相同的代码适用于iPhone 5s。

答案 1 :(得分:0)

最终发现手动配置AVCaptureSession的方法存在问题,如问题中的源代码所述。在代码中,我试图找到支持30 fps&的AVCaptureDeviceFormat。具有尽可能高的视觉尺寸。我假设任何格式支持30 fps的最高尺寸是1920x1080,但iPhone 5s是第一个支持全部800万像素样本缓冲区@ 30 fps的设备。并且AVCaptureMovieFileOutput无法使用8 MP样本缓冲区进行编码和崩溃!