未调用 HLS 缓存的 AVAssetDownloadDelegate 方法
AVAssetDownloadDelegate methods for HLS caching not getting called
我已经按照 here 给出的 HLS 缓存教程进行操作,但是控件从未到达任何委托( AVAssetDownloadDelegate )。
我错过了什么吗?
这是我写的代码
- (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.
}
我是 运行 模拟器上的代码
Downloading HLS streams is not supported on simulator.
我在使用下面提到的委托方法时想通了。
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
}
现在折腾了一整天,我找到了 Apple 的样本 here 并找到了问题背后的真正原因。
我最近遇到了同样的症状。
原来我的应用程序中有另一个对象设置后台 URL 会话。
let configuration = URLSessionConfiguration.background(withIdentifier: "[id]")
我一删除另一个会话,就开始收到预期的回调。
也许某个地方记录了一个应用程序不应设置多个后台下载会话,但无论如何这解决了我的问题。
我已经按照 here 给出的 HLS 缓存教程进行操作,但是控件从未到达任何委托( AVAssetDownloadDelegate )。
我错过了什么吗? 这是我写的代码
- (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.
}
我是 运行 模拟器上的代码
Downloading HLS streams is not supported on simulator.
我在使用下面提到的委托方法时想通了。
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
}
现在折腾了一整天,我找到了 Apple 的样本 here 并找到了问题背后的真正原因。
我最近遇到了同样的症状。
原来我的应用程序中有另一个对象设置后台 URL 会话。
let configuration = URLSessionConfiguration.background(withIdentifier: "[id]")
我一删除另一个会话,就开始收到预期的回调。
也许某个地方记录了一个应用程序不应设置多个后台下载会话,但无论如何这解决了我的问题。