Я работаю над приложением для iOS, которое воспроизводит звук, зашифрованный FairPlay, через HLS и поддерживает как загрузку, так и потоковую передачу. И я не могу воспроизводить загруженный контент в режиме полета. Если я создаю 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
Плейлисты стримов выглядят так:
#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
Загрузка актива:
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];
В делегате URLSession:assetDownloadTask:didFinishDownloadingToURL:
:
self.downloadedPath = location.relativePath;
В делегате 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
}
Загрузка не выдает ошибки, кроме сообщения о том, что кеш ресурсов не воспроизводится в автономном режиме. Но если вы переключитесь в режим полета и попытаетесь воспроизвести загруженный ресурс, он правильно запросит ключ у делегата загрузчика ресурсов (и я использую постоянные ключи, поэтому он отлично работает в автономном режиме), а затем попробуйте сделать запрос на media-1/stream.m3u8
.
Есть ли какие-то ошибки, с которыми я здесь не справляюсь? Должен ли файл плейлиста каким-то образом отличаться? Есть ли какое-то свойство задачи или актива, которое мне не хватает?