medialement.js не работает для моего hls на iphone - PullRequest
0 голосов
/ 17 декабря 2018

Вот мой файл m3u8: cat 8.m3u8

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:YES
#EXT-X-MEDIA-SEQUENCE:1131
#EXT-X-TARGETDURATION:5
#EXTINF:4.950, no desc
1545049888215.ts
#EXTINF:4.950, no desc
1545049893218.ts

Я использую его как статический файл на http://104.248.205.68:31339/8.m3u8

Я использую mediaelemnts.js для запуска этого видео hls: jsfiddle

html:

<video width="240" height="160"  
    id="player1" src="http://104.248.205.68:31339/8.m3u8" 
    controls="controls" autoplay preload="auto" muted ></video>

js:

  $('video').mediaelementplayer({});

Отлично работает на рабочем столе Chrome Mac OS.Но не работает на iphone 8+ (сафари и хром).Нет ошибок в консоли.Видео просто не проигрывается, черный экран.В полноэкранном режиме видео - тоже самое.

В то же время, если я нахожу в интернете случайный m3u8 и использую mediaelemnts.js для его воспроизведения, он хорошо работает на iPhone (по крайней мере, в полноэкранном режиме).mode) jsfiddle 2 .

Так что я думаю, что-то не так с моим файлом m3u8, так как другие iPhone m3u8 запускаются на iPhone.

Если я открываю вкладку сети во время загрузки проблемыстраница на Iphone, я вижу, что он загружает файлы, но по какой-то причине не показывает видео.

enter image description here

Обновление

Я проверил на Android: galaxy s5 и galaxy s9 + в chrome: оба работают.

Обновление 2

Zip-архив с файлами ts и m3u8: http://104.248.205.68:31339/8.m3u8.zip

1 Ответ

0 голосов
/ 22 декабря 2018

При проверке медиа-файлов [1] можно обнаружить, что PMT (Таблица программных карт) сигнализирует о том, что в потоке есть звук, но на самом деле нет пакетов TS для аудио (то есть нет аудиоданных).

Похоже, что проигрыватель ожидает пакеты TS аудио, чтобы создать общий буфер для аудио и видео, и только затем начать воспроизведение.Поскольку в потоке отсутствуют аудиоданные, этого никогда не бывает.Для этого вы можете использовать ffmpeg, чтобы удалить звуковую дорожку из сегментов мультимедиа, используя приведенную ниже команду, и обнаружите, что воспроизведение будет работать, как только вы это сделаете.

ffmpeg -i 1545049893218.ts -an -vcodec copy 1545049893218-v.ts

Кроме того, причина, по которой эта проблема проявляется только в Safari и Chrome на iOS, заключается в том, что в этих случаях mediaelement.js использует собственные возможности браузера для воспроизведения HLS вместо проигрывателя JavaScript (например, hls.js), который используется на других платформах (например, Chrome на рабочем столе) и более терпим к таким проблемным случаям.

[1] Например, используя http://thumb.co.il/ или ffprobe


РЕДАКТИРОВАТЬ:

Хотя вышеприведенного может быть достаточно, чтобы оно работало на старых мобильных устройствах Apple - я тестировал на iPhone 6 iOS10 - новые устройства кажутся более строгими.В официальной спецификации HLS указано

8.11.Вы ДОЛЖНЫ предоставить как минимум 6 сегментов в прямом / линейном списке воспроизведения.

, что, по-видимому, не является жестким требованием для некоторых версий iOS.Тем не менее, чтобы обеспечить его работу на всех версиях, эти требования должны быть выполнены.

Я провел быстрое тестирование на iPhone X с iOS12 и обнаружил, что оно будет воспроизводиться, если по крайней мере 3 сегмента будут представлены в списке воспроизведения толькодублирование последней записи сегмента.

...