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
Just to follow up with an answer as I solved the problem now. Simply put,
AVPlayer
andAVAssetResourceLoader
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.
URL string is
loadingRequest.request.URL.absoluteString