2016-10-17 5 views
5

Я выполнил учебное задание here для кэширования HLS, но элемент управления никогда не достигает ни одного из делегатов (из AVAssetDownloadDelegate).AVAssetDownloadDelegate методы для кэширования HLS, не получившие вызов

Я ничего не пропустил? Вот код, который я написал

- (void)setupAssetDownloader { 
    NSURL *assetURL = [NSURL URLWithString:@"STREAMING_HOST/video/hls/3729170.m3u8"]; 
    AVURLAsset *hlsAsset = [AVURLAsset assetWithURL:assetURL]; 

    urlSessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"assetDowloadConfigIdentifier"]; 
    avAssetDownloadSession = [AVAssetDownloadURLSession sessionWithConfiguration:urlSessionConfiguration assetDownloadDelegate:self delegateQueue:[NSOperationQueue mainQueue]]; 

    // Download movie 
    avAssetDownloadTask = [avAssetDownloadSession assetDownloadTaskWithURLAsset:hlsAsset assetTitle:@"downloadedMedia" assetArtworkData:nil options:nil]; 

//@{AVAssetDownloadTaskMinimumRequiredMediaBitrateKey : @(300000)} 


    [avAssetDownloadTask resume]; 

    AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithAsset:avAssetDownloadTask.URLAsset]; 
    AVPlayer *player = [[AVPlayer alloc ] initWithPlayerItem:playerItem]; 
    AVPlayerLayer *playerLayer = [[AVPlayerLayer alloc ] init]; 
    [playerLayer setPlayer:player]; 
    [playerLayer setFrame:self.view.frame]; 
    [self.view.layer addSublayer:playerLayer]; 
    [player play]; 
} 

#pragma mark - AVAssetDownloadDelegate 

- (void)URLSession:(NSURLSession *)session assetDownloadTask:(AVAssetDownloadTask *)assetDownloadTask didResolveMediaSelection:(AVMediaSelection *)resolvedMediaSelection { 

} 
- (void)URLSession:(NSURLSession *)session assetDownloadTask:(AVAssetDownloadTask *)assetDownloadTask didLoadTimeRange:(CMTimeRange)timeRange totalTimeRangesLoaded:(NSArray<NSValue *> *)loadedTimeRanges timeRangeExpectedToLoad:(CMTimeRange)timeRangeExpectedToLoad { 
    NSInteger percent = 0; 
    for (NSValue *value in loadedTimeRanges) { 
     CMTimeRange timeRange = [value CMTimeRangeValue]; 
     percent += CMTimeGetSeconds(timeRange.duration)/CMTimeGetSeconds(timeRangeExpectedToLoad.duration); 
    } 
    percent *= 100; 
    NSLog(@"Progress: %ld", (long)percent); 
} 

- (void)URLSession:(NSURLSession *)session assetDownloadTask:(AVAssetDownloadTask *)assetDownloadTask didFinishDownloadingToURL:(NSURL *)location { 
    NSString *localPath = location.relativePath; 
    NSLog(@"localPath: %@", localPath); 
    // TODO: Play downloaded file 
    // IMPORTANT: Don't move this file to another location. 
} 
+1

Это был очень полезный пример, независимо от вопроса. Спасибо! – Warpling

ответ

5

я бегу код на тренажере и

Загрузка HLS потоков не поддерживается на тренажере.

Я понял, когда использовал метод делегата, упомянутый ниже.

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { 

} 

И теперь борется за целый день, я нашел образец Яблока here и получил реальную причину проблемы.

+1

Эй, я использую тот же код на устройстве, но все же мои методы делегата не вызываются, любая идея? – Sikander