崩溃与AVFoundation视频拍摄(crashing on video capture with

2019-10-16 21:50发布

我想实现在使用AVFoundation我的应用程序的视频拍摄。 我下的viewDidLoad以下代码:

session = [[AVCaptureSession alloc] init];
movieFileOutput = [[AVCaptureMovieFileOutput alloc] init];
videoInputDevice = [[AVCaptureDeviceInput alloc] init];
AVCaptureDevice *videoDevice = [self frontFacingCameraIfAvailable];

if (videoDevice)
{
    NSError *error;

    videoInputDevice = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error];

    if (!error)
    {
        if ([session canAddInput:videoInputDevice])
            [session addInput:videoInputDevice];
        else 
            NSLog (@"Couldn't add input.");
    }

}


AVCaptureDevice *audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
NSError *audioError = nil;
AVCaptureDeviceInput *audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioCaptureDevice error:&audioError];

if (audioInput)
{
    [session addInput:audioInput];
}

movieFileOutput = [[AVCaptureMovieFileOutput alloc] init];

Float64 TotalSeconds = 35;          //Total seconds
int32_t preferredTimeScale = 30;    //Frames per second
CMTime maxDuration = CMTimeMakeWithSeconds(TotalSeconds, preferredTimeScale);   
movieFileOutput.maxRecordedDuration = maxDuration;

movieFileOutput.minFreeDiskSpaceLimit = 1024 * 1024;                        

if ([session canAddOutput:movieFileOutput])
    [session addOutput:movieFileOutput];

[session setSessionPreset:AVCaptureSessionPresetMedium];
if ([session canSetSessionPreset:AVCaptureSessionPreset640x480])        //Check size based configs are supported before setting them
    [session setSessionPreset:AVCaptureSessionPreset640x480];

[self cameraSetOutputProperties];


[session startRunning];

此代码是一个按钮即开始拍摄,除其他外执行:

NSString *outputPath = [[NSString alloc] initWithFormat:@"%@%@", NSTemporaryDirectory(), @"output.mov"];
NSURL *outputURL = [[NSURL alloc] initFileURLWithPath:outputPath];
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:outputPath])
{
    NSError *error;
    if ([fileManager removeItemAtPath:outputPath error:&error] == NO)
    {
        //Error - handle if requried
    }
}
[outputPath release];
//Start recording
[movieFileOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self];
[outputURL release];

当我尝试在设备上运行它,它,当我尝试加载所有的这是应该在发生的观点崩溃。 Xcode中给了我一个“主题1:EXC_BAD_ACCESS(代码= 1,地址=为0x4)在:

AVFoundation`-[AVCaptureDeviceInput _setDevice:]:
(stuff)
0x3793f608:  ldr    r0, [r1, r0]

错误在最后一行中给出。 我认为这事做与AVCaptureDeviceInput地方,但我消隐可能是什么。 有没有人有任何想法,我在这里失踪? 谢谢。

编辑:断点摆弄之后,我想通了,坠机发生在这一行:

AVCaptureDevice *videoDevice = [self frontFacingCameraIfAvailable];

所以,是与该方法? 下面是我为它的实现文件,也许什么是错在那里。

NSArray *videoDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
AVCaptureDevice *captureDevice = nil;
for (AVCaptureDevice *device in videoDevices)
{
    if (device.position == AVCaptureDevicePositionFront)
    {
        captureDevice = device;
        break;
    }
}

//  couldn't find one on the front, so just get the default video device.
if ( ! captureDevice)
{
    captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
}

return captureDevice;

编辑2:莫非也许是我使用

AVCaptureDevice *videoDevice = [self frontFacingCameraIfAvailable];

和“自我”在它扔扳手不知? 我知道,在创建的CALayer当它是可以做到的

CALayer *aLayer = [CALayer layer];

但是我不知道AVCaptureDevice相当于这一点,如果有一个。 我不知道它可能是些什么,所有账户我的代码看起来不错,我已经试过清洁工程,重新启动的Xcode,重新启动计算机等。

Answer 1:

I'm pretty sure the problem is that you're running the program on the simulator. The simulator can't use those resources.



Answer 2:

设法解决这个问题(也许)。

添加

@property (nonatomic, retain) AVCaptureDeviceInput *videoInputDevice; 

到接口,合成它在实施和使用这些方法来获得前置摄像头:

- (AVCaptureDevice *) cameraWithPosition:(AVCaptureDevicePosition) position
{
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *device in devices) {
    if ([device position] == position) {
        return device;
    }
}
return nil;
}

-(AVCaptureDevice *)frontFacingCamera
{
return [self cameraWithPosition:AVCaptureDevicePositionFront];

然后用它分配

videoInputDevice = [AVCaptureDeviceInput deviceInputWithDevice:[self frontFacingCamera] error:&error];

不是100%肯定,如果它的工作原理又因为现在它有麻烦节省,但它不会崩溃了。 会回来更新这个时候我知道,如果它工作或没有。



文章来源: crashing on video capture with AVFoundation