Tom*_*ing 5 avfoundation fairplay http-live-streaming avasset avassetdownloadtask
我正在开发一个 iOS 应用程序,它通过 HLS 播放 FairPlay 加密的音频,并支持下载和流式传输。在飞行模式下,我无法播放下载的内容。如果我AVURLAsset在下载完成时从本地 URL创建一个,asset.assetCache.isPlayableOffline返回NO,并且当我尝试以飞行模式播放时,它仍然尝试请求 .m3u8 播放列表文件之一。
我的主播放列表如下所示:
#EXTM3U
# Created with Bento4 mp4-hls.py version 1.1.0r623
#EXT-X-VERSION:5
#EXT-X-SESSION-KEY:METHOD=SAMPLE-AES,URI="skd://url/to/key?KID=foobar",KEYFORMAT="com.apple.streamingkeydelivery",KEYFORMATVERSIONS="1"
# Media Playlists
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=133781,BANDWIDTH=134685,CODECS="mp4a.40.2" media-1/stream.m3u8
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=67526,BANDWIDTH=67854,CODECS="mp4a.40.2" media-2/stream.m3u8
Run Code Online (Sandbox Code Playgroud)
流播放列表如下所示:
#EXTM3U
#EXT-X-VERSION:5
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-TARGETDURATION:30
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=SAMPLE-AES,URI="skd://url/to/key?KID=foobar",KEYFORMAT="com.apple.streamingkeydelivery",KEYFORMATVERSIONS="1"
#EXTINF:30.000181,
#EXT-X-BYTERANGE:470290@0
media.aac
# more segments...
#EXT-X-ENDLIST
Run Code Online (Sandbox Code Playgroud)
下载资产:
AVURLAsset *asset = [AVURLAsset assetWithURL:myM3u8Url];
[asset.resourceLoader setDelegate:[FairPlayKeyManager instance] queue:[FairPlayKeyManager queue]];
asset.resourceLoader.preloadsEligibleContentKeys = YES;
AVAssetDownloadTask *task = [self.session assetDownloadTaskWithURLAsset:asset assetTitle:@"Track" assetArtworkData:imgData options:nil];
[task resume];
Run Code Online (Sandbox Code Playgroud)
在代表的URLSession:assetDownloadTask:didFinishDownloadingToURL::
self.downloadedPath = location.relativePath;
Run Code Online (Sandbox Code Playgroud)
在代表的URLSession:task:didCompleteWithError::
if (!error)
{
NSString *strUrl = [NSHomeDirectory() stringByAppendingPathComponent:self.downloadedPath];
NSURL *url = [NSURL fileURLWithPath:strUrl];
AVURLAsset *localAsset = [AVURLAsset assetWithURL:url];
if (!localAsset.assetCache.playableOffline)
NSLog(@"Oh no!"); //not playable offline
}
Run Code Online (Sandbox Code Playgroud)
除了资产缓存报告无法离线播放之外,下载不会出错。但是如果你切换到飞行模式并尝试播放下载的资源,它会正确地向资源加载器委托请求一个键(我使用的是持久键,所以离线工作正常),然后尝试请求media-1/stream.m3u8.
有什么我没有在这里处理的问题吗?播放列表文件应该在某些方面有所不同吗?我遗漏了任务或资产的某些属性吗?
事实证明,这是因为我从中下载音频的 URL(例如,https://mywebsite.com/path/to/master.m3u8重定向到 CDN url ( https://my.cdn/other/path/to/master.m3u8))。簿记中出现问题AVAssetDownloadTask,因此当我尝试离线播放生成的下载文件时,它认为它需要来自网络的更多文件。我已将其归档为雷达 43285278。我通过手动HEAD对同一 URL 发出请求,然后给出AVAssetDownloadTask生成的重定向 URL 来解决此问题。
| 归档时间: |
|
| 查看次数: |
1511 次 |
| 最近记录: |