2011-01-21 81 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]; 
    } 
} 
相關問題