2013-12-13 3 views
1

Я пытаюсь присоединиться к 2 существующим видео mpeg4 вместе на ipad2 со следующим кодом.AVAssetExportSession - Присоединяйтесь к файлам 2 mp4 в IOS

-(void)mergeTestVideos 
{ 

    //setup asset 
    NSString *firstassetpath = [NSString stringWithFormat:@"%@mpeg4-1.mp4", NSTemporaryDirectory()]; 
    NSString *secondassetpath = [NSString stringWithFormat:@"%@mpeg4-2.mp4", NSTemporaryDirectory()]; 

    NSFileManager *fileManager = [NSFileManager defaultManager]; 

    AVAsset *firstAsset = [AVAsset assetWithURL:[NSURL fileURLWithPath:firstassetpath]]; 
    AVAsset *secondAsset = [AVAsset assetWithURL:[NSURL fileURLWithPath:secondassetpath]]; 

    NSLog(@"FirstAsset Is Readable = %d", firstAsset.isReadable); 
    NSLog(@"FirstAsset Is playable = %d", firstAsset.isPlayable); 
    NSLog(@"FirstAsset Is exportable = %d", firstAsset.exportable); 
    NSLog(@"SecondAsset Is Readable = %d", secondAsset.isReadable); 
    NSLog(@"SecondAsset Is playable = %d", secondAsset.isPlayable); 
    NSLog(@"SecondAsset Is exportable = %d", secondAsset.exportable); 

    //setup composition and track 
    AVMutableComposition *composition = [[AVMutableComposition alloc]init]; 
    AVMutableCompositionTrack *track = [composition addMutableTrackWithMediaType:AVAssetExportPresetPassthrough preferredTrackID:kCMPersistentTrackID_Invalid]; 

    //add assets to track 
    [track insertTimeRange:CMTimeRangeMake(kCMTimeZero, firstAsset.duration) ofTrack:[[firstAsset tracksWithMediaType:AVMediaTypeVideo]objectAtIndex:0] atTime:kCMTimeZero error:nil]; 

    [track insertTimeRange:CMTimeRangeMake(kCMTimeZero, secondAsset.duration) ofTrack:[[secondAsset tracksWithMediaType:AVMediaTypeVideo]objectAtIndex:0] atTime:firstAsset.duration error:nil]; 

    // 5 - Create exporter 
    AVAssetExportSession *exporter = [[AVAssetExportSession alloc]initWithAsset:composition presetName:AVAssetExportPresetPassthrough]; 

    NSString *outputURL = [NSString stringWithFormat:@"%@mergedvid.mp4", NSTemporaryDirectory()]; 

    NSLog(@"%@", exporter.supportedFileTypes); 
    exporter.outputURL=[NSURL fileURLWithPath:outputURL]; 

    exporter.outputFileType = AVFileTypeMPEG4; 
    [exporter exportAsynchronouslyWithCompletionHandler:^{ 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self exportDidFinish:exporter]; 
     }); 
    }]; 

} 

-(void)exportDidFinish:(AVAssetExportSession*)session { 

    NSLog(@"export method"); 
    NSLog(@"%i", session.status); 
    NSLog(@"%@", session.error); 
} 

и выход заключается в следующем:

- FirstAsset Is Readable = 1 
- FirstAsset Is playable = 1 
- FirstAsset Is exportable = 1 
- SecondAsset Is Readable = 1 
- SecondAsset Is playable = 1 
- SecondAsset Is exportable = 1 
- (
"com.apple.quicktime-movie", 
"com.apple.m4a-audio", 
"public.mpeg-4", 
"com.apple.m4v-video", 
"public.3gpp", 
"org.3gpp.adaptive-multi-rate-audio", 
"com.microsoft.waveform-audio", 
"public.aiff-audio", 
"public.aifc-audio", 
"com.apple.coreaudio-format" 
) 
-export method 
- 4 
- Error Domain=AVFoundationErrorDomain Code=-11838 "Operation Stopped" UserInfo=0x155f76f0 {NSLocalizedDescription=Operation Stopped, NSLocalizedFailureReason=The operation is not supported for this media.} 

ИТАК в соответствии с выходным мои файлы находятся в порядке, и экспортируемый и mp4 является поддерживаемый тип вывода.

Кто-нибудь есть какие-либо идеи, почему он дает мне ошибку «Операция не поддерживается для этого средства массовой информации»

ответ

2

Я думаю, что это утверждение вашего преступник

AVMutableCompositionTrack *track = [composition addMutableTrackWithMediaType:AVAssetExportPresetPassthrough preferredTrackID:kCMPersistentTrackID_Invalid]; 

Здесь вы передаете AVAssetExportPresetPassthrough где вы должны были использовать AVMediaTypeVideo или AVMediaTypeAudio

+0

Ok спасибо Я попытался это, но, к сожалению, я не думаю, что это правильно, потому что объект AVAssetExportSession не удается построить (это равный нулю), когда я меняю код на это. Вот что происходит -> NSLog (@ "Экспортер:% @ \ n", экспортер); Экспортер: (null) – Jamesla

+0

Что вы имеете в виду под этим флагом? Вы используете неправильное постоянное значение. Вы можете проверить документацию на Apple для поддерживаемых значений в этом методе. Я думаю, вы должны проверить проект AVSimpleEditor от Apple. https://developer.apple.com/library/ios/samplecode/AVSimpleEditoriOS/Introduction/Intro.html#//apple_ref/doc/uid/DTS40012797 –

+0

Извините, что я испортил (изменен экспортер в AVMediaTypeVideo, а не на трек). были мертвы правильно. Я вручу вам приз :) Спасибо за вашу помощь Гаураву. – Jamesla

1

Если вы вступаете в тройку пользователей, то почему вы используете kCMTimeZero в обоих местах при вводе временного интервала. Я думаю, что это должно быть

[track insertTimeRange:CMTimeRangeMake(kCMTimeZero, firstAsset.duration) ofTrack:[[firstAsset tracksWithMediaType:AVMediaTypeVideo]objectAtIndex:0] atTime:kCMTimeZero error:nil]; 

[track insertTimeRange:CMTimeRangeMake(kCMTimeZero, secondAsset.duration) ofTrack:[[secondAsset tracksWithMediaType:AVMediaTypeVideo]objectAtIndex:0] atTime:firstAsset.duration error:nil]; 

См изменения в atTime при вставке временной диапазон для secondAsset

+0

Хорошая пятнистость! Спасибо за это. К сожалению, я все еще придерживаюсь оригинальной проблемы после ее изменения. – Jamesla

+0

Попробуйте изменить AVAssetExportPresetPassthrough на AVMediaTypeVideo.? –

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