首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不工作于设备的AVAssetResourceLoaderDelegate方法

不工作于设备的AVAssetResourceLoaderDelegate方法
EN

Stack Overflow用户
提问于 2014-10-30 09:55:51
回答 4查看 4.3K关注 0票数 5

我一直在开发一个简单的AVPlayer来播放加密的HLS媒体。

我使用AVAssetResourceLoaderDelegate来处理密钥检索过程,这样加密的媒体就可以使用有效的密钥进行播放。

这个程序在模拟器上运行得很好,但是在设备上根本不工作。

以下是密码:

代码语言:javascript
复制
- (void) playUrlByAVPlayer:(NSString *) videoUrl
{
    NSURL *streamURL = [NSURL URLWithString:videoUrl];

    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:streamURL options:nil];

    [asset.resourceLoader setDelegate:self queue:dispatch_get_main_queue()];

    self.playerItem = [AVPlayerItem playerItemWithAsset:asset];                           
    self.player = [AVPlayer playerWithPlayerItem:self.playerItem];

    self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
    [self.playerLayer setFrame:self.view.frame];
    [self.view.layer addSublayer:self.playerLayer];

    [self.player play];
}

经过一些调试后,我意识到委托方法shouldWaitForLoadingOfRequestedResource从未在设备上被调用。

我曾阅读过其他有关问题:

AVAssetResourceLoaderDelegate not being called

AVAssetResourceLoaderDelegate - Only requests first two bytes?

我试着将所有代码封装在一个dispatch_asyncdispatch_get_main_queue块中,但是解决我的问题没有任何进展。

目前,我上面的代码没有包含在任何调度队列块中。

对这个问题有什么想法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-12-29 16:25:08

如果您查看Apple示例代码,其中显示了bipbop.m3u8 HLS回放,您将看到它们正在为实际的http请求使用掩码:"http:/host/bipbop.m3u8“=>”定制方案:/host/bipbop.m3u8“应该对播放列表子资源使用相同的技巧。

否则,avplayer将忽略AVAssetResourceLoaderDelegate并直接加载数据。

您需要实现某种映射:

代码语言:javascript
复制
NSString* videoUrl = @"fake_scheme://host/video.m3u8";
NSURL *streamURL = [NSURL URLWithString:videoUrl];
票数 7
EN

Stack Overflow用户

发布于 2015-04-29 18:11:51

正如我在另一个线程中提到的,只有当我们使用“非标准/非保留”url方案时,AVAssetResourceLoaderDelegate才能工作。HTTP、HTTPS等被认为是保留的URL方案,如果URL有这些方案之一,iOS将不会进行委托调用。我最后所做的是使用my_own_http作为http,my_own_https用于https urls。在我做了那个改变之后效果很好。正如你所知道的,这使得你的播放列表在其他设备上无法使用。

票数 3
EN

Stack Overflow用户

发布于 2017-04-11 06:56:09

在委托shouldWaitForLoadingOfRequestedResource中,将URL方案更改为http:

代码语言:javascript
复制
NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:loadingRequest.request.URL resolvingAgainstBaseURL:NO];
    urlComponents.scheme = @"http";
NSMutableURLRequest *mutableLoadingRequest = [loadingRequest.request mutableCopy];
[mutableLoadingRequest setURL:urlComponents.URL];
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26649865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档