Подтвердить что ты не робот

Плейлисты HLS "EVENT" не могут начать играть в игроках

У меня есть плейлисты HLS, которые выглядят так:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:10
#EXT-X-ALLOW-CACHE:NO
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence0.ts
#EXTINF:9.97667,  
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence1.ts
#EXTINF:9.97667,  
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence2.ts
#EXTINF:9.97667,  
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence3.ts

Они имеют тип EVENT, что означает, что куски добавляются по мере их появления, и когда все куски присутствуют, в конце добавляется тег #EXT-X-ENDLIST.

Итак, когда все куски загружаются, мы получаем список воспроизведения, который выглядит примерно так:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:10
#EXT-X-ALLOW-CACHE:NO
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:9.97667,  
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence0.ts
#EXTINF:9.97667,  
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence1.ts
#EXTINF:9.97667,  
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence2.ts
#EXTINF:9.97667,  
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence3.ts
#EXTINF:9.97667,  
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence4.ts
#EXTINF:9.97667,  
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence5.ts
#EXT-X-ENDLIST

Мы видим странное поведение у всех наших клиентов. Если вы откроете плейлист m3u8 в iOS и Safari, когда загрузится первый фрагмент (или даже, скажем, 3 куска), плеер начнет воспроизводить видео, как следует. Иногда оно прекращается и не может возобновиться. Чаще всего он даже не начнет играть.

Полностью сформированные плейлисты (т.е. с тегом #EXT-X-ENDLIST) отлично воспроизводятся. Это просто, когда плейлист частично выполнен.

Мы опробовали множество игроков: Quicktime, Safari, iOS, VLC, Flowplayer и т.д. У всех есть множество проблем, но это наиболее актуально.

Было бы очень полезно понять, где искать решение этой проблемы.

Изменить: мы пробовали HLS.js, и он отлично играет. Такой приятный пользовательский опыт.

Изменить 2: Чтобы воспроизвести, я рекомендую иметь какой-то локальный HTTP-сервер (я использую python -m SimpleHTTPServer, обслуживающий список воспроизведения выше. Затем буквально добавляйте файлы в список воспроизведения, чтобы имитировать загрузку файлов и смотреть игроки сломаются.

Изменить 3: Хорошо, я создал простой инструмент для проверки поведения. https://github.com/dbousamra/m3u8-example Запустите node app.js, а затем попробуйте и open http://localhost:3001/playlist.m3u8 в Safari или любом другом проигрывателе. Он должен играть нормально, поскольку это полный список воспроизведения. **

Если, однако, вы добавляете параметр запроса ?start=<some unix timestamp>, он будет имитировать добавление событий, 1 кусок каждые 6 секунд, с этой отметки времени, пока все куски не будут выполнены, и в этот момент она добавит строку #EXT-X-ENDLIST.

Пример URL: http://localhost:3001/playlist.m3u8?start=1460092250872

Изменить 5: теперь я получил это на Heroku: http://guarded-mesa-71212.herokuapp.com/playlist.m3u8?start=

4b9b3361

Ответ 1

Вот что произошло:

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:11
#EXT-X-ALLOW-CACHE:NO
#EXT-X-MEDIA-SEQUENCE:0

если вы вернете вышеуказанный файл, сафари не будут запрашивать следующий файл вообще, игра просто мертва.

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:11
#EXT-X-ALLOW-CACHE:NO
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:9.999367,
https://cammy-bucket-staging-sydney.s3.amazonaws.com/9fc1a264af66e8acb04953bc6634fb6e.ts

если вы вернетесь выше, сафари запросят следующий файл около 11/2 секунд, игра не начнется в этот момент.

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:11
#EXT-X-ALLOW-CACHE:NO
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:9.999367,
https://cammy-bucket-staging-sydney.s3.amazonaws.com/9fc1a264af66e8acb04953bc6634fb6e.ts
#EXTINF:9.968911,
https://cammy-bucket-staging-sydney.s3.amazonaws.com/3e52720b320379de8afc940c3d1b7d34.ts

если вы вернетесь выше, сафари начнет играть, потому что доступный носитель 9.999367 + 9.968911 отличен от EXT-X-TARGETDURATION, и вы увидите еще один запрос около 9.999367 + 9.968911 + 11/2, все о сроках!

Ответ 2

Тег #EXT-X-DISCONTINUITY используется для указания изменений в формате файла, параметрах кодирования, количестве дорожек и т.д. Если сегменты в списке воспроизведения идентичны в отношении этих вещей, вы можете удалить теги #EXT-X-DISCONTINUITY из списка воспроизведения - они вам не нужны.

Некоторые клиенты могут быть несовместимы с версией 6 протокола. Кажется, вы не используете какие-либо особые функции версии 6, поэтому попробуйте установить номер версии на 3, чтобы узнать, помогает ли это.

Ответ 3

попробуйте что-то вроде этого

Простой файл списка воспроизведения Media

   #EXTM3U
   #EXT-X-VERSION:3
   #EXT-X-TARGETDURATION:5220
   #EXTINF:5219.2,
   http://media.example.com/entire.ts
   #EXT-X-ENDLIST

Плейлист Sliding Window Media, используя HTTPS

 #EXTM3U
   #EXT-X-VERSION:3
   #EXT-X-TARGETDURATION:8
   #EXT-X-MEDIA-SEQUENCE:2680

   #EXTINF:7.975,
   https://priv.example.com/fileSequence2680.ts
   #EXTINF:7.941,
   https://priv.example.com/fileSequence2681.ts
   #EXTINF:7.975,
   https://priv.example.com/fileSequence2682.ts

Файл списка воспроизведения с зашифрованными сегментами мультимедиа

#EXTM3U
   #EXT-X-VERSION:3
   #EXT-X-MEDIA-SEQUENCE:7794
   #EXT-X-TARGETDURATION:15

   #EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.php?r=52"

   #EXTINF:2.833,
   http://media.example.com/fileSequence52-A.ts
   #EXTINF:15.0,
   http://media.example.com/fileSequence52-B.ts
   #EXTINF:13.333,
   http://media.example.com/fileSequence52-C.ts

   #EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.php?r=53"

   #EXTINF:15.0,
   http://media.example.com/fileSequence53-A.ts

Главный файл списка воспроизведения

#EXTM3U
   #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1280000
   http://example.com/low.m3u8
   #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2560000
   http://example.com/mid.m3u8
   #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=7680000
   http://example.com/hi.m3u8
   #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=65000,CODECS="mp4a.40.5"
   http://example.com/audio-only.m3u8

Главный плейлист с I-фреймами  В этом примере атрибуты PROGRAM-ID были опущены:

#EXTM3U
   #EXT-X-STREAM-INF:BANDWIDTH=1280000
   low/audio-video.m3u8
   #EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=86000,URI="low/iframe.m3u8"
   #EXT-X-STREAM-INF:BANDWIDTH=2560000
   mid/audio-video.m3u8
   #EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=150000,URI="mid/iframe.m3u8"
   #EXT-X-STREAM-INF:BANDWIDTH=7680000
   hi/audio-video.m3u8
   #EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=550000,URI="hi/iframe.m3u8"
   #EXT-X-STREAM-INF:BANDWIDTH=65000,CODECS="mp4a.40.5"
   audio-only.m3u8

Главный плейлист с альтернативным аудио  В этом примере атрибуты PROGRAM-ID были опущены.  Атрибуты CODECS были сжаты для пространства. A '\' используется для  указывают, что тег продолжается в следующей строке с пробелами  Удалено:

   #EXTM3U
   #EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",NAME="English", \
      DEFAULT=YES,AUTOSELECT=YES,LANGUAGE="en", \
      URI="main/english-audio.m3u8"
   #EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",NAME="Deutsch", \
      DEFAULT=NO,AUTOSELECT=YES,LANGUAGE="de", \
      URI="main/german-audio.m3u8"
   #EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",NAME="Commentary", \
      DEFAULT=NO,AUTOSELECT=NO,URI="commentary/audio-only.m3u8"
   #EXT-X-STREAM-INF:BANDWIDTH=1280000,CODECS="...",AUDIO="aac"
   low/video-only.m3u8
   #EXT-X-STREAM-INF:BANDWIDTH=2560000,CODECS="...",AUDIO="aac"
   mid/video-only.m3u8
   #EXT-X-STREAM-INF:BANDWIDTH=7680000,CODECS="...",AUDIO="aac"
   hi/video-only.m3u8
   #EXT-X-STREAM-INF:BANDWIDTH=65000,CODECS="mp4a.40.5",AUDIO="aac"
   main/english-audio.m3u8

Главный плейлист с альтернативным видео

#EXTM3U
   #EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="low",NAME="Main", \
      DEFAULT=YES,URI="low/main/audio-video.m3u8"
   #EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="low",NAME="Centerfield", \
      DEFAULT=NO,URI="low/centerfield/audio-video.m3u8"
   #EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="low",NAME="Dugout", \
      DEFAULT=NO,URI="low/dugout/audio-video.m3u8"

   #EXT-X-STREAM-INF:BANDWIDTH=1280000,CODECS="...",VIDEO="low"
   low/main/audio-video.m3u8

   #EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="mid",NAME="Main", \
      DEFAULT=YES,URI="mid/main/audio-video.m3u8"
   #EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="mid",NAME="Centerfield", \
      DEFAULT=NO,URI="mid/centerfield/audio-video.m3u8"
   #EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="mid",NAME="Dugout", \
      DEFAULT=NO,URI="mid/dugout/audio-video.m3u8"

   #EXT-X-STREAM-INF:BANDWIDTH=2560000,CODECS="...",VIDEO="mid"
   mid/main/audio-video.m3u8

   #EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="hi",NAME="Main", \
      DEFAULT=YES,URI="hi/main/audio-video.m3u8"
   #EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="hi",NAME="Centerfield", \
      DEFAULT=NO,URI="hi/centerfield/audio-video.m3u8"
   #EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="hi",NAME="Dugout", \
      DEFAULT=NO,URI="hi/dugout/audio-video.m3u8"

   #EXT-X-STREAM-INF:BANDWIDTH=7680000,CODECS="...",VIDEO="hi"
   hi/main/audio-video.m3u8

   #EXT-X-STREAM-INF:BANDWIDTH=65000,CODECS="mp4a.40.5"
   main/audio-only.m3u8