MxS*_*gan 4 delegates objective-c avfoundation http-live-streaming ios
我一直试图在AVAssetResourceLoaderDelegate协议上得到一些消息,但它似乎永远不会被调用.我已经验证了主线程上发生的一切; 从创建AVURLAsset,创建AVPlayerItem,创建委托,并将委托队列设置为主线程.我正在尝试流式传输网络托管的MP4内容和未加密的HLS内容.
我的声明:
@property (readwrite, strong) AVPlayer* player;
@property (strong) AVPlayerItem* playerItem;
@property (strong) id<AVAssetResourceLoaderDelegate> resourceLoaderDelegate;
Run Code Online (Sandbox Code Playgroud)
播放视频的代码:
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
...
self->_resourceLoaderDelegate = [[MyAssetResourceLoaderDelegate alloc] init];
[asset.resourceLoader setDelegate:self->_resourceLoaderDelegate
queue:dispatch_get_main_queue()];
...
self->_playerItem = [AVPlayerItem playerItemWithAsset:asset];
...
[self setPlayer:[AVPlayer playerWithPlayerItem:self->_playerItem]];
Run Code Online (Sandbox Code Playgroud)
但是,resourceLoader:shouldWaitForLoadingOfRequestedResource:永远不会被调用(任何其他委托方法都没有).
为了清楚起见,我正在使用iOS模拟器以及运行iOS 8的iPhone 5s进行测试(结果看起来相同).
我已经验证所有代码都在主线程上执行,因为我在这个问题中读到所有内容都必须在同一个线程上.
有没有人有任何建议,或者可能是对这个委托实际被调用的一些可用源代码的引用?
更新:我确定当url是本地文件时,此代码可以正常工作,但是当它到达远程文件时仍然无法正常工作.这是预期的行为还是有办法我可以为远程文件执行此操作?
AVAssetResourceLoaderDelegate仅在我们使用"非标准/非保留"网址方案时才有效.HTTP,HTTPS等被视为保留URL方案,如果url具有其中一种方案,iOS将不会进行委托调用.我最终做的是使用my_own_http作为http urls,使用my_own_https作为https网址.它运作良好.还有一件事要记住,如果你有非标准方案的URL,它可能无法在其他支持HLS的设备上运行.