Comments 11
А это не мог быть такой NSURLProtocol, чтобы для всего остального приложения это кеширование осталось прозрачным?
0
Я не думаю, что AVPlayer грузит данные через [NSURLSession defaultSession]. А в этом случае запросы в протокол приходить не будут, пока его не добавили в protocolClasses у сессии.
0
Зарегистрированные стандартным образом кастомные протоколы вроде как раз в любых конфигурациях NSURLSession
работают. protocolClasses
как раз для локального расширения отдельной конфигурации.
Но AVPlayer
вроде и правда к NSURLProtocol
не привязать, хотя бы потому что логика загрузки там нужна более специфичная и сложная, что и видно в API.
0
Только передо мной встала подобная задача, и вот её решение. :) Спасибо, попробую воспользоваться, и надеюсь не забыть отписаться потом тут. У нас AVURLAsset создаётся из m3u, кажется, куда запрятан ts-поток.
> Для этого достаточно поменять схему URL у AVURLAsset'а с HTTP(S) на любую другую. Не забудьте сохранить оригинальную, она вам ещё понадобится.
> Для этого достаточно поменять схему URL у AVURLAsset'а с HTTP(S) на любую другую. Не забудьте сохранить оригинальную, она вам ещё понадобится.
0
Я на плейлистах не тестировал. Если будут проблемы, открывайте issue на гитхабе, будем смотреть.
0
Отправил не дописав…
> Для этого достаточно поменять схему URL у AVURLAsset'а с HTTP(S) на любую другую. Не забудьте сохранить оригинальную, она вам ещё понадобится.
Я не понял почему в DVURLAsset в init не сохраняется схема внутри, а просто затирается. Хотя я пока ещё не разобрался как пользоваться этой библиотечкой, но кажется там чего-то всё же не хватает. Мне не совсем понятно где кеширование происходит? Зачем у делегата делегат? Подход ясен, но исходники покурю ещё. Ещё раз спасибо.
> Для этого достаточно поменять схему URL у AVURLAsset'а с HTTP(S) на любую другую. Не забудьте сохранить оригинальную, она вам ещё понадобится.
Я не понял почему в DVURLAsset в init не сохраняется схема внутри, а просто затирается. Хотя я пока ещё не разобрался как пользоваться этой библиотечкой, но кажется там чего-то всё же не хватает. Мне не совсем понятно где кеширование происходит? Зачем у делегата делегат? Подход ясен, но исходники покурю ещё. Ещё раз спасибо.
0
> Я не понял почему в DVURLAsset в init не сохраняется схема внутри, а просто затирается.
В конструктор AVURLAsset передаётся изменённая схема для того, чтобы ассет вызывал методы делегата, а не загружал данные своими силами. Оригинальная схема передаётся в DVAssetLoaderDelegate строкой ниже, там и используется.
> Мне не совсем понятно где кеширование происходит?
У DVURLAsset есть делегат. В него приходят данные, которые можно сохранить самостоятельно.
> Зачем у делегата делегат?
Когда ассет не может загрузить данные самостоятельно, он просит это сделать делегата. Как только он (делегат) закончил загрузку, он оповещает об этом свой делегат. Получается делегат делегата :)
Пожалуй, переименую его в observer.
В конструктор AVURLAsset передаётся изменённая схема для того, чтобы ассет вызывал методы делегата, а не загружал данные своими силами. Оригинальная схема передаётся в DVAssetLoaderDelegate строкой ниже, там и используется.
> Мне не совсем понятно где кеширование происходит?
У DVURLAsset есть делегат. В него приходят данные, которые можно сохранить самостоятельно.
> Зачем у делегата делегат?
Когда ассет не может загрузить данные самостоятельно, он просит это сделать делегата. Как только он (делегат) закончил загрузку, он оповещает об этом свой делегат. Получается делегат делегата :)
Пожалуй, переименую его в observer.
0
> Оригинальная схема передаётся в DVAssetLoaderDelegate строкой ниже, там и используется.
Вот честно, не вижу такой строки. Возможно просто туплю.
> У DVURLAsset есть делегат. В него приходят данные, которые можно сохранить самостоятельно.
Сохранить да, но переиспользовать?
Вот честно, не вижу такой строки. Возможно просто туплю.
> У DVURLAsset есть делегат. В него приходят данные, которые можно сохранить самостоятельно.
Сохранить да, но переиспользовать?
0
> Вот честно, не вижу такой строки. Возможно просто туплю.
В нижней строке используется оригинальный URL, а не модифицированный.
> Сохранить да, но переиспользовать?
В следующий раз можно создавать AVURLAsset из локального URL.
код
NSURLComponents *components = [[NSURLComponents alloc] initWithURL:URL resolvingAgainstBaseURL:NO];
components.scheme = [DVAssetLoaderDelegate scheme];
if (self = [super initWithURL:[components URL] options:options]) {
DVAssetLoaderDelegate *resourceLoaderDelegate = [[DVAssetLoaderDelegate alloc] initWithURL:URL];
components.scheme = [DVAssetLoaderDelegate scheme];
if (self = [super initWithURL:[components URL] options:options]) {
DVAssetLoaderDelegate *resourceLoaderDelegate = [[DVAssetLoaderDelegate alloc] initWithURL:URL];
В нижней строке используется оригинальный URL, а не модифицированный.
> Сохранить да, но переиспользовать?
В следующий раз можно создавать AVURLAsset из локального URL.
0
Спасибо, теперь вижу. :)
А вот с переиспользованием перез ручное управление кешем (через делегат делегата) у меня не получится, из-за m3u как раз. :( Эта задачка у меня откладывается на недельку пока. Если заказчик решит к ней вернуться, то постараюсь не забыть поделиться кодом того что наваяю в итоге.
А вот с переиспользованием перез ручное управление кешем (через делегат делегата) у меня не получится, из-за m3u как раз. :( Эта задачка у меня откладывается на недельку пока. Если заказчик решит к ней вернуться, то постараюсь не забыть поделиться кодом того что наваяю в итоге.
0
Sign up to leave a comment.
Как кешировать данные AVURLAsset, загруженные AVPLayer'ом