Sto cercando di combinare diversi video clip in uno utilizzando AVFoundation. posso creare un singolo video utilizzando AVMutableComposition usando il codice seguenteCome combinare clip video con differenti orientamento utilizzando AVFoundation
AVMutableComposition *composition = [AVMutableComposition composition];
AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
CMTime startTime = kCMTimeZero;
/*videoClipPaths is a array of paths of the video clips recorded*/
//for loop to combine clips into a single video
for (NSInteger i=0; i < [videoClipPaths count]; i++) {
NSString *path = (NSString*)[videoClipPaths objectAtIndex:i];
NSURL *url = [[NSURL alloc] initFileURLWithPath:path];
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
[url release];
AVAssetTrack *videoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
AVAssetTrack *audioTrack = [[asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
//set the orientation
if(i == 0)
{
[compositionVideoTrack setPreferredTransform:videoTrack.preferredTransform];
}
ok = [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [asset duration]) ofTrack:videoTrack atTime:startTime error:nil];
ok = [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [asset duration]) ofTrack:audioTrack atTime:startTime error:nil];
startTime = CMTimeAdd(startTime, [asset duration]);
}
//export the combined video
NSString *combinedPath = /* path of the combined video*/;
NSURL *url = [[NSURL alloc] initFileURLWithPath: combinedPath];
AVAssetExportSession *exporter = [[[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPreset640x480] autorelease];
exporter.outputURL = url;
[url release];
exporter.outputFileType = [[exporter supportedFileTypes] objectAtIndex:0];
[exporter exportAsynchronouslyWithCompletionHandler:^(void){[self combineVideoFinished:exporter.outputURL status:exporter.status error:exporter.error];}];
Il codice precedente funziona bene se sono stati registrati tutti i video clip con lo stesso orientamento (orizzontale o verticale). Tuttavia, se ho una miscela di orientamenti nelle clip, il video finale avrà una parte ruotata di 90 gradi a destra (o sinistra).
mi chiedevo c'è un modo per trasformare ogni clip allo stesso orientamento (ad esempio l'orientamento del primo clip) durante la composizione loro. Da quello che ho letto dal documento XCode AVMutableVideoCompositionLayerInstruction
sembra può essere utilizzato per trasformare AVAsset
, ma non sono sicuro di come creare e applicare diverse istruzioni livello diverso alle clip corrispondenti e utilizzare poi nella composizione (AVMutableComposition*
)
Qualsiasi aiuto sarebbe essere apprezzato!
sembra funzionare, però non ho incontrato le trasformazioni applicate successivamente problema – Song
strano. Non sto cercando di unire due file, sto solo cercando di ottenere un AVAssetExportSession per mantenere l'orientamento del video. Dovresti essere in grado di chiamare '[compositionVideoTrack setPreferredTransform: transform]' ma non funziona. Anche l'utilizzo del metodo non ha funzionato per me. Ma usando * entrambi * ha funzionato. Sembra un bug del framework. Sto anche usando l'impostazione della sessione di esportazione "AVAssetExportPresetPassthrough". – Dex
Ho anche problemi molto strani con i tempi. Più spesso, l'ultimo 1 o più del video viene troncato. – Dex