我一直在研究一种简单的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];
}
Run Code Online (Sandbox Code Playgroud)
经过一些调试,我意识到委托方法shouldWaitForLoadingOfRequestedResource从未在设备上调用过.
我读过其他相关问题:
AVAssetResourceLoaderDelegate未被调用
AVAssetResourceLoaderDelegate - 仅请求前两个字节?
我试图包围内的所有代码dispatch_async,dispatch_get_main_queue块,但有解决我的运气不好.
目前,我的上述代码未被任何调度队列块包围.
有关这个问题的任何想法?
小智 5
如果你看一下他们展示bipbop.m3u8 HLS播放的Apple示例代码,你会看到他们正在使用掩码来实现真正的http请求:"http:/host/bipbop.m3u8"=>"custom_scheme:/ host/bipbop. m3u8"应该使用播放列表子资源进行相同的操作.
否则,avplayer会忽略AVAssetResourceLoaderDelegate并直接加载数据.
您需要实现某种映射:
NSString* videoUrl = @"fake_scheme://host/video.m3u8";
NSURL *streamURL = [NSURL URLWithString:videoUrl];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2547 次 |
| 最近记录: |