Запись потокового и сохранение интернет-радио в Python - PullRequest
9 голосов
/ 22 ноября 2010

Я ищу фрагмент Python для чтения потока интернет-радио (.asx, .pls и т. Д.) И сохранения его в файл.

Окончательный проект - cron'ed скрипт, который будет записывать часили два из интернет-радио, а затем передать его на телефон для воспроизведения во время моей поездки.(3g - пятнистый на моем пути)

приветствуются любые фрагменты или указатели.

Ответы [ 5 ]

10 голосов
/ 08 декабря 2015

Следующее работает для меня, используя библиотеку запросов для обработки http-запроса.

import requests

stream_url = 'http://your-stream-source.com/stream'

r = requests.get(stream_url, stream=True)

with open('stream.mp3', 'wb') as f:
    try:
        for block in r.iter_content(1024):
            f.write(block)
    except KeyboardInterrupt:
        pass

Это сохранит поток в файл stream.mp3, пока вы не прервете его с помощью ctrl+C.

6 голосов
/ 29 марта 2011

Итак, после игры и игры с ней я обнаружил Streamripper , чтобы работать лучше всего.Это команда, которую я использую

streamripper http://yp.shoutcast.com/sbin/tunein-station.pls?id=1377200 -d ./streams -l 10800 -a tb$FNAME
5 голосов
/ 27 декабря 2016

Если вы обнаружите, что ваши запросы или вызов urllib.request в Python 3 не могут сохранить поток, потому что вы получаете взамен «ICY 200 OK» вместо заголовка «HTTP / 1.0 200 OK», вам нужно сообщить функции ICY 200 OK в порядке!

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

Просто поместите такую ​​подпрограмму над кодом открытия потока.

def NiceToICY(self):
    class InterceptedHTTPResponse():
        pass
    import io
    line = self.fp.readline().replace(b"ICY 200 OK\r\n", b"HTTP/1.0 200 OK\r\n")
    InterceptedSelf = InterceptedHTTPResponse()
    InterceptedSelf.fp = io.BufferedReader(io.BytesIO(line))
    InterceptedSelf.debuglevel = self.debuglevel
    InterceptedSelf._close_conn = self._close_conn
    return ORIGINAL_HTTP_CLIENT_READ_STATUS(InterceptedSelf)

Затем поместите эти строки в начало вашей основной процедуры, прежде чем открывать URL.

ORIGINAL_HTTP_CLIENT_READ_STATUS = urllib.request.http.client.HTTPResponse._read_status
urllib.request.http.client.HTTPResponse._read_status = NiceToICY

Они будут переопределять стандартную подпрограмму (только один раз) и запускать функцию NiceToICY вместо обычной проверки состояния, когда она открыла поток. NiceToICY заменяет нераспознанный ответ о статусе, а затем копирует соответствующие биты исходного ответа, которые необходимы для «реальной» функции _read_status. Наконец, вызывается оригинал, и его значения передаются обратно вызывающей стороне, а все остальное продолжается как обычно.

Я нашел, что это самый простой способ обойти проблему сообщения о состоянии, вызывающего ошибку. Надеюсь, это полезно и для вас.

2 голосов
/ 08 ноября 2012

Я знаю, что это год, но это все еще жизнеспособный вопрос, с которым я недавно возился.

На большинстве интернет-радиостанций вы можете выбрать тип загрузки, я выбираю версию MP3, затем читаю информацию из необработанного сокета и записываю ее в файл. Хитрость заключается в том, чтобы выяснить, насколько быстро ваша загрузка сравнивается с воспроизведением песни, так что вы можете создать баланс между размером чтения / записи. Это будет в вашем буфере def.

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

Я использовал некоторые фрагменты кода из файлового архива без приложения сжатия для обработки большого количества файловых файлов, их воспроизведения, магии буферизации. Это очень похоже на то, как протекает процесс. Если вы напишите некоторый sudo-код (который я настоятельно рекомендую), вы увидите сходство.

1 голос
/ 22 ноября 2010

Я только знаком с тем, как работает потоковая передача shoutcast (это будет упомянутый вами файл .pls):

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

Вы можете подключиться к этому потоку, так как это просто HTTP, который передает потоки MP3 или AAC.Для использования просто сохраните каждый байт, который вы получите, в файл, и вы получите файл MP3 или AAC, который вы можете перенести на свой mp3-плеер.

В Shoutcast есть одно дополнительное дополнение: метаданные.Вы можете найти, как это работает здесь , но на самом деле не нужно.

Если вам нужен пример приложения, которое делает это, дайте мне знать, и я кое-что напишу позже.

...