2012-05-29 9 views
11

Ich habe kürzlich ein Problem mit AVMutableComposition entdeckt und ich bin auf der Suche nach einem Einblick in diese.AVMutableComposition Dreht Videos

Ich möchte Video in zwei Ausrichtungen aufnehmen können - Landschaft links und rechts. Wenn ich Videos im Querformat aufnehmen (die Home-Taste befindet sich rechts), werden sie der Komposition hinzugefügt und in der richtigen Ausrichtung abgespielt. Wenn ich es jedoch in der linken Orientierung (Home-Taste links) aufnehme, werden diese Clips verkehrt herum abgespielt.

ABER, sie werden nur umgekehrt gespielt, wenn sie in die Zusammensetzung eingefügt werden. Ansonsten spielen sie in der richtigen Ausrichtung. Warum kehrt die Komposition die Drehung von Clips um, die in der Landschaft aufgenommen wurden? Wie kann ich das beheben? Jede Hilfe wird geschätzt!

+0

Ich habe auch bemerkt, als auch, dass unabhängig davon, was ich tue dies geschieht. Einstellen der Aufnahmeausrichtung im Vorfeld, Drehen usw. Der Titel wird mit der rechten Seite abgespielt, wenn ich den ersten Clip allein spiele, aber sobald er zu einer Komposition kombiniert wird, wird er umgedreht. – bgoers

Antwort

27

Hier ist ein etwas einfacherer Weg, wenn Sie einfach die ursprüngliche Rotation beibehalten möchten.

+0

Diese Lösung funktionierte perfekt, um die ursprüngliche Rotation beizubehalten. – Brad

+0

kann nicht funktionieren beim Konvertieren in swift ??? –

+1

Wenn in der Komposition mehrere Spuren vorhanden sind, die unterschiedliche Transformationen aufweisen, können Sie nicht einfach auf die Transformation der einzelnen Spuren einstellen, Sie müssen dies jedoch anders kompensieren. –

8

Mein Problem gelöst. War endlich in der Lage, die Spur zu drehen und in den Rahmen zu übersetzen. Klappt wunderbar.

//setting up the first video based on previous recording 
    CMTimeRange videoDuration = CMTimeRangeMake(kCMTimeZero, [self.previousRecording duration]); 
    AVAssetTrack *clipVideoTrack = [[self.previousRecording tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 
    AVAssetTrack *clipAudioTrack = [[self.previousRecording tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; 
    [compositionVideoTrack insertTimeRange:videoDuration ofTrack:clipVideoTrack atTime:nextClipStartTime error:nil]; 
    [compositionAudioTrack insertTimeRange:videoDuration ofTrack:clipAudioTrack atTime:nextClipStartTime error:nil]; 

    //our first track instruction - set up the instruction layer, then check the orientation of the track 
    //if the track is in landscape-left mode, it needs to be rotated 180 degrees (PI) 
    AVMutableVideoCompositionLayerInstruction *firstTrackInstruction = 
     [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:clipVideoTrack]; 

    if([self orientationForTrack:clipVideoTrack] == UIDeviceOrientationLandscapeLeft) { 
     CGAffineTransform rotation = CGAffineTransformMakeRotation(M_PI); 
     CGAffineTransform translateToCenter = CGAffineTransformMakeTranslation(640, 480); 
     CGAffineTransform mixedTransform = CGAffineTransformConcat(rotation, translateToCenter); 
     [firstTrackInstruction setTransform:mixedTransform atTime:kCMTimeZero]; 
    } 
+0

Hi bgoers .... Ich habe auch das gleiche Problem ... Ich habe Ihren Code verwendet, aber ich bekomme Fehler in der Nähe [self orientationForTrack: clipVideoTrack] (Methode nicht gefunden) können Sie bitte helfen Sie mir in diesem ... – ask123

+0

Das war Eine Methode, die ich selbst definiert habe, um die Ausrichtung eines Tracks zu bestimmen. Es wurde ein AVAssetTrack als Parameter verwendet und dann die bevorzugte Ausrichtung verwendet. Ich änderte meinen ein bisschen, aber das sollte helfen http://stackoverflow.com/a/6046421/1415949 – bgoers

+0

Was ist '[self orientationForTrack:]'? Was ist die Implementierung? –

0

Ich denke, die Antwort ist sicher die beste Option, aber es ist nur teilweise richtig. Um es funktionieren zu lassen, müssen wir außerdem die Rendergröße des Exports, die Höhe und die Breite der natürlichen Größe des Portrait-Tracks anpassen.

ich es getestet und ich zitiere auch Programmieranleitung AVFoundation - Bearbeiten Abschnitt, der tatsächlich zu implementieren schlägt vor, was in der Antwort von @dizy vorgeschlagen, aber mit dem erwähnten Zusatz:

All AVAssetTrack Objekte haben eine preferredTransform Eigenschaft, die die Orientierungsinformationen für diese Asset-Spur enthält. Diese Transformation wird immer dann angewendet, wenn die Asset-Spur auf dem Bildschirm angezeigt wird. Im vorherigen Code wurde die Umwandlung der Ebenenanweisung auf die Transformation der Objektspur festgelegt, sodass das Video in der neuen Komposition nach der Anpassung der Rendergröße ordnungsgemäßanzeigt.

Der Code sollte dann wie dieser sein (nur zwei Zeilen hinzufügen):

// Grab the source track from AVURLAsset for example. 
AVAssetTrack *assetVideoTrack = [asset tracksWithMediaType:AVMediaTypeVideo].lastObject; 

// Grab the composition video track from AVMutableComposition you already made. 
AVMutableCompositionTrack *compositionVideoTrack = [composition tracksWithMediaType:AVMediaTypeVideo].lastObject; 

// Apply the original transform.  
if (assetVideoTrack && compositionVideoTrack) { 
    [compositionVideoTrack setPreferredTransform:assetVideoTrack.preferredTransform]; 
} 

flippedSize = CGSize(compositionVideoTrack.naturalSize.height, compositionVideoTrack.naturalSize.width); 
composition.renderSize = flippedSize; 

// Export..