AVPlayer URL custom loading for HTTPS

1.3k views Asked by At

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

There are 1 answers

0
user1783732 On

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