Запись потокового и сохранения интернет-радио в python

Я ищу фрагмент python для чтения потока интернет-радио(.АФБ. ,pls etc) и сохраните его в файл.

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

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

5 ответов


следующее сработало для меня, используя библиотеку запросов для обработки 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.


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

streamripper http://yp.shoutcast.com/sbin/tunein-station.pls?id=1377200 -d ./streams -l 10800 -a tb$FNAME

Если вы обнаружите, что ваши запросы или urllib.запрос вызова в 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 заменяет непризнанный ответ состояния, а затем копирует соответствующие биты исходного ответа, которые необходимы для функции "real" _read_status. Наконец, оригинал вызывается, и значения из этого передаются вызывающему объекту, а все остальное продолжается как обычно.

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


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

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

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

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


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

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

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

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

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