Tôi đang cố gắng kết hợp một số video clip thành một sử dụng AVFoundation. tôi có thể tạo một video duy nhất sử dụng AVMutableComposition sử dụng mã dưới đâyCách kết hợp các video clip với định hướng khác nhau bằng cách sử dụng 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];}];
Đoạn mã trên hoạt động tốt nếu tất cả các video clip được ghi lại trong cùng một định hướng (chân dung hoặc phong cảnh). Tuy nhiên nếu tôi có một hỗn hợp các định hướng trong các clip, video cuối cùng sẽ có một phần của nó xoay 90 độ sang phải (hoặc trái).
Tôi đã tự hỏi là có một cách để chuyển đổi tất cả các clip sang cùng một hướng (ví dụ: hướng của clip đầu tiên) trong khi soạn chúng. Từ những gì tôi đọc từ tài liệu XCode AVMutableVideoCompositionLayerInstruction
dường như có thể được sử dụng để chuyển đổi AVAsset
, nhưng tôi không chắc chắn cách tạo và áp dụng một số hướng dẫn lớp khác nhau cho các clip tương ứng và sau đó sử dụng trong bố cục (AVMutableComposition*
)
Bất kỳ trợ giúp nào được đánh giá cao!
có vẻ như đang hoạt động, tuy nhiên tôi không gặp phải các biến đổi đang được áp dụng sau này – Song
Lạ. Tôi không cố gắng hợp nhất hai tập tin, tôi chỉ cố gắng để có được một AVAssetExportSession để duy trì định hướng video. Bạn được cho là chỉ có thể gọi '[compositionVideoTrack setPreferredTransform: transform]' nhưng nó không hoạt động. Sử dụng phương pháp của bạn cũng không hiệu quả với tôi. Nhưng sử dụng * cả hai * đã hoạt động. Âm thanh như một lỗi khuôn khổ. Tôi cũng đang sử dụng cài đặt phiên xuất khẩu 'AVAssetExportPresetPassthrough'. – Dex
Tôi cũng gặp vấn đề rất lạ với thời gian. Thường xuyên hơn không, 1 giây cuối cùng của video bị cắt. – Dex