Как по клику на определенную ссылку открыть popup-окно, в котором должен начать проигрываться mp3-файл?

Задача относительно простая - по клику на определенную ссылку открыть popup-окно, в котором должен начать проигрываться mp3-файл.

Первое, что пришло в голову, это что-то такое:

header('Content-type: audio/mpeg');
header('Content-length: ' . filesize($filepath));
header('Content-Disposition: inline; filename="'.$filename.'"');
header('X-Pad: avoid browser bug');
header('Cache-Control: no-cache');
readfile($filepath);


Но в процессе тестирования выяснилось, что пока скрипт продолжает передавать в попап этот mp3-файл никакие другие действия этот пользователь на сайте совершать не может, остальные запросы ждут, когда отработает текущий. То есть, например, если щелкнуть по другой ссылке - браузер никуда не перейдет, пока файл не допередается.

Вопрос первый - почему так происходит? Мне не совсем это очевидно, мне казалось, что ну висит одно активное соединение - и пусть висит, для других запросов с этого же хоста откроются новые.

Дальше я стал экспериментировать с icecast2 и liquidsoap, на сервере они были установлены. Я рассуждал так, что, в принципе, задачу стриминга можно решать как раз инструментами для стриминга. В итоге php-скрипт на лету создает liquidsoap-скрипт и запускает его на исполнение, что динамически создает маунт-поинт вещания в icecast, на который мы и редиректим попап.

В этом решении нет проблемы с параллельными запросами, но есть две другие - проигрывание файла начинается после небольшой задержки из-за буферизации потока и, так как в попапе проигрывается поток вещания, файл не скачивается и поводить вперед-назад ползунком проигрывания на разные моменты песни нельзя.

Так что вопрос второй - действительно ли лучше остановиться на этом втором варианте? Или я что-то упускаю и есть еще варианты, как можно реализовать прослушивание файла через php-скрипт?
  • Вопрос задан
  • 3209 просмотров
Пригласить эксперта
Ответы на вопрос 3
@rozhik
В этом решении больше проблем советы:
1) ползунок сможет работать только в HTTP/1.1+. Соответственно с PHP Вы контент выдать не сможете (нормально) . Поставьте спереди nginx, и не морочте себе голову. Или стримайте инструментами для стриминга.
2) проигрывайте аудио через javascript || flash. (если уже - опишите как у Вас получилось поиметь подобные проблемы)

На первый вопрос не достаточно данных для ответа. В других местах всё работает а фаербаг никто не отменял.
Уточните задачку. (недавно другу в похожем помогал, связанное свежо в памяти)
Ответ написан
@kaasius
У вас используется сессия. Первый запрос блокирует сессию (это файл на диске сервера, он блокируется, следующая сессия не начнется, пока не разблокируется эта).
Чтобы стримить медиафайлы, есть масса инструментов. Например - nginx_rtmp_module (если это живой стрим), либо просто через nginx можно стримить. Чтобы контролировать доступ, используйте X-Accel-Redirect.
Ответ написан
megahertz
@megahertz
full stack разработчик
Попробуйте X-Sendfile
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы