Dein Beitrag hat mir die Augen darüber geöffnet, wie die Videos-App von Apple Videos wiedergibt. Ich habe mehrere Elemente mit meiner App in den vier Ausrichtungen aufgenommen. Sie wurden alle ordnungsgemäß wiedergegeben. Ich habe gerade festgestellt, dass die Videos-App keine Rotation unterstützt wie der Player in der Fotoalbum-App. Die Videos-App erwartet, dass du das Gerät (zumindest mein iPod touch) im Querformat hältst. Ich habe einige Porträtaufnahmen gemacht, sie zu iTunes hinzugefügt und alle, einschließlich derjenigen, die mit der Kamera-App von Apple erstellt wurden, haben sich nicht gedreht, als ich das Gerät in die Hochformatposition gedreht habe.
Wie dem auch sei...
Meine App ist eine Zeitraffer-App, die keine zusätzliche Verarbeitung der Frames wie du machst durchführt, also kann es bei folgendem Ergebnisse geben. Ich habe meine App so eingerichtet, dass sie das Fenster nicht dreht, während das Gerät gedreht wird. Auf diese Weise arbeite ich immer mit einer Ausrichtung des Geräts. Ich verwende AVFoundation, um jeden N-ten Frame aus dem Video-Stream zu erfassen und auszugeben.
Wenn ich mich für die Aufnahme bereitmache, tue ich Folgendes.
inputWriterBuffer = [AVAssetWriterInput assetWriterInputWithMediaType: AVMediaTypeVideo outputSettings: outputSettings];
// Ich rufe das explizit auf, bevor die Aufnahme beginnt. Video wird richtig herum wiedergegeben.
[self detectOrientation];
inputWriterBuffer.transform = playbackTransform;
Diese detectOrientation ruft die folgende Methode auf. Ich habe den tatsächlichen Code hier zur Klarheit reduziert. In meiner App drehe ich auch einige Schaltflächen, also achte darauf, dass sie nicht die gleiche Transformation erhalten. Worauf du achten solltest, ist, wie ich das PlaybackTransform ivar einrichte.
-(void) detectOrientation {
CGAffineTransform buttonTransform;
switch ([[UIDevice currentDevice] orientation]) {
case UIDeviceOrientationUnknown:
NULL;
case UIDeviceOrientationFaceUp:
NULL;
case UIDeviceOrientationFaceDown:
NULL;
break;
case UIDeviceOrientationPortrait:
[UIButton beginAnimations: @"myButtonTwist" context: nil];
[UIButton setAnimationDuration: 0.25];
buttonTransform = CGAffineTransformMakeRotation( ( 0 * M_PI ) / 180 );
recordingStarStop.transform = buttonTransform;
[UIButton commitAnimations];
playbackTransform = CGAffineTransformMakeRotation( ( 90 * M_PI ) / 180 );
break;
case UIDeviceOrientationLandscapeLeft:
[UIButton beginAnimations: @"myButtonTwist" context: nil];
[UIButton setAnimationDuration: 0.25];
buttonTransform = CGAffineTransformMakeRotation( ( 90 * M_PI ) / 180 );
recordingStarStop.transform = buttonTransform;
[UIButton commitAnimations];
// Transformation hängt davon ab, welche Kamera das Video liefert
if (theProject.backCamera == YES) playbackTransform = CGAffineTransformMakeRotation( 0 / 180 );
else playbackTransform = CGAffineTransformMakeRotation( ( -180 * M_PI ) / 180 );
break;
case UIDeviceOrientationLandscapeRight:
[UIButton beginAnimations: @"myButtonTwist" context: nil];
[UIButton setAnimationDuration: 0.25];
buttonTransform = CGAffineTransformMakeRotation( ( -90 * M_PI ) / 180 );
recordingStarStop.transform = buttonTransform;
[UIButton commitAnimations];
// Transformation hängt davon ab, welche Kamera das Video liefert
if (theProject.backCamera == YES) playbackTransform = CGAffineTransformMakeRotation( ( -180 * M_PI ) / 180 );
else playbackTransform = CGAffineTransformMakeRotation( 0 / 180 );
break;
case UIDeviceOrientationPortraitUpsideDown:
[UIButton beginAnimations: @"myButtonTwist" context: nil];
[UIButton setAnimationDuration: 0.25];
buttonTransform = CGAffineTransformMakeRotation( ( 180 * M_PI ) / 180 );
recordingStarStop.transform = buttonTransform;
[UIButton commitAnimations];
playbackTransform = CGAffineTransformMakeRotation( ( -90 * M_PI ) / 180 );
break;
default:
playbackTransform = CGAffineTransformMakeRotation( 0 / 180 ); // Verwende die Standardrotation, obwohl wahrscheinlich andere Probleme auftreten, wenn wir hierhin kommen.
break;
}
}
Als Randnotiz, da ich möchte, dass die Methode aufgerufen wird, wann immer das Gerät gedreht wird, und ich die automatische Rotation ausgeschaltet habe, habe ich folgendes in meiner viewDidLoad-Methode.
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(detectOrientation) name:@"UIDeviceOrientationDidChangeNotification" object:nil];
Das ist ein Tipp, den ich in dieser SOF-Frage und -Antwort gefunden habe.
0 Stimmen
Gibt es einen Grund, warum Sie in OpenGL keine Rotation durchführen können, um die richtige Orientierung zu erhalten, bevor Sie die Pixel aus dem Rahmenpuffer auslesen? Auf diese Weise müssen Sie sich nicht um die Transformation kümmern, die im Header der MOV/MP4 platziert ist. Die Standardeinstellung wird einfach funktionieren.
0 Stimmen
Vielen Dank für diese Idee. Das Problem dabei ist jedoch, dass die Live-Ansicht auf dem Bildschirm korrekt ist - die falsche Ansicht erscheint nur, wenn ich das aufgenommene Video in der iPhone-Bibliothek speichere und abspiele, selbst die Aufnahme auf dem Desktop wird korrekt wiedergegeben.