Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

Как реализовать сохранение фрагмента радио потока с сайта?

#javascript #html5


Господа, парой строчек кода, как в приведенном ниже примере, можно реализовать вещание
радио. На стандартной Audio панели есть кнопка скачать (стрелка вниз), если бы в место
ссылки на радио поток, как в данном примере была бы ссылка на аудио файл, то он бы
просто скачался и все, вопроса нет... А как реализовать скачивание одной песни или
какого-нибудь фрагмента радио потока?  Если в данной реализации кода нажать  кнопку
"СКАЧАТЬ", то скачивание начнется, ни как не могу сообразить как реализовать остановку
скачивания.  

Есть такая возможность, при скачивании потока, выдернуть (перенести в другую папку
или диск, скопировать) его в другое место и остановить скачивание и и этот скаченный
файл остается, это все в ручную... 

Вопрос: как не вручную реализовать остановку скачивания ?

Дополняю вопрос примером на JS без тега audio, а с объектом new Audio.
В втором примере  тоже простой кусок кода на js которая запускает воспроизведения
Радио потока. Play воспроизводим, Pause останавливаем.
А как сделать так, что бы нажав кнопку  Radio Save Start начать запись, а нажав кнопку
Radio Save Stop остановить запись  и сохранить



var radio = new Audio();
radio.src = "http://chanson.hostingradio.ru:8041/chanson128.mp3?";

document.querySelector('#radioPlay').onclick = function() {
  radio.play()
}
document.querySelector('#radioStop').onclick = function() {
  radio.pause()
}
document.querySelector('#radioSaveStart').onclick = function() {
  /*как тут начать запись*/
}
document.querySelector('#radioSaveStop').onclick = function() {

  /* и как тут закончить запись и сохранить*/
}
div {
  margin: 10px;
  width: 150px;
  height: 20px;
  background: gray;
}



Play
Stop
Radio Save Start
Radio Save Stop


Ответы

Ответ 1



Как реализовать сохранение фрагмента радио потока с сайта? Ровно так же, как и скачивание абсолютно любых других файлов с вашего сервера, а будет ли это фрагмент потока с радио или видеоклип - дело десятое. А как реализовать скачивание одной песни А где у радиопотока есть такая сущность (абстракция) как "песня"? В радиопотоке может говорить ведущий с утра до вечера, ни одной песни не прозвучит... Что же тогда должна будет скачивать программа, которая о таком не знает? ни как не могу сообразить как реализовать остановку скачивания. Никак. Начать хотя бы с того, что скачивание может быть начато не самим браузером, а каким-либо внешним приложением. А доступа к приложению, конечно же, у вас нет. Но, как тут уже сказали, можно со стороны сервера оборвать соединение. Качалки на это могут отреагировать по разному, но в общем и целом, они посчитают, что файл уже скачан целиком, тем самым сохранят некий ошметок. В айскасте есть даже специальный метод, который позволяет кильнуть клиента, а вот понять кого надо килять - сложно, по ошибке можно пристрелить поток браузера. Дополняю вопрос примером на JS без тега audio, а с объектом new Audio. Совершенно не важно как вы инстанцируете этот примитивный плеер аудиопотоков. Через тег или еще через что-то. Функции сохранения, которая вам так нужна, в нем просто нет. А как сделать так, что бы нажав кнопку Radio Save Start начать запись, а нажав кнопку Radio Save Stop остановить запись и сохранить Ну я же не могу пользователю, посетителю сайта предложить - "Батенька, когда вы будете скачивать понравившуюся вам песню, прослушивая радио, будьте любезны, откройте папочку в которую вы скачивайте фрагмент, перенесите его в другую папку, отмените скачивание, потом уберите из название последний кусок до точки, потом перенесите куда хотите "? Для этого надо писать приложения на нормальном языке программирования, а не том, что маркетологи так яро скармливают в своих докладах. В частности, в этом языке должна быть явно прописана работа с сетью, подключение к серверу, передача заголовков, прием байтиков, скармливание этих байтиков декодеру и файловому дескриптору, ну и прочие сложности и глупости, которые присущи устаревшим языкам программирования и которых нету в таком прекрасном языке как Джаваскрипт. Собственно, выше - написано как это сделать, просто вместе с декодером вы отправляете данные и в файл, но так как в "веб-платформе" всего этого нет, разделить все это не выйдет, то ничего не получится. Подробнее об этом можно почитать у Джоэла Спольски в его Законе дырявых абстракций. И или отказаться от идеи, или переписать свой проект на чем-то другом, хотя бы на загнивающем Adobe Flash, который все же является более жизнеспособной платформой, чем современный JS

Ответ 2



Вы хотите это сделать на стороне браузера. Дело в том что если вы запустили закачку, то управление этой закачкой скорее всего уже только у браузера и управлять ею через javascript нельзя. Предлагаю сделать эту функцию на стороне сервера. При нажатии на кнопку сервер начинает скачивать файл, когда нажата кнопка прекратить сервер прекращает скачивать файл, и возвращает клиенту ссылку на скачивание через AJAX. Либо скачивать не стандартной скачивалкой браузера, а через AJAX, тут нужно искать библиотеку для потоковой закачки файла. Или использовать стандартный fetch, в этой статье написано что используя fetch можно иметь доступ к частично скачанному контенту, но как я понял эта функциональность fetch дорабатывается. Тут описан стандарт для fetch readable stream.

Комментариев нет:

Отправить комментарий