我一直在开发一个简单的AVPlayer来播放加密的HLS媒体。
我使用AVAssetResourceLoaderDelegate来处理密钥检索过程,这样加密的媒体就可以使用有效的密钥进行播放。
这个程序在模拟器上运行得很好,但是在设备上根本不工作。
以下是密码:
- (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_async,dispatch_get_main_queue块中,但是解决我的问题没有任何进展。
目前,我上面的代码没有包含在任何调度队列块中。
对这个问题有什么想法吗?
发布于 2014-12-29 16:25:08
如果您查看Apple示例代码,其中显示了bipbop.m3u8 HLS回放,您将看到它们正在为实际的http请求使用掩码:"http:/host/bipbop.m3u8“=>”定制方案:/host/bipbop.m3u8“应该对播放列表子资源使用相同的技巧。
否则,avplayer将忽略AVAssetResourceLoaderDelegate并直接加载数据。
您需要实现某种映射:
NSString* videoUrl = @"fake_scheme://host/video.m3u8";
NSURL *streamURL = [NSURL URLWithString:videoUrl];发布于 2015-04-29 18:11:51
正如我在另一个线程中提到的,只有当我们使用“非标准/非保留”url方案时,AVAssetResourceLoaderDelegate才能工作。HTTP、HTTPS等被认为是保留的URL方案,如果URL有这些方案之一,iOS将不会进行委托调用。我最后所做的是使用my_own_http作为http,my_own_https用于https urls。在我做了那个改变之后效果很好。正如你所知道的,这使得你的播放列表在其他设备上无法使用。
发布于 2017-04-11 06:56:09
在委托shouldWaitForLoadingOfRequestedResource中,将URL方案更改为http:
NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:loadingRequest.request.URL resolvingAgainstBaseURL:NO];
urlComponents.scheme = @"http";
NSMutableURLRequest *mutableLoadingRequest = [loadingRequest.request mutableCopy];
[mutableLoadingRequest setURL:urlComponents.URL];https://stackoverflow.com/questions/26649865
复制相似问题