1

我正在尝试使用AVPlayer自定义 URL 加载(自定义NSURLProtocol子类)。但它似乎[NSURLProtocol registerClass]不适用于真实设备中的 AVPlayer(请参阅此线程)。

现在我正在尝试使用AVAssetResourceLoaderDelegate来进行自定义 URL 加载。但是,如何触发委托对我来说有点令人困惑。我处理的 URL 看起来像这样https://some_ip_address:port/resource/,但似乎我的委托没有被调用来获取这样的 URL。我试图将方案更改为非 HTTP(例如“quic”)并且能够触发委托代码,但我真的不想破解该方案。

以下是相关代码:

(委托在不同的文件中实现)

    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:^{}];  

有了上述内容,如果 url 具有“https”方案,我看不到在委托中触发了任何方法。我缺少什么来允许委托为“https”URL 进行自定义 URL 加载?

谢谢

4

1 回答 1

2

只是为了跟进答案,因为我现在解决了这个问题。简而言之,如果 URL 具有“http”或“https”方案,则忽略委托AVPlayerAVAssetResourceLoader

是的,解决方法是用一些自定义方案替换 URL 方案,并在获取数据时将其替换回委托回调中。

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

网址字符串是loadingRequest.request.URL.absoluteString

于 2020-02-20T23:31:52.340 回答