AVAssetResourceLoaderDelegate方法不在设备上工作

ons*_*wai 4 avfoundation ios

我一直在研究一种简单的AVPlayer加密HLS媒体.

我正在使用它AVAssetResourceLoaderDelegate来处理密钥检索过程,因此可以使用有效密钥播放加密媒体.

该程序在模拟器上完美运行,但它在设备上根本不起作用.

以下是代码:

- (void) playUrlByAVPlayer:(NSString *) videoUrl
{
    NSURL *streamURL = [NSURL URLWithString:videoUrl];

    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:streamURL options:nil];

    [asset.resourceLoader setDelegate:self queue:dispatch_get_main_queue()];

    self.playerItem = [AVPlayerItem playerItemWithAsset:asset];                           
    self.player = [AVPlayer playerWithPlayerItem:self.playerItem];

    self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
    [self.playerLayer setFrame:self.view.frame];
    [self.view.layer addSublayer:self.playerLayer];

    [self.player play];
}
Run Code Online (Sandbox Code Playgroud)

经过一些调试,我意识到委托方法shouldWaitForLoadingOfRequestedResource从未在设备上调用过.

我读过其他相关问题:

AVAssetResourceLoaderDelegate未被调用

AVAssetResourceLoaderDelegate - 仅请求前两个字节?

我试图包围内的所有代码dispatch_async,dispatch_get_main_queue块,但有解决我的运气不好.

目前,我的上述代码未被任何调度队列块包围.

有关这个问题的任何想法?

小智 5

如果你看一下他们展示bipbop.m3u8 HLS播放的Apple示例代码,你会看到他们正在使用掩码来实现真正的http请求:"http:/host/bipbop.m3u8"=>"custom_scheme:/ host/bipbop. m3u8"应该使用播放列表子资源进行相同的操作.

否则,avplayer会忽略AVAssetResourceLoaderDelegate并直接加载数据.

您需要实现某种映射:

NSString* videoUrl = @"fake_scheme://host/video.m3u8";
NSURL *streamURL = [NSURL URLWithString:videoUrl];
Run Code Online (Sandbox Code Playgroud)

  • 确实 AVAssetResourceLoaderDelegate 被调用,但 url 几乎没有用。有什么方法可以在委托方法期间再次更改此 url,使其真正有效吗? (2认同)