Как избежать размытости в начале и конце видео (даже после использования setPreferredVideoStabilizationMode:AVCaptureVideoStabilizationModeAuto)?

Мы записываем видео на 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)
}

person Crashalot    schedule 20.01.2016    source источник
comment
Пожалуйста, пришлите код видеозахвата. Это может помочь в имитации вашей проблемы.   -  person rkyr    schedule 21.01.2016
comment
Мы используем PBJVision для захвата видео, но опубликуем код здесь. Еще раз спасибо @rkyr!   -  person Crashalot    schedule 21.01.2016
comment
@rkyr есть предложения, Рома? В очередной раз благодарим за помощь!   -  person Crashalot    schedule 22.01.2016
comment
Да, у меня мало догадок. Но мне нужно попробовать. У меня проблемы с ноутбуком. Завтра попробую и сообщу. Я предполагаю, что проблема на самом деле в центре внимания   -  person rkyr    schedule 23.01.2016
comment
Предполагая, что вы не можете обойти размытие в начале/конце, можете ли вы начать захват раньше и отбросить эту часть?   -  person Rhythmic Fistman    schedule 23.01.2016
comment
@RhythmicFistman спасибо за предложение. То, что вы предлагаете, кажется возможным, но есть ли способ узнать, на каком кадре изображения становятся четкими, т. Е. На каком кадре прекращается размытость? В противном случае, просто слепой выбор кадра, кажется, не помогает решить основную проблему размытости?   -  person Crashalot    schedule 23.01.2016
comment
вы можете попробовать использовать AVCaptureVideoStabilizationModeCinematic   -  person oiledCode    schedule 26.01.2016
comment
@elio.d спасибо, но это не помогло. другие предложения?   -  person Crashalot    schedule 26.01.2016
comment
@rkyr есть предложения, Рома? Еще раз спасибо!   -  person Crashalot    schedule 28.01.2016
comment
@Crashalot, нет, извини. Кажется, что NCIXGreg прав. Приложение камеры по умолчанию может использовать другой уровень API. Вы можете попробовать открыть проблему в репозитории PBJVision.   -  person rkyr    schedule 31.01.2016


Ответы (2)


Видео размыто по своей природе. Видео со скоростью 24 или 30 кадров в секунду всегда будет иметь некоторое размытие в кадре, потому что таким образом наши глаза обманываются, заставляя поверить, что изображения действительно движутся. Более длинная выдержка позволяет камере создавать впечатление движения.

Фотографии используют гораздо более короткую выдержку (1/60 секунды или меньше), чтобы получить четкое неподвижное изображение.

Здесь есть некоторая информация о том, как сделать снимок во время записи видео:

Как программно делать фотографии во время записи видео

person KaterGreg    schedule 26.01.2016
comment
В принципе, то, что вы говорите, имеет смысл, но в этом коде захвата есть что-то другое по сравнению с приложением камеры по умолчанию, потому что первый или два кадра размыты в 50% случаев, если камеры недостаточно, тогда как этого не происходит. с приложением камеры по умолчанию. - person Crashalot; 28.01.2016

Я не знаю о структуре PBJVision, но вы можете проверить adjustingFocus устройства AVCaptureDevice перед извлечением нужного изображения.


По-видимому, вы можете проверить состояние фокусировки устройства с помощью метода PBJVision isAdjustingFocus.

person Community    schedule 28.01.2016
comment
Спасибо, мы на самом деле используем его метод для настройки фокуса перед захватом видео. Обновлю вопрос, чтобы отразить это. - person Crashalot; 28.01.2016