При проверке медиа-файлов [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 сегмента будут представлены в списке воспроизведения толькодублирование последней записи сегмента.