2010-10-14 1 views
3

Im пытается создать видео, которое показывает два видео один за другим, используя avcomposition на iphone. Этот код работает, но я могу видеть только одну из видео на весь период вновь созданного видеоПроблема с автофокусом IPhone

- (void) startEdit{ 

AVMutableComposition* mixComposition = [AVMutableComposition composition]; 

NSString* a_inputFileName = @"export.mov"; 
NSString* a_inputFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:a_inputFileName]; 
NSURL* a_inputFileUrl = [NSURL fileURLWithPath:a_inputFilePath]; 

NSString* b_inputFileName = @"output.mov"; 
NSString* b_inputFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:b_inputFileName]; 
NSURL* b_inputFileUrl = [NSURL fileURLWithPath:b_inputFilePath]; 

NSString* outputFileName = @"outputFile.mov"; 
NSString* outputFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:outputFileName]; 
NSURL* outputFileUrl = [NSURL fileURLWithPath:outputFilePath]; 

if ([[NSFileManager defaultManager] fileExistsAtPath:outputFilePath]) 
    [[NSFileManager defaultManager] removeItemAtPath:outputFilePath error:nil]; 



CMTime nextClipStartTime = kCMTimeZero; 

AVURLAsset* a_videoAsset = [[AVURLAsset alloc]initWithURL:a_inputFileUrl options:nil]; 
CMTimeRange a_timeRange = CMTimeRangeMake(kCMTimeZero,a_videoAsset.duration); 
AVMutableCompositionTrack *a_compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
[a_compositionVideoTrack insertTimeRange:a_timeRange ofTrack:[[a_videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:nextClipStartTime error:nil]; 

nextClipStartTime = CMTimeAdd(nextClipStartTime, a_timeRange.duration); 

AVURLAsset* b_videoAsset = [[AVURLAsset alloc]initWithURL:b_inputFileUrl options:nil]; 
CMTimeRange b_timeRange = CMTimeRangeMake(kCMTimeZero, b_videoAsset.duration); 
AVMutableCompositionTrack *b_compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
    [b_compositionVideoTrack insertTimeRange:b_timeRange ofTrack:[[b_videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:nextClipStartTime error:nil]; 



AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetLowQuality]; 
_assetExport.outputFileType = @"com.apple.quicktime-movie"; 
_assetExport.outputURL = outputFileUrl; 

[_assetExport exportAsynchronouslyWithCompletionHandler: 
    ^(void) { 
    [self saveVideoToAlbum:outputFilePath]; 
    }  
    ]; 

} 


- (void) saveVideoToAlbum:(NSString*)path{ 
if(UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(path)){ 
    UISaveVideoAtPathToSavedPhotosAlbum (path, self, @selector(video:didFinishSavingWithError: contextInfo:), nil); 
} 
} 

- (void) video: (NSString *) videoPath didFinishSavingWithError: (NSError *) error contextInfo: (void *) contextInfo { 
NSLog(@"Finished saving video with error: %@", error); 
} 

Я разместил весь код, как это может помочь кому-то еще.

не должен

nextClipStartTime = CMTimeAdd(nextClipStartTime, a_timeRange.duration); 

[b_compositionVideoTrack insertTimeRange:b_timeRange ofTrack:[[b_videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:nextClipStartTime error:nil]; 

добавить второе видео к концу первых

Приветствий

ответ

3

фигурного его. Должен иметь только один AVMutableCompositionTrack.

Как так:

CMTime nextClipStartTime = kCMTimeZero; 

    AVURLAsset* a_videoAsset = [[AVURLAsset alloc]initWithURL:a_inputFileUrl options:nil]; 
    CMTimeRange a_timeRange = CMTimeRangeMake(kCMTimeZero,a_videoAsset.duration); 
    AVMutableCompositionTrack *a_compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
    [a_compositionVideoTrack insertTimeRange:a_timeRange ofTrack:[[a_videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:nextClipStartTime error:nil]; 

    nextClipStartTime = CMTimeAdd(nextClipStartTime, a_timeRange.duration); 

    AVURLAsset* b_videoAsset = [[AVURLAsset alloc]initWithURL:b_inputFileUrl options:nil]; 
    CMTimeRange b_timeRange = CMTimeRangeMake(kCMTimeZero, b_videoAsset.duration); 
    [a_compositionVideoTrack insertTimeRange:b_timeRange ofTrack:[[b_videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:nextClipStartTime error:nil]; 
+0

Привет, не могли бы вы подтвердить меня, если это нормально работает на iphone 3G и с новейшей ОС. Я спрашиваю, потому что я не могу слиться с iphone 3G. – user574087

1

я не заметил изъян еще, но у меня есть несколько предложений:

Во-первых, захватить ошибку в insertTimeRange и все другие возможности и осмотреть его ,

Во-вторых, для простого случая добавления видео вы можете использовать AVMutableComposition без так много треков. Используйте «insertTimeRange: ofAsset: atTime: error:» с AVAssets, инициализированным из файлов, и вы значительно упростите свой код. Если вам нужно сделать что-то более сложное, например, кроссфейды, вам также необходимо будет использовать композицию видео и аудио-микс, и в этот момент вы сможете справиться со сложностью треков.

 Смежные вопросы

  • Нет связанных вопросов^_^