Próbuję połączyć kilka klipów wideo w jeden za pomocą AVFoundation. mogę utworzyć jeden film za pomocą AVMutableComposition przy użyciu kodu poniżejJak łączyć klipy wideo z inną orientacją za pomocą 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];}];
Powyższy kod działa poprawnie, jeśli wszystkie klipy wideo zostały nagrane w tej samej orientacji (pionowej lub poziomej). Jeśli jednak w klipach mam mieszankę orientacji, końcowe wideo będzie miało część obróconą o 90 stopni w prawo (lub w lewo).
Zastanawiam się, czy istnieje sposób przekształcania wszystkich klipów do tej samej orientacji (na przykład orientacji pierwszego klipu) podczas ich komponowania. Z tego co czytałem z dokumentu XCode AVMutableVideoCompositionLayerInstruction
wydaje może być używany do przekształcania AVAsset
, ale nie jestem pewien, w jaki sposób utworzyć i zastosować kilka różnych instrukcji warstwy do odpowiednich zacisków i używać wtedy w składzie (AVMutableComposition*
)
Każda pomoc będzie być docenionym!
wydaje się działać, jednak nie napotkałem transformacji, które zostały zastosowane później problem – Song
Dziwne. Nie próbuję scalić dwóch plików, tylko próbuję uzyskać AVAssetExportSession, aby zachować orientację wideo. Powinieneś po prostu zadzwonić do '[compositionVideoTrack setPreferredTransform: transform]', ale to nie działa. Używanie twojej metody też nie działa. Ale użycie * obu * działało. Brzmi jak błąd ramowy. Używam również ustawienia sesji eksportu "AVAssetExportPresetPassthrough". – Dex
Mam również bardzo dziwne problemy z czasem. Częściej niż nie, ostatnia 1 sekunda filmu zostaje odcięta. – Dex