Verlustfreier iOS 7-Video-Zoombericht von Imaging & Video-Guru

  • Teile Das
Harris Imagan

Dieser Artikel ist für Programmierer und Personen, die sich für Videoaufnahmen interessieren, sehr zu empfehlen.

Ab iOS 7 Beta 2 kann die integrierte Kameraanwendung die zusätzlichen Pixel des Sensors beim Zoomen nicht nutzen. Das können derzeit nur benutzerdefinierte Apps von Drittanbietern. Hoffentlich behebt Apple die Kamera in der endgültigen Version von iOS 7; Sollten Sie vorher Zoomen beim Aufnehmen von Videos verwenden wollen, vermeiden Sie die Verwendung der Kamera-App und stellen Sie sicher, dass Sie eine iOS 7-spezifische Videorecorder-Anwendung schreiben oder installieren, um beste Ergebnisse zu erzielen.

Viele meiner Leser haben um eine vollständige Ausarbeitung der brandneuen Zoomfunktionen von iOS 7 gebeten, sowohl in der Standard-Kameraanwendung als auch in der programmatischen API-Unterstützung ( AVCaptureDevice.videoZoomFactor und die zugehörigen, äußerst nützlichen Eigenschaften AVCaptureDevice.activeFormat.videoZoomFactorUpscaleThreshold und AVCaptureDevice.activeFormat.videoMaxZoomFactor ) Mein Hauptziel war herauszufinden, ob iOS 7 so etwas wie das ehrwürdige, atemberaubende Nokia PureView 808 implementiert hat, das bei der Aufnahme von Full-HD-Videos verlustfrei auf den Zoomfaktor von vier zoomen kann (und sogar noch mehr, wenn Filmmaterial mit niedrigerer Auflösung aufgenommen wird). .

Ich habe einige GROSSE Neuigkeiten für Sie alle : Während der Standard-Kamera-Client (ab dem gerade veröffentlichten iOS 7 b2) keinen Gebrauch macht die zusätzlichen Pixel auf dem Sensor beim Zoomen , wenn Sie Ihren eigenen Videorecorder schreiben und den Zoom einstellenselbst programmieren, das System wird.

Beginnen wir mit meinen Messergebnissen der Standardkamera nach einer kurzen Einführung in die Frage des verlustfreien Zoomens. Dann fahren wir mit denen meiner benutzerdefinierten Test-App fort und werfen zum Schluss einen Blick auf den Quellcode einer echten iOS 7-App mit Zoom.

Wie üblich, Ich habe das Testchart nach ISO 12233 zum Messen der Auflösung verwendet. Da der standardmäßige Kamera-Client nur Full-HD-Videos aufzeichnet, habe ich auch in meinen programmatischen Tests dieselbe Full-HD-Ausgabeauflösung verwendet, sodass Sie die Ergebnisse direkt vergleichen können.

1. Das theoretische Maximum des verlustfreien Zooms

Wenn Sie die Fachpresse in den letzten 16 Monaten verfolgt haben, haben Sie bereits vom Nokia PureView 808 und seinem hervorragenden Kameramodul gehört. Es ermöglicht (fast) verlustfreien Zoom bis zu 4x bei der Aufnahme von Full-HD-Videos. (Einige ausgezeichnete, sehr empfehlenswerte Vergleichsaufnahmen zwischen dem 1x- und 4x-Zoom finden Sie HIER, ganz unten auf der Seite.)

Das iPhone 4S und 5 haben „nur“ einen 8-Megapixel-Sensor (während das Nokia 808 einen 41-Megapixel-Sensor hat), was bedeutet, dass sie theoretisch nur einen verlustfreien Zoom bis zu 1,7x verwenden könnten (3264 horizontale Quellpixel/1920 horizontale Zielpixel = 1,7). In der Praxis liegt die Obergrenze jedoch etwas niedriger bei 1,454545.

Bei richtiger Implementierung sollte Video-Zoom bei diesem Zoomfaktor fast ebenso gute Ergebnisse liefern können(1.454545x) als ohne Zoomen. Mal sehen, wie iOS 7 in dieser Hinsicht abschneidet!

2. Die Stock-Kamera-App

Wie bereits erwähnt, nutzt der integrierte Zoom-Schieberegler im Stock-Kamera-Client sowohl in iOS 7 b1 als auch in b2 die zusätzlichen Pixel nicht, um verlustfrei zu liefern Zoom.

Beim Erstellen eines Testvideomaterials habe ich einen Wert auf dem Zoom-Schieberegler nahe (aber nicht höher) als das oben genannte Maximum eingestellt, nämlich 1,454545x (beachten Sie den Schieberegler am unteren Rand von den Bildschirm im Hochformat):

Mit der obigen Einstellung sieht das Ergebnis der Neukartierung wie folgt aus:

Der Punkt, an dem die Linien nicht mehr unterscheidbar sind, liegt um die 8-Markierung herum. Darüber hinaus gibt es absolut kein Detail. (Zum Vergleich: ohne Zoomen liegt er bei 10,8, was 1080 Pixelzeilen entspricht).

Erwartungsgemäß hat er eine sehr schlechte Auflösung bei maximalem (3x) Zoom:

In diesem Ausschnitt ist nicht einmal der Punkt zu sehen, an dem die parallelen Linien nicht mehr erkennbar sind. Hier beginnen die Noten bei 5,5. Wenn Sie sich das vollständige Originalbild genau ansehen (klicken Sie auf das Miniaturbild, um es anzuzeigen), können Sie leicht erkennen, dass es um die 5-Marke herum liegt.

Schließlich, wie es immer bei allen hergestellten iPhone- und iPad-Modellen der Fall war Nach 2009 sind die Ergebnisse mit dem standardmäßigen 1-fachen Zoom hervorragend und nutzen die Auflösung tatsächlich fast vollständig ausFähigkeiten der Ausgabedatei:

All dies mehrfach getestet auf der GSM-Version des iPhone 5 ( Modell A1429, Herstellungsdatum: Woche 22 von 2013), aber da dies ein software- und nicht hardwarespezifisches Problem ist, muss es sich auf anderen, iOS7-fähigen Modellen genauso verhalten.

3. In eigene Apps hineinzoomen

Wie bereits erläutert, trifft das obige Problem nicht auf das Einzoomen in den eigenen Kamerarecorder-Client zu. Meine gründlich getesteten Ergebnisse lauten wie folgt:

1. 454545-facher Zoom (d. h. das theoretische Maximum des verlustfreien Zoombereichs):

3-facher Zoom:

Nachdem Sie die Ergebnisse aus Abschnitt 2 oben verglichen haben, können Sie sehen, dass beide immens besser sind als die der standardmäßigen Kamera-App. Tatsächlich ist der 1,4-fache Zoom nur ein wenig schlechter als der 1-fache (siehe die letzte Aufnahme in Abschnitt 2), in dem er mit dem ziemlich kleinen Qualitätsverlust beim Nokia PureView 808 vergleichbar ist, wenn er (wieder) auf 4-fach hineingezoomt wird , siehe den Vergleich des GSM Arena-Testberichts).

4. Nur für Programmierer: Verwenden von Zoom in Ihren eigenen Apps

Die Verwendung des Zooms ist wirklich einfach – im Grunde müssen Sie lediglich die videoZoomFactor-Eigenschaft Ihrer tatsächlichen AVCaptureDevice-Instanz mit GUI-Steuerelementen verbinden; zum Beispiel ein Schieberegler. Im folgenden Code habe ich ihn nur so vorprogrammiert, dass er den Wert von hatAVCaptureDevice.activeFormat.videoZoomFactorUpscaleThreshold (eine schreibgeschützte Eigenschaft, die für den aktuellen Videomodus spezifisch ist); also der maximale Zoomfaktor, auf den noch ohne Qualitätsverlust gezoomt werden kann:

self.videoDevice.videoZoomFactor = videoDevice.activeFormat .videoZoomFactorUpscaleThreshold;

Beachten Sie, dass es eine weitere Zoom-spezifische, schreibgeschützte Eigenschaft gibt, AVCaptureDevice.activeFormat.videoMaxZoomFactor . Es ist im Allgemeinen so eingerichtet, dass ein 10x10-Pixel-Bereich zum Zoomen bereitgestellt wird. Deshalb hat er für Full HD den Wert 108, was einem satten 108-fachen Zoom entspricht. Natürlich werden Sie nicht so große Werte verwenden wollen.

Beachten Sie auch, dass alle 4:3-Modi mit niedriger Auflösung eingeteilt werden (zusammen mit dem 720p60-Modus, siehe meinen nächsten Artikel). , sie halbieren im Wesentlichen den maximalen verlustfreien Zoomfaktor. Zum Beispiel könnte Modus 0, der die niedrigste Auflösung von 192x144 hat, einen verlustfreien Zoom bis zu 17x (3264p/192p = 17) ohne Binning verwenden. Da jedoch Modus 0 gebinnt wird, wird dieser Wert halbiert; Aus diesem Grund können Sie nur einen verlustfreien Zoomfaktor von 8,5 verwenden (siehe Video ZoomFactorUpscaleThreshold ). Aus diesem Grund (Binning) können die 720p60-Modi nur einen verlustfreien Zoomfaktor von 1,05 verwenden, während die (nicht gebinnten) 720p30-Modi verlustfrei bis zu 2,18-fach zoomen können.

Ein Beispiel (das vollständige Projekt finden Sie HIER) ist wie folgt. Es präsentiert eine Start-Schaltfläche in derobere rechte Ecke. Nach dem Antippen wird die Methode startVideoRecording aufgerufen. Erst dann wird die Zoomstufe eingestellt. Sie können die Aufnahme stoppen, indem Sie erneut auf die Schaltfläche tippen (die bei der Aufnahme in „ Stopp “ umbenannt wird). Die aufgezeichneten Videos befinden sich im Dokumentenverzeichnis der App, auf die über iTunes File Sharing zugegriffen werden kann (ich habe UIFileSharingEnabled in der Haupt-PLIST-Datei aktiviert).

Wie ich programmgesteuert bin Beim Erstellen und Anzeigen der Start-/Stopp-Schaltfläche habe ich nur den View Controller des Projekts geändert (zusätzlich zum Hinzufügen von UIFileSharingEnabled zur Hauptliste natürlich). Die .h-Datei:

#import

#import

@interface iOS760fpsRecorderViewController : UIViewController

@property ( beibehalten) AVCaptureVideoPreviewLayer *previewLayer;

@property (beibehalten) AVCaptureSession *captureSession;

@property (beibehalten) AVCaptureDevice *videoDevice;

@property (beibehalten) AVCaptureMovieFileOutput* fo;

@property (beibehalten) UIButton* startStopButton;

@end

Die .m-Datei:

#import "iOS760fpsRecorderViewController.h"

@interface iOS760fpsRecorderViewController ()

@end

@implementation iOS760fpsRecorderViewController

@synthesize captureSession;

@synthesize previewLayer, fo, videoDevice, startStopButton;

- (void)viewDidLoad

{

;

self.startStopButton = initWithFrame:CGRectMake(40, 40, 80, 60)];

;

// 1. Sitzung

self.captureSession = init];

// 2. in

self.videoDevice = ;

NSError *error;

AVCaptureDeviceInput *videoIn = ;

if (!error) {

if ()

;

else

NSLog(@"Video input add-to-session failed");

}

else

NSLog(@"Erstellung der Videoeingabe fehlgeschlagen");

// 3. out

self.fo = init];

;

// 4. Vorschau anzeigen

self .previewLayer = initWithSession:self.captureSession];

previewLayer.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size. Höhe);

previewLayer.contentsGravity = kCAGravityResizeAspectFill;

;

;

;

}

-(NSUInteger)supportedInterfaceOrientations{

NSLog(@"supportedInterfaceOrient ations");

return UIInterfaceOrientationMaskPortrait;

}

-(void)startVideoRecording

selectedAVCaptureDeviceFormatIdx==13)

videoDevice.activeVideoMaxFrameDuration = CMTimeMake(1,60);

NSLog(@">

NSLog(@"videoZoomFactorUpscaleThreshold: %f", videoDevice.activeFormat.videoZoomFactorUpscaleThreshold);

self.videoDevice.videoZoomFactor = videoDevice.activeFormat.videoZoomFactorUpscaleThreshold;

//        self.videoDevice.videoZoomFactor = 3;

;

int fileNamePostfix = 0;

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = ;

NSString *filePath = nil;

do

filePath =;

while ( fileExistsAtPath:filePath]);

NSURL* fileURL = ] ;

;

- (void)captureOutput:(AVCaptureFileOutput *)captureOutput didStartRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray *)connections

{}

- (void)buttonPressed

{

if ()

{

;

;

}

sonst

{

;

;

}

}

- (void)didReceiveMemoryWarning

{

;

}

@Ende

Hallo! Ich bin Autor dieser Seiten. Ich hoffe, dass meine Artikel für Sie nützlich sind