Ich versuche, zwei Videos zusammenzuführen, die ich nach der Aufnahme mit der Kamera als UIImagePickerController bekomme. Es ist mir gelungen, die Videos zu einem zu kombinieren, aber ich habe einige Probleme mit der Ausrichtung der Videos.Video dreht sich nicht mit AVMutableVideoCompositionLayerInstruction
Wie ich es mit dem UIImagePickerController verstanden habe, dass alle Videos im Querformat aufgenommen werden, bedeutet dies, dass die im Hochformat aufgenommenen Videos um 90 ° gedreht sind.
Nach jeder Aufnahme füge ich das neue Video zu einem Array
func imagePickerController(picker: UIImagePickerController!, didFinishPickingMediaWithInfo info:NSDictionary) {
let tempImage = info[UIImagePickerControllerMediaURL] as NSURL
videos.append(tempImage)
let pathString = tempImage.relativePath
self.dismissViewControllerAnimated(true, completion: {})
}
Dann, wenn ich will ich durch jedes Video gehen verschmelzen und eine Anweisung und fügt den Befehl zu einem anderen Array
var composition = AVMutableComposition()
let trackVideo:AVMutableCompositionTrack = composition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: CMPersistentTrackID())
let trackAudio:AVMutableCompositionTrack = composition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: CMPersistentTrackID())
var insertTime = kCMTimeZero
for i in 0...(videos.count-1){
let moviePathUrl = videos[i]
let sourceAsset = AVURLAsset(URL: moviePathUrl, options: nil)
let tracks = sourceAsset.tracksWithMediaType(AVMediaTypeVideo)
let audios = sourceAsset.tracksWithMediaType(AVMediaTypeAudio)
if tracks.count > 0{
var videoDuration = CMTimeRangeMake(kCMTimeZero, sourceAsset.duration);
let assetTrack:AVAssetTrack = tracks[0] as AVAssetTrack
let assetTrackAudio:AVAssetTrack = audios[0] as AVAssetTrack
trackVideo.insertTimeRange(videoDuration, ofTrack: assetTrack, atTime: insertTime, error: nil)
trackAudio.insertTimeRange(videoDuration, ofTrack: assetTrackAudio, atTime: insertTime, error: nil)
//Rotate
var rotater = AVMutableVideoCompositionLayerInstruction(assetTrack: assetTrack)
rotater.setTransform(assetTrack.preferredTransform, atTime: insertTime)
rotater.setOpacity(0.0, atTime: CMTimeAdd(insertTime, sourceAsset.duration))
instructions.append(rotater)
//Resize
var resizer = AVMutableVideoCompositionLayerInstruction(assetTrack: assetTrack)
resizer.setCropRectangle(CGRectMake(0, 0, 300, 300), atTime: insertTime)
instructions.append(resizer)
insertTime = CMTimeAdd(insertTime, sourceAsset.duration)
}
}
erstellen
Wenn ich alle Anweisungen erstellt habe, füge ich sie der Hauptanweisung hinzu und erstelle die Exportsitzung.
var instruction = AVMutableVideoCompositionInstruction();
instruction.timeRange = CMTimeRangeMake(kCMTimeZero, insertTime);
instruction.layerInstructions = instructions;
var mainCompositionInst = AVMutableVideoComposition()
mainCompositionInst.instructions = NSArray(object: instruction)
mainCompositionInst.frameDuration = CMTimeMake(1, 60);
mainCompositionInst.renderSize = CGSizeMake(300, 300);
var exporter = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetHighestQuality)
exporter.videoComposition = mainCompositionInst;
Was fehlt mir?
Immer noch das gleiche Problem, kein Unterschied –
Eigentlich glaube ich, dass Sie nur eine Instanz von 'rotater' brauchen. Da es nur eine Kompositionsspur für Videos gibt, müssen Sie 'rotater' außerhalb der Schleife deklarieren und die Transformation für die Startzeit jedes neuen Videos festlegen. Wenn Sie Videos verketten, müssen Sie die Deckkraft auch nicht auf 0 setzen. Der nächste wird einfach auftauchen. – jlw
Wenn ich dich richtig verstanden habe, erstelle ich das Drehen mit trackVideo direkt vor der Schleife. Dann setze ich innerhalb der Schleife die Transformation genau wie zuvor. Dies funktioniert auch nicht. :/ –