Я пытаюсь загрузить потоковый аудиопоток с онлайн-радиостанции.Раньше станция работала на MP3-канале Shoutcast, но теперь перешла на AAC HTTP-аудиоканал..
Раньше я использовал «streamripper» в терминале, чтобы копировать станцию для своих поездок на машине, нотеперь streamripper не может скопировать новый поток. Я почти уверен, что станция теперь использует для своей трансляции кодирование передачи по частям http, которое streamripper не поддерживает.
Я придумал новое решение, в котором я изолировал аудиопоток от веб-плеера станции, иЯ использую cURL для копирования потока в аудиофайл.Я могу взять с собой.
ОднакоЯ постоянно получаю «завершения» на моем cURL, когда он должен бесконечно записывать. Я даже установил максимальный параметр времени на 43200 с (12 часов), но в итоге получаю файлы разного размера. Обычно каждый полученный файл не длиннее 1 часа. Иногда он может быть длиннее часа. Размеры файлов и время разные. Файл «ломается/завершается» через короткий промежуток времени, и мне приходится использовать скрипт для перезапуска записи cURL. В итоге я получаю большую папку с фрактальными записями, хотя мне нужно всего 2 записи в день (каждые 12 часов). Когда я смотрю на подробный отчет о передаче cURL, он просто заканчивается сообщением «cURL connection left in tact». В журнале cURL нет ошибок, поэтомуЯ не уверен, как заставить cURL попытаться «переподключиться» и продолжить анализ потока в тот же файл, даже если он считает, что он завершен.
Я также пробовал использовать "wget" и "Jdownloader", Оба они имеют одинаковый результат, заканчивающийся через короткий промежуток времени.
Я не уверен, что я могу сделать, чтобы принудительно переподключиться и продолжить загрузку в тот же файл, не перезаписывая его.
Что я могу сделать, чтобы мои записи не "сломались"? Можно ли что-то сделать, чтобы принудительно переподключиться? Или, может быть, есть способ заставить cURL подождать, даже если скорость передачи cURL падает до 0?
Любые мысли будут высоко оценены.
Спасибо
решение1
как заставить cURL попытаться «переподключиться» и продолжить анализ потока в тот же файл, даже если он думает, что он завершен
Общий способ (не относящийся к curl
):
while true; do curl -o - … ; done >file
Суть в том, что curl
пишет в stdout. Мы перенаправляем весь цикл в файл, сколько бы перезапусков он ни потребовал. Таким образом, вывод из нескольких последовательных curl
процессов объединяется и отправляется в один файл.
Чтобы запустить это на 12 часов:
timeout 12h sh -c 'while true; do curl -o - … ; done >file'
Для непрерывной работы и создания нового файла каждые 12 часов:
while true; do
timeout 12h sh -c 'while true; do curl -o - … ; done >"audio_feed_$(date +%Y-%m-%d_%T)"'
done
Чтобы начать новый файл по требованию, просто завершите текущий timeout
или sh
его дочерний файл.
Примечание: я не знаю, приведет ли поток с несколькими секундами, отсутствующими время от времени, но объединенными, к воспроизводимому файлу. Я ожидаю, что протоколы/контейнеры/кодеки, разработанные для потоковой передачи по сети в реальном времени, смогут повторно синхронизироваться после отсутствующего фрагмента; это должно работать независимо от того, поступают ли данные с сервера или из файла. Если поток, который вы хотите захватить, такой, то вы столкнетесь с «отсутствующим контентом» при последующем воспроизведении (в отметках времени, когда один curl
закончился, а следующий еще не вступил в игру), но этот «сбой» не должен останавливать плеера, который действительно знает, как обрабатывать такой поток.