Мы создали сервер node.js, который вручную Muxes AAC/AVC пакетов в файлы фрагмента MP4, которые другой http-сервер, который другой Node.js обслуживает файлы в виде LL-HLS Livestream.
Через большую отладку мы смогли успешно получить потоки LL-HLS для работы на Android и iOS для большинства устройств .
Достаточно иронично , устройства, с которыми мы больше всего боремся,-это устройства Apple, поскольку не кажется, что Apple следует за своими собственными характеристиками, когда речь идет о LL-hls. < /p>
В этом конкретном сценарии, нашего клиента ( iPad, работающий на iPados 16.10), запрашивает Master.m3u8 плейлист. Мы получаем запрос как /master.m3u8 < /code>, что здорово. Сразу же мы получаем запросы для /video.m3u8 < /code> и /audio.m3u8 < /code>, что также великолепно. Ему нужно (все файлы m3u8 и все файлы mp4 ). Затем он делает запрос, подобный этим: get /video.m3u8?_hls_msn=0&_hls_part=2 . Опять же, это на самом деле именно то, что мы ожидаем, и это хорошо. 0 & _hls_part = 10 для получения /видео.m3u8?_hls_msn=1 . Здесь большая проблема заключается в том, что параметр запроса для _hls_part полностью отсутствует. Спецификацией, определяемой RFC8216-BIS16 Раздел 6.2.5.2.2, если указан параметр запроса _hls_msn , но _hls_part не является, то сервер должен блокировать и реагировать с полным сегментом, связанным со значением Передается в _hls_msn .
Другими словами, мой сервер должен блокировать возврат ответа, пока не будет готов полный сегмент видео0001 , несмотря на то, что у меня есть Частичные сегменты Video0001-0 через видео0001-11 , которые должны использоваться в ll-hls. Поток в поток HLS по умолчанию. < /p>
Итак, мой вопрос: почему это происходит? Разве мое устройство не поддерживает LL-HLS? Если так, зачем вообще запрашивать частичные сегменты? Если так, почему он все еще использует директивы о доставке (функция, поддерживаемая LL-HLS, если я не ошибаюсь) < /p>
Если это не имеет никакого отношения к LL-HLS , тогда к какому решению я могу подойти? Благодаря всем моим чтению, просто похоже, что Apple не знает, как слушать их собственную спецификацию, которую они написали, и клиентская сторона AvPlayer плохо написана. (Но я могу ошибаться)
Заранее. Но это просто вызывает проблемы для других игроков (например, Android) < /p>
master.m3u8:
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio_0",NAME="audio",DEFAULT=YES,AUTOSELECT=YES,CHANNELS="1",URI="audio.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=1280000,CODECS="avc1.64001f,mp4a.40.2",RESOLUTION=1920x1088,FRAME-RATE=10.000,AUDIO="audio_0"
video_source.m3u8
< /code>
video_source.m3u8 (называется video.m3u8 , под вопросом):
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-TARGETDURATION:6
#EXT-X-SERVER-CONTROL:CAN-BLOCK-RELOAD=YES,HOLD-BACK=18,PART-HOLD-BACK=1.5
#EXT-X-PART-INF:PART-TARGET=0.5
#EXT-X-MAP:URI="video_source.mp4"
#EXT-X-PROGRAM-DATE-TIME:2025-02-10T22:54:10.055Z
#EXT-X-PART:DURATION=0.5,URI="video_source0000-0.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.5,URI="video_source0000-1.m4s"
#EXT-X-PART:DURATION=0.5,URI="video_source0000-2.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.5,URI="video_source0000-3.m4s"
#EXT-X-PART:DURATION=0.5,URI="video_source0000-4.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.5,URI="video_source0000-5.m4s"
#EXT-X-PART:DURATION=0.5,URI="video_source0000-6.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.5,URI="video_source0000-7.m4s"
#EXT-X-PART:DURATION=0.5,URI="video_source0000-8.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.5,URI="video_source0000-9.m4s"
#EXT-X-PART:DURATION=0.5,URI="video_source0000-10.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.5,URI="video_source0000-11.m4s"
#EXTINF:6,
video_source0000.m4s
#EXT-X-PROGRAM-DATE-TIME:2025-02-10T22:54:16.501Z
#EXT-X-PART:DURATION=0.5,URI="video_source0001-0.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.5,URI="video_source0001-1.m4s"
#EXT-X-PART:DURATION=0.5,URI="video_source0001-2.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.5,URI="video_source0001-3.m4s"
#EXT-X-PART:DURATION=0.5,URI="video_source0001-4.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.5,URI="video_source0001-5.m4s"
#EXT-X-PART:DURATION=0.5,URI="video_source0001-6.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.5,URI="video_source0001-7.m4s"
#EXT-X-PART:DURATION=0.5,URI="video_source0001-8.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.5,URI="video_source0001-9.m4s"
#EXT-X-PART:DURATION=0.5,URI="video_source0001-10.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.5,URI="video_source0001-11.m4s"
#EXTINF:6,
video_source0001.m4s
#EXT-X-PROGRAM-DATE-TIME:2025-02-10T22:54:22.472Z
#EXT-X-PRELOAD-HINT:TYPE=PART,URI="video_source0002-0.m4s"
< /code>
audio.m3u8:
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-TARGETDURATION:6
#EXT-X-SERVER-CONTROL:CAN-BLOCK-RELOAD=YES,HOLD-BACK=18,PART-HOLD-BACK=1.5
#EXT-X-PART-INF:PART-TARGET=0.5
#EXT-X-MAP:URI="audio.mp4"
#EXT-X-PROGRAM-DATE-TIME:2025-02-10T22:54:10.054Z
#EXT-X-PART:DURATION=0.483,URI="audio0000-0.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0000-1.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0000-2.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0000-3.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0000-4.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0000-5.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0000-6.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0000-7.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0000-8.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0000-9.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0000-10.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0000-11.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.021,URI="audio0000-12.m4s",INDEPENDENT=YES
#EXTINF:5.816999999999999,
audio0000.m4s
#EXT-X-PROGRAM-DATE-TIME:2025-02-10T22:54:16.481Z
#EXT-X-PART:DURATION=0.483,URI="audio0001-0.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0001-1.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0001-2.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0001-3.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0001-4.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0001-5.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0001-6.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0001-7.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0001-8.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0001-9.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0001-10.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0001-11.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.021,URI="audio0001-12.m4s",INDEPENDENT=YES
#EXTINF:5.816999999999999,
audio0001.m4s
#EXT-X-PROGRAM-DATE-TIME:2025-02-10T22:54:22.443Z
#EXT-X-PRELOAD-HINT:TYPE=PART,URI="audio0002-0.m4s"
Подробнее здесь: https://stackoverflow.com/questions/794 ... ective-hls
LL-HLS: iOS/iPados AvPlayer с просьбой M3U8 с отсутствующей директивой доставки _HLS_PART ⇐ IOS
Программируем под IOS
1739283292
Anonymous
Мы создали сервер node.js, который вручную Muxes AAC/AVC пакетов в файлы фрагмента MP4, которые другой http-сервер, который другой Node.js обслуживает файлы в виде LL-HLS Livestream.
Через большую отладку мы смогли успешно получить потоки LL-HLS для работы на Android и iOS для большинства устройств .
Достаточно иронично , устройства, с которыми мы больше всего боремся,-это устройства Apple, поскольку не кажется, что Apple следует за своими собственными характеристиками, когда речь идет о LL-hls. < /p>
В этом конкретном сценарии, нашего клиента ( iPad, работающий на iPados 16.10), запрашивает Master.m3u8 плейлист. Мы получаем запрос как /master.m3u8 < /code>, что здорово. Сразу же мы получаем запросы для /video.m3u8 < /code> и /audio.m3u8 < /code>, что также великолепно. Ему нужно (все файлы m3u8 и все файлы mp4 ). Затем он делает запрос, подобный этим: get /video.m3u8?_hls_msn=0&_hls_part=2 . Опять же, это на самом деле именно то, что мы ожидаем, и это хорошо. 0 & _hls_part = 10 для получения /видео.m3u8?_hls_msn=1 . Здесь большая проблема заключается в том, что параметр запроса для _hls_part полностью отсутствует. Спецификацией, определяемой RFC8216-BIS16 Раздел 6.2.5.2.2, если указан параметр запроса _hls_msn , но _hls_part не является, то сервер должен блокировать и реагировать с полным сегментом, связанным со значением Передается в _hls_msn .
Другими словами, мой сервер должен блокировать возврат ответа, пока не будет готов полный сегмент видео0001 , несмотря на то, что у меня есть Частичные сегменты Video0001-0 через видео0001-11 , которые должны использоваться в ll-hls. Поток в поток HLS по умолчанию. < /p>
Итак, мой вопрос: почему это происходит? Разве мое устройство не поддерживает LL-HLS? Если так, зачем вообще запрашивать частичные сегменты? Если так, почему он все еще использует директивы о доставке (функция, поддерживаемая LL-HLS, если я не ошибаюсь) < /p>
Если это не имеет никакого отношения к LL-HLS , тогда к какому решению я могу подойти? Благодаря всем моим чтению, просто похоже, что Apple не знает, как слушать их собственную спецификацию, которую они написали, и клиентская сторона AvPlayer плохо написана. (Но я могу ошибаться)
Заранее. Но это просто вызывает проблемы для других игроков (например, Android) < /p>
master.m3u8:
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio_0",NAME="audio",DEFAULT=YES,AUTOSELECT=YES,CHANNELS="1",URI="audio.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=1280000,CODECS="avc1.64001f,mp4a.40.2",RESOLUTION=1920x1088,FRAME-RATE=10.000,AUDIO="audio_0"
video_source.m3u8
< /code>
video_source.m3u8 (называется video.m3u8 , под вопросом):
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-TARGETDURATION:6
#EXT-X-SERVER-CONTROL:CAN-BLOCK-RELOAD=YES,HOLD-BACK=18,PART-HOLD-BACK=1.5
#EXT-X-PART-INF:PART-TARGET=0.5
#EXT-X-MAP:URI="video_source.mp4"
#EXT-X-PROGRAM-DATE-TIME:2025-02-10T22:54:10.055Z
#EXT-X-PART:DURATION=0.5,URI="video_source0000-0.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.5,URI="video_source0000-1.m4s"
#EXT-X-PART:DURATION=0.5,URI="video_source0000-2.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.5,URI="video_source0000-3.m4s"
#EXT-X-PART:DURATION=0.5,URI="video_source0000-4.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.5,URI="video_source0000-5.m4s"
#EXT-X-PART:DURATION=0.5,URI="video_source0000-6.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.5,URI="video_source0000-7.m4s"
#EXT-X-PART:DURATION=0.5,URI="video_source0000-8.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.5,URI="video_source0000-9.m4s"
#EXT-X-PART:DURATION=0.5,URI="video_source0000-10.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.5,URI="video_source0000-11.m4s"
#EXTINF:6,
video_source0000.m4s
#EXT-X-PROGRAM-DATE-TIME:2025-02-10T22:54:16.501Z
#EXT-X-PART:DURATION=0.5,URI="video_source0001-0.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.5,URI="video_source0001-1.m4s"
#EXT-X-PART:DURATION=0.5,URI="video_source0001-2.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.5,URI="video_source0001-3.m4s"
#EXT-X-PART:DURATION=0.5,URI="video_source0001-4.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.5,URI="video_source0001-5.m4s"
#EXT-X-PART:DURATION=0.5,URI="video_source0001-6.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.5,URI="video_source0001-7.m4s"
#EXT-X-PART:DURATION=0.5,URI="video_source0001-8.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.5,URI="video_source0001-9.m4s"
#EXT-X-PART:DURATION=0.5,URI="video_source0001-10.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.5,URI="video_source0001-11.m4s"
#EXTINF:6,
video_source0001.m4s
#EXT-X-PROGRAM-DATE-TIME:2025-02-10T22:54:22.472Z
#EXT-X-PRELOAD-HINT:TYPE=PART,URI="video_source0002-0.m4s"
< /code>
audio.m3u8:
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-TARGETDURATION:6
#EXT-X-SERVER-CONTROL:CAN-BLOCK-RELOAD=YES,HOLD-BACK=18,PART-HOLD-BACK=1.5
#EXT-X-PART-INF:PART-TARGET=0.5
#EXT-X-MAP:URI="audio.mp4"
#EXT-X-PROGRAM-DATE-TIME:2025-02-10T22:54:10.054Z
#EXT-X-PART:DURATION=0.483,URI="audio0000-0.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0000-1.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0000-2.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0000-3.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0000-4.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0000-5.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0000-6.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0000-7.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0000-8.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0000-9.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0000-10.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0000-11.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.021,URI="audio0000-12.m4s",INDEPENDENT=YES
#EXTINF:5.816999999999999,
audio0000.m4s
#EXT-X-PROGRAM-DATE-TIME:2025-02-10T22:54:16.481Z
#EXT-X-PART:DURATION=0.483,URI="audio0001-0.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0001-1.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0001-2.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0001-3.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0001-4.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0001-5.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0001-6.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0001-7.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0001-8.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0001-9.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0001-10.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.483,URI="audio0001-11.m4s",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.021,URI="audio0001-12.m4s",INDEPENDENT=YES
#EXTINF:5.816999999999999,
audio0001.m4s
#EXT-X-PROGRAM-DATE-TIME:2025-02-10T22:54:22.443Z
#EXT-X-PRELOAD-HINT:TYPE=PART,URI="audio0002-0.m4s"
Подробнее здесь: [url]https://stackoverflow.com/questions/79430276/ll-hls-ios-ipados-avplayer-requesting-m3u8-with-missing-delivery-directive-hls[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия