Vermeiden von Unschärfe zu Beginn und am Ende des Videos (auch nach Verwendung von setPreferredVideoStabilizationMode: AVCaptureVideoStabilizationModeAuto)?
Wir nehmen Videos auf iOS auf, während wir @ verwendesetPreferredVideoStabilizationMode:AVCaptureVideoStabilizationModeAuto
, aber das Video wird zu Beginn und am Ende manchmal unscharf wiedergegeben (in der Mitte jedoch in Ordnung), was sehr problematisch ist, da wir das erste Bild als Standbild aufnehmen (um Video- und Fotofunktionen ohne zu ermöglichen) Kameramodus wechseln).
Wenn Sie das Gerät flach auf einen Schreibtisch stellen, werden alle Unschärfen beseitigt, sodass das gesamte Video durchgehend scharf ist. Dies deutet darauf hin, dass es etwas mit der Videostabilisierung zu tun hat. Gibt es jedoch eine andere Eigenschaft, die festgelegt werden muss?
Ist es wichtig, den Fokusmodus zu sperren?
Alle anderen Tipps zur Fehlerbehebung?
Hier ist die Videoaufnahmefunktion von PBJVision, welches wir benutzen:
- (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];
}];
}];
}
Dieser Code konfiguriert PBJVision und startet die Videoaufnahme:
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()
}
obald PBJ mit der Vorschau fertig ist, wird der Fokus der Kamera auf den Mittelpunkt des Bildschirms geleg
// 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)
}