Ios AVAssetResourceLoaderDelegate方法在设备上不起作用
我一直在制作一个简单的Ios AVAssetResourceLoaderDelegate方法在设备上不起作用,ios,avfoundation,Ios,Avfoundation,我一直在制作一个简单的AVPlayer来播放加密的HLS媒体 我正在使用AVAssetResourceLoaderDelegate处理密钥检索过程,以便使用有效密钥播放加密媒体 该程序在模拟器上运行良好,但在设备上根本无法运行 代码如下: - (void) playUrlByAVPlayer:(NSString *) videoUrl { NSURL *streamURL = [NSURL URLWithString:videoUrl]; AVURLAsset *asset =
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];
}
经过一些调试后,我意识到委托方法应该等待LoadingFrequestedResource
从未在设备上调用过
我阅读了其他相关问题:
我尝试将所有代码封装在dispatch\u async
,dispatch\u get\u main\u queue
块中,但解决我的问题运气不佳
目前,上述我的代码未包含在任何调度队列块中
对这个问题有什么想法吗?如果你看一看苹果的示例代码,其中显示了bipbop.m3u8 HLS回放,你会发现他们正在使用掩码来处理真正的http请求:“http:/host/bipbop.m3u8”=>“custom_scheme:/host/bipbop.m3u8” 播放列表子资源也应该使用相同的技巧 否则,avplayer将忽略AVAssetResourceLoaderDelegate并直接加载数据 您需要实现某种映射:
NSString* videoUrl = @"fake_scheme://host/video.m3u8";
NSURL *streamURL = [NSURL URLWithString:videoUrl];
正如我在另一个线程中提到的,AVAssetResourceLoaderDelegate只有在使用“非标准/非保留”url方案时才起作用。HTTP、HTTPS等被视为保留URL方案,如果URL具有这些方案之一,iOS将不会进行委托调用。我最后做的是使用我自己的http作为http URL,使用我自己的https作为https URL。在我做了那个改变之后,它工作得很好。正如您所知,这会使您的播放列表无法在其他设备上使用。在您的代理中
应等待加载频率资源
将URL方案更改回http:
NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:loadingRequest.request.URL resolvingAgainstBaseURL:NO];
urlComponents.scheme = @"http";
NSMutableURLRequest *mutableLoadingRequest = [loadingRequest.request mutableCopy];
[mutableLoadingRequest setURL:urlComponents.URL];
的确,会调用AVAssetResourceLoaderDelegate,但url几乎毫无用处。是否有任何方法可以在委托方法期间再次更改此url,使其实际工作?@nhenrique您是否成功地使用http更改自定义方案?由于loadingRequest是委托中的let常量,其request属性是get only属性。如果像my_own_http这样的方案无效,该如何工作?调用AVAssetResourceLoaderDelegate时是否删除此方案?如果是,您如何继续请求?@nhenrique您的代码应删除自定义方案并向服务器发出请求。您的委托代码充当代理。您解决了这个问题吗?下面的答案是正确的,但它只解释了如何触发代理。如何继续请求?我不确定在目标C中,但在Swift 3中,loadingRequest是let常量,loadingRequest.request是get-only属性。因此,更改将在复制版本上进行,而不是在主请求下进行。导致废话。@Rahul您找到了在swift中将URL方案更改回http的解决方案吗?