13

を使用して iOS でビデオをキャプチャしますsetPreferredVideoStabilizationMode:AVCaptureVideoStabilizationModeAutoが、ビデオがまだ最初と最後でぼやけてしまうことがあります (ただし、中間では問題ありません)。最初のフレームを静止画像として取得するため (カメラモードを切り替えることなく、ビデオと写真の機能を有効にします)。

デバイスを机の上に平らに置くと、すべてのぼやけが取り除かれるため、ビデオ全体が全体的にシャープになります。これは、ビデオの安定化と関係があることを示唆していますが、設定する別のプロパティはありますか?

フォーカスモードのロックは重要ですか?

その他のトラブルシューティングのヒントはありますか?

以下は、使用するPBJVisionのビデオ キャプチャ関数です。

- (void)startVideoCapture
{
    if (![self _canSessionCaptureWithOutput:_currentOutput] || _cameraMode != PBJCameraModeVideo) {
        [self _failVideoCaptureWithErrorCode:PBJVisionErrorSessionFailed];
        DLog(@"session is not setup properly for capture");
        return;
    }

    DLog(@"starting video capture");

    [self _enqueueBlockOnCaptureVideoQueue:^{

        if (_flags.recording || _flags.paused)
            return;

        NSString *guid = [[NSUUID new] UUIDString];
        NSString *outputFile = [NSString stringWithFormat:@"video_%@.mp4", guid];

        if ([_delegate respondsToSelector:@selector(vision:willStartVideoCaptureToFile:)]) {
            outputFile = [_delegate vision:self willStartVideoCaptureToFile:outputFile];

            if (!outputFile) {
                [self _failVideoCaptureWithErrorCode:PBJVisionErrorBadOutputFile];
                return;
            }
        }

        NSString *outputDirectory = (_captureDirectory == nil ? NSTemporaryDirectory() : _captureDirectory);
        NSString *outputPath = [outputDirectory stringByAppendingPathComponent:outputFile];
        NSURL *outputURL = [NSURL fileURLWithPath:outputPath];
        if ([[NSFileManager defaultManager] fileExistsAtPath:outputPath]) {
            NSError *error = nil;
            if (![[NSFileManager defaultManager] removeItemAtPath:outputPath error:&error]) {
                [self _failVideoCaptureWithErrorCode:PBJVisionErrorOutputFileExists];

                DLog(@"could not setup an output file (file exists)");
                return;
            }
        }

        if (!outputPath || [outputPath length] == 0) {
            [self _failVideoCaptureWithErrorCode:PBJVisionErrorBadOutputFile];

            DLog(@"could not setup an output file");
            return;
        }

        if (_mediaWriter) {
            _mediaWriter.delegate = nil;
            _mediaWriter = nil;
        }
        _mediaWriter = [[PBJMediaWriter alloc] initWithOutputURL:outputURL];
        _mediaWriter.delegate = self;

        AVCaptureConnection *videoConnection = [_captureOutputVideo connectionWithMediaType:AVMediaTypeVideo];
        [self _setOrientationForConnection:videoConnection];

        _startTimestamp = CMClockGetTime(CMClockGetHostTimeClock());
        _timeOffset = kCMTimeInvalid;

        _flags.recording = YES;
        _flags.paused = NO;
        _flags.interrupted = NO;
        _flags.videoWritten = NO;

        _captureThumbnailTimes = [NSMutableSet set];
        _captureThumbnailFrames = [NSMutableSet set];

        if (_flags.thumbnailEnabled && _flags.defaultVideoThumbnails) {
            [self captureVideoThumbnailAtFrame:0];
        }

        [self _enqueueBlockOnMainQueue:^{                
            if ([_delegate respondsToSelector:@selector(visionDidStartVideoCapture:)])
                [_delegate visionDidStartVideoCapture:self];
        }];
    }];
}

このコードは PBJVision を構成し、ビデオ キャプチャを開始します。

private func initPBJVision() {
    // Configure PBJVision
    pbj.delegate = self
    pbj.cameraMode = .Video
    pbj.cameraOrientation = .Portrait
    pbj.focusMode = .AutoFocus
    pbj.outputFormat = .Preset
    pbj.cameraDevice = .Back
    pbj.thumbnailEnabled = false

    // Log status
    print("Configured PBJVision")

    pbj.startVideoCapture()
}

PBJ のプレビューの準備ができたら、カメラの焦点を画面の中央に合わせます。

// Called when PBJVision preview begins
func visionSessionDidStartPreview(vision: PBJVision) {
    // Focus screen at midpoint
    let focus_x = CGFloat(0.5)
    let focus_y = CGFloat(0.5)
}
4

2 に答える 2

2

ビデオはその性質上、ぼやけています。毎秒 24 または 30 フレームのビデオでは、写真が実際に動いていると目が騙されてしまうため、常にショットに多少のブレが生じます。シャッタースピードが長いほど、カメラが動きのある印象を与えることができます。

写真は、はるかに短いシャッター スピード (1/60 秒以下) を使用して、鮮明な静止画を撮影します。

ビデオの録画中に写真を撮る方法については、次の情報があります。

ビデオの録画中にプログラムで写真を撮る方法

于 2016-01-26T19:48:31.867 に答える
2

PBJVision フレームワークについてはわかりませんが、必要な画像を抽出する前に、AVCaptureDeviceの調整フォーカスを確認できます。


どうやら、PBJVisionisAdjustingFocusメソッドを使用してデバイスのフォーカス状態を確認できるようです。

于 2016-01-28T14:33:56.457 に答える