AVPlayer URL custom loading for HTTPS

倖福魔咒の 提交于 2020-06-17 09:14:30

问题


I'm trying to use AVPlayer with custom URL loading (a custom NSURLProtocol subclass). But it seems [NSURLProtocol registerClass] does not work with AVPlayer in real device (see this thread).

Now I'm trying to use AVAssetResourceLoaderDelegate to do the custom URL loading. However it is a bit confusing to me how the delegate will be triggered. The URL I deal with looks like this https://some_ip_address:port/resource/, but it seems like my delegate is not called for such URL. I tried to change the scheme to non-HTTP (e.g. "quic") and was able to trigger the delegate code but I really don't want to hack the scheme.

Here is the related code:

(delegate is implemented in a different file)

    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];  
    AVAssetResourceLoader *resourceLoader = asset.resourceLoader;  
    [resourceLoader setDelegate:delegate  
                          queue:dispatch_queue_create("MyURLDelegate loader", nil)];  
    AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset];  
    AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];  
    AVPlayerViewController *controller = [[AVPlayerViewController alloc] init];  
    controller.player = player;  
    [player play];  
    [self presentViewController:controller animated:false completion:^{}];  

With the above, I cannot see any methods are triggered in the delegate if url has the scheme of "https". What am I missing to allow the delegate to do custom URL loading for "https" URLs ?

Thanks


回答1:


Just to follow up with an answer as I solved the problem now. Simply put, AVPlayer and AVAssetResourceLoader ignores the delegate if the URL has scheme of "http" or "https".

Yes, the workaround is to replace the URL scheme with some custom scheme, and replace it back inside the delegate callback when fetching data.

- (BOOL) resourceLoader:(AVAssetResourceLoader *)resourceLoader
shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest

URL string is loadingRequest.request.URL.absoluteString



来源:https://stackoverflow.com/questions/60179072/avplayer-url-custom-loading-for-https

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!