2010-10-22 1 views
1
self.player = [[AVPlayer playerWithURL:[NSURL URLWithString:@"http://myurl.com/track.mp3"]] retain]; 

Я пытаюсь сделать UIProgressView для вышеуказанного трека. Как получить размер файла и текущий размер файла с этого URL-адреса? Пожалуйста, помогите, спасибо!Как получить размер файла и размер текущего файла из NSURL для AVPlayer iOS4.0

ответ

0

Я думаю, вы не хотите ничего знать о размерах файлов, но вас больше интересуют времена.

Пробег: self.player.currentItem.asset.duration Продолжительность текущей игры, self.player.currentTime для текущего времени.

+0

Да, я делаю ползунок с продолжительностью. Но если пользователь скользит мимо загруженного, то плохие новости. Так что я хочу прогресс загруженного/воспроизводимого трека, верно? Имеет ли это смысл? – slowman21

+0

Насколько я понимаю, я не уверен в этом, но вы можете включить поиск только в пределах диапазонов, указанных в 'self.player.currentItem.loadedTimeRanges'. – Michal

+0

Да, мне тоже нужно будет это сделать. Но все же было бы неплохо, если бы пользователи увидели, что загрузилось. Как настоящий стример. – slowman21

5

Вы должны начать наблюдать свойства loadedTimeRanges текущего элемента, например:

AVPlayerItem* playerItem = self.player.currentItem; 
[playerItem addObserver:self forKeyPath:kLoadedTimeRanges options:NSKeyValueObservingOptionNew context:playerItemTimeRangesObservationContext]; 

Затем в смотровом обратном вызове, вы осмысливать данные, которые вы прошли, как это:

-(void)observeValueForKeyPath:(NSString*)aPath ofObject:(id)anObject change:(NSDictionary*)aChange context:(void*)aContext { 

if (aContext == playerItemTimeRangesObservationContext) { 

    AVPlayerItem* playerItem = (AVPlayerItem*)anObject; 
    NSArray* times = playerItem.loadedTimeRanges; 

    // there is only ever one NSValue in the array 
    NSValue* value = [times objectAtIndex:0]; 

    CMTimeRange range; 
    [value getValue:&range]; 
    float start = CMTimeGetSeconds(range.start); 
    float duration = CMTimeGetSeconds(range.duration); 

    _videoAvailable = start + duration; // this is a float property of my VC 
    [self performSelectorOnMainThread:@selector(updateVideoAvailable) withObject:nil waitUntilDone:NO]; 
} 

Затем селектор в главном потоке обновляет индикатор, например так:

-(void)updateVideoAvailable { 

    CMTime playerDuration = [self playerItemDuration]; 
double duration = CMTimeGetSeconds(playerDuration); 
    _videoAvailableBar.progress = _videoAvailable/duration;// this is a UIProgressView 
} 
+0

Что представляет собой kLoadedTimeRanges? Я не могу найти это где-нибудь –

+0

, чтобы предотвратить ошибку копирования и вставки. убедитесь, что вы проверили массив times для count> 0. в iOS 8 он может вернуть пустой массив. –

0

@ "loadTimeRange" - значение KVO для класса AVPlayerItem. Вы можете найти его определение в файле AVPlayerItem.h в

@interface AVPlayerItem (AVPlayerItemPlayability) 

Категория определения.

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