2011-01-21 85 views
0

我有我的Flashligh应用程序工作完美。出于某种原因,我每次点击手电筒按钮的速度非常快,应用程序只是冻结,并没有做任何事情。当我调用AVCaptureSession stopRunning时,它似乎冻结了。下面是我的切换手电筒方法的代码。我也希望这种方法最终被称为频闪功能。iPhone手电筒应用程序崩溃时,快速轻按按钮

- (void)toggleFlashlight{ 

    if (isTorchOn) { 

    // Start session configuration 
    [session beginConfiguration]; 

    [device lockForConfiguration:nil];  
    // Set torch to on 
    [device setTorchMode:AVCaptureTorchModeOn]; 

    [device unlockForConfiguration]; 
    [session commitConfiguration]; 

    [session startRunning]; 


} 
else { 
    [session stopRunning]; 
    [session release]; 
    session = nil; 

    session = [[AVCaptureSession alloc] init]; 

    // Create device input and add to current session 
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error: nil]; 
    [session addInput:input]; 

    // Create video output and add to current session  
    AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init]; 
    [session addOutput:output]; 
    [output release]; 
} 
} 

回答

5

您是否真的了解上面粘贴的代码是干什么的,还是从别的地方复制过?

因为你在做的是反复询问iOS创建视频捕捉会话,然后打开灯光。创建视频捕捉会话非常耗费CPU /内存。它从来没有被设计或打算快速使用 - 没有一种“正常”的用例,用户可以在几秒钟内尝试启动多个视频捕获会话。这就是你遇到碰撞的原因。

0

如果您的应用程序围绕AVCaptureSession进行,您应该在应用程序的整个生命周期中运行一个AVCapture会话实例,并简单地在该会话中切换火炬。你过于复杂的事情。如上所述,不要重复创建同一个会话。这是浪费资源。我建议观看WWDC上关于这个主题的10个视频并观看演示项目。

5

下面是一个较短的版本,你现在可以用它来打开或关闭LED:

- (void)torchOnOff: (BOOL) onOff 
{ 
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
    if ([device hasTorch]) { 
     [device lockForConfiguration:nil]; 
     [device setTorchMode: onOff ? AVCaptureTorchModeOn : AVCaptureTorchModeOff]; 
     [device unlockForConfiguration]; 
    } 
} 
相关问题