9

現在、以下のコードを使用して iPhone 4 の LED ライトをオン/オフしていますが、問題なく動作していますが、唯一の問題は、LED をオンにするたびにわずかな遅延があることです。ただし、すぐにオフになります。ストロボのような機能を実装するには、すぐに起動する必要があります。これは、より便利だからです。

Apple のカメラ アプリや他の多くのアプリで、電源ボタンを押すと LED が瞬時にオン/オフすることに気付きました。

「セッション」や「デバイス」などのオブジェクトをインスタンス変数としてView Controllerに追加して、ロード時にiPhoneにこれらのオブジェクトを作成させようとしましたが、うまく機能させることができませんでした.

リンゴの WWDC サンプル コードも調べてみましたが、複雑なコードを解読できないようです。誰かがこれを理解するのを手伝ってくれますか?私はこれを機能させるために約4日間試みてきました.

.h

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>

@interface FlashlightViewController : UIViewController {

    AVCaptureSession *torchSession;
}

@property (nonatomic, retain) AVCaptureSession * torchSession;

- (void) toggleTorch;

@end

.m

#import "FlashlightViewController.h"

@implementation FlashlightViewController

@synthesize torchSession;

- (void)dealloc 
{
    [torchSession release];
    [super dealloc];
}

- (void)viewDidLoad 
{
    [self toggleTorch];
    [super viewDidLoad];
}

- (void) toggleTorch 
{
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    if ([device hasTorch] && [device hasFlash])
    {
        if (device.torchMode == AVCaptureTorchModeOff) 
        {
            NSLog(@"It's currently off.. turning on now.");

            AVCaptureDeviceInput *flashInput = [AVCaptureDeviceInput deviceInputWithDevice:device error: nil];
            AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];

            AVCaptureSession *session = [[AVCaptureSession alloc] init];

            [session beginConfiguration];
            [device lockForConfiguration:nil];

            [device setTorchMode:AVCaptureTorchModeOn];
            [device setFlashMode:AVCaptureFlashModeOn];

            [session addInput:flashInput];
            [session addOutput:output];

            [device unlockForConfiguration];

            [output release];

            [session commitConfiguration];
            [session startRunning];

            [self setTorchSession:session];
            [session release];
        }
        else {

            NSLog(@"It's currently on.. turning off now.");
            [torchSession stopRunning];
        }
    }
}
4

2 に答える 2

30

アプリの初期化中またはビューの読み込み中に、フラッシュLEDをオンにする前に、フラッシュ構成ブロックを除くすべて(すべてのセッションおよびデバイス構成のもの)を実行します。

次に、LEDをオンにするときにトーチモードをオンに設定します。何かのようなもの:

[self.myDevice lockForConfiguration:nil];
[self.myDevice setTorchMode:AVCaptureTorchModeOn];
[self.myDevice setFlashMode:AVCaptureFlashModeOn];
[self.myDevice unlockForConfiguration];

初期化中にmyDeviceが適切に構成されたプロパティであることを確認してください。

于 2010-10-21T00:45:48.147 に答える
1

少しネクロマンティックですが、これを行うための優れたライブラリがあります:

LARSTTorch

于 2014-02-14T17:36:03.700 に答える