【发布时间】:2020-05-27 11:07:55
【问题描述】:
我正在尝试将 AVPlayer 与自定义 URL 加载(自定义 NSURLProtocol 子类)一起使用。但似乎[NSURLProtocol registerClass] 不适用于真实设备中的 AVPlayer(请参阅此thread)。
现在我正在尝试使用 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 加载?
谢谢
【问题讨论】:
-
您可以在加载项目时评估是否正在调用
AVAssetDownloadURLSession.shared的delegate。此外,您有点希望具有完全私有网络处理的AVAssetResourceLoader通过自定义NSURLProtocol加载资产 - 这听起来不是一个好的设计。您可以自己在AVAssetDownloadURLSession上完全实现流式传输吗? -
@EugeneDudnyk 从 Apple 的文档 (developer.apple.com/documentation/avfoundation/…) 中,我找不到
shared的AVAssetDownloadURLSession实例(我正在使用 obj-c)。我会对此进行更多研究。关于你的问题,是的,我正在使用Chromium的Cronet,它提供了一个完整的网络堆栈(我想支持QUIC)。 -
sharedSession在超类NSURLSession中声明。
标签: ios avplayer nsurlprotocol avassetresourceloaderdelegate