2016-10-18 2 views
0

Возможно ли создать объект AVAsset с двумя URL-адресами, один для аудио и другой для видеодорожки?AVAsset с отдельными видео и аудио-адресами (iOS)

Я пробовал его с AVMutableComposition, но, кажется, сначала загружает все содержимое и буферизует его где-нибудь, прежде чем начнется воспроизведение видео + аудио. В документации AVComposition говорится, что файловые активы могут быть объединены, но мне нужен способ объединения ресурсов на основе url.

Или есть опция, которая может быть установлена ​​для AVComposition, чтобы начать воспроизведение перед загрузкой всего содержимого?

Редактировать

Это, как я попробовал:

NSDictionary *urlAssetOptions = @{AVURLAssetPreferPreciseDurationAndTimingKey: [NSNumber numberWithBool:NO]}; 

AVMutableComposition *composition = [AVMutableComposition composition]; 


NSURL *audioUrl = [NSURL URLWithString:@"http://..."]; 
AVURLAsset *audioAsset = [AVURLAsset URLAssetWithURL:audioUrl options:urlAssetOptions]; 

AVMutableCompositionTrack *audioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
[audioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration) ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:nil]; 


NSURL *videoUrl = [NSURL URLWithString:@"http://..."]; 
AVURLAsset *videoAsset = [AVURLAsset URLAssetWithURL:videoUrl options:urlAssetOptions]; 

AVMutableCompositionTrack *videoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
[videoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:nil]; 


AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:composition]; 
+0

Простейшим way..create два AVAssets. \ –

+0

@Gagan_iOS Как я тогда должен создать объект AVPlayerItem с этими двумя AVAssets? – selcuksinan

ответ

0

Решения использовать не требует, чтобы загрузить все содержимое, чтобы начать создание изменяемой композиции, ни для начала воспроизведения композиции вы создали. Однако для загрузки длительности и треков каждого из файлов требуется загрузка части медиафайлов.

Ниже приведен рабочий код, который использует URL-адреса для файлов mp3 и mp4, найденных google для создания изменчивой композиции и передачи ее в AVPlayerViewController. Если вы запустите код, вы можете заметить, что он начинает воспроизведение довольно быстро, но если вы перейдете через временную шкалу видео, вы обнаружите, что требуется много времени для загрузки данных за запрошенное время.

NSURL *audioURL = [NSURL URLWithString:@"http://www.mfiles.co.uk/mp3-downloads/Toccata-and-Fugue-Dm.mp3"]; 
AVAsset *audioAsset = [AVAsset assetWithURL:audioURL]; 

NSURL *videoURL = [NSURL URLWithString:@"http://thv1.uloz.to/6/c/4/6c4b50308843dd29c9176cc2c4961155.360.mp4?fileId=20389770"]; 
AVAsset *videoAsset = [AVAsset assetWithURL:videoURL]; 

CMTime duration; 
if (CMTimeGetSeconds(audioAsset.duration) < CMTimeGetSeconds(videoAsset.duration)) { 
    duration = audioAsset.duration; 
} else { 
    duration = videoAsset.duration; 
} 

NSError *error; 

AVMutableComposition* mixAsset = [[AVMutableComposition alloc] init]; 

AVMutableCompositionTrack* audioTrack = [mixAsset addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
[audioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, duration) ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error: &error]; 

AVMutableCompositionTrack* videoTrack = [mixAsset addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
[videoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, duration) ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error: &error]; 

AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:mixAsset]; 

AVPlayerViewController* playerController = [AVPlayerViewController new]; 
playerController.player = [AVPlayer playerWithPlayerItem:playerItem]; 

[self presentViewController:playerController animated:YES completion:nil];