AVAssetResourceLoaderDelegate方法不能在设备上工作
我一直在研究一个简单的AVPlayer
来播放encryption的HLS
媒体。
我正在使用AVAssetResourceLoaderDelegate
处理密钥检索过程,因此可以使用有效的密钥来播放encryption的媒体。
该程序完美地在模拟器上工作,但在设备上完全不起作用 。
这里是代码:
- (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]; }
经过一些debugging,我意识到委托方法shouldWaitForLoadingOfRequestedResource
从未在设备上调用。
我已阅读其他相关问题:
AVAssetResourceLoaderDelegate没有被调用
AVAssetResourceLoaderDelegate – 只请求前两个字节?
我试着把所有的代码放在dispatch_async
, dispatch_get_main_queue
块中,但是解决我的问题没有任何运气。
目前我的代码不包含任何调度队列块。
对这个问题有什么想法?
如果你看看苹果示例代码,他们显示bipbop.m3u8 HLS播放,你会看到他们使用真正的http请求掩码:“http:/host/bipbop.m3u8”=>“custom_scheme:/主机/ bipbop。 m3u8“与播放列表子资源一样,
否则,avplayer将忽略AVAssetResourceLoaderDelegate并直接加载数据。
你需要实现某种映射:
NSString* videoUrl = @"fake_scheme://host/video.m3u8"; NSURL *streamURL = [NSURL URLWithString:videoUrl];
正如我在其他线程中所提到的,AVAssetResourceLoaderDelegate只在我们使用“非标准/非保留”URLscheme时才起作用。 HTTP,HTTPS等被认为是保留的URLscheme,如果URL有这些scheme之一,iOS将不会进行委托调用。 我最终做的是使用my_own_http为http url和my_own_https为httpsurl。 在我做出这个改变之后,它运作良好。 如您所知,这会使您的播放列表无法在其他设备上使用。
在您的委托中, shouldWaitForLoadingOfRequestedResource
将URLscheme更改回http:
NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:loadingRequest.request.URL resolvingAgainstBaseURL:NO]; urlComponents.scheme = @"http"; NSMutableURLRequest *mutableLoadingRequest = [loadingRequest.request mutableCopy]; [mutableLoadingRequest setURL:urlComponents.URL];
- AVPlayerLayeranimation帧更改
- IOS 8电影从后面和前面照相机
- 如何将AVAssetReader和AVAssetWriter同时用于多个音轨(audio和video)?
- AVURLAsset的caching行为
- 如何使用swift监视ios上的audioinput – 示例?
- 我可以使用AVCaptureSession将AACstream编码到内存吗?
- 在AVMutableComposition中使用AVMutableCompositionTrack合并video和图像,而不是AVVideoCompositionCoreAnimationTool?
- AV基础相机预览图层放大,如何缩小?
- 使用AVAssetReader按时间值获取特定的帧