0

懐中電灯アプリが完全に機能するようになりました。何らかの理由で、懐中電灯ボタンを非常に速くタップするたびに、アプリがフリーズして何もしません。AVCaptureSession stopRunning を呼び出すとフリーズするようです。トグル懐中電灯メソッドのコードを次に示します。また、このメソッドが最終的にストロボ機能に対して呼び出されるようにしたいと考えています。

- (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];
 }
}
4

3 に答える 3

5

上に貼り付けたコードの機能を実際に理解していますか、それとも別の場所からコピーしましたか?

あなたがしているのは、iOS にビデオ キャプチャ セッションを作成するように繰り返し要求しているためです。ビデオ キャプチャ セッションの作成は、CPU/メモリを大量に消費します。迅速に使用されるように設計または意図されたことはありません。ユーザーが数秒以内に複数のビデオ キャプチャ セッションを開始しようとする「通常の」使用例はありません。そのため、クラッシュが発生しています。

于 2011-01-21T04:59:35.177 に答える
5

以下は、LED をオンまたはオフにするために使用できる短いバージョンです。

- (void)torchOnOff: (BOOL) onOff
{
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    if ([device hasTorch]) {
        [device lockForConfiguration:nil];
        [device setTorchMode: onOff ? AVCaptureTorchModeOn : AVCaptureTorchModeOff];
        [device unlockForConfiguration];
    }
}
于 2011-11-01T09:51:21.037 に答える
0

アプリが AVCaptureSession を中心に展開する場合、アプリの存続期間中、AVCapture セッションの 1 つのインスタンスを実行し、そのセッションでトーチを切り替えるだけです。あなたは物事を複雑にしすぎています。前述のとおり、同じセッションを繰り返し作成しないでください。これは資源の無駄です。このテーマに関する WWDC '10 ビデオを見て、デモ プロジェクトに目を通しておくことをお勧めします。

于 2011-01-21T05:09:17.400 に答える