Чтение аудиопотока в питоне - PullRequest
4 голосов
/ 14 июля 2010

Удивительно, но в bash вы можете сделать

$ curl http://mp3.streampower.be/radio1-high.mp3 > test.mp3

с аудиопотоком, а затем ^ C out, и у вас будет рабочий mp3-файл, заставляющий меня поверить, что я могу автоматизировать это на python,но я не могу найти как.

Если я просто делаю

file('python.mp3', 'w').write(urllib2.urlopen("http://mp3.streampower.be/radio1-high.mp3").read())

, он даже не читает поток.

Есть ли что-то вроде BufferedInputReader из Java вPython или кто-нибудь может дать мне несколько советов о том, как я буду делать это?Чтение аудиопотока и его прекращение через некоторое время.

Спасибо

1 Ответ

8 голосов
/ 14 июля 2010

Возможно, вам лучше сохранить файлоподобный объект из urllib2.urlopen(), а затем использовать его метод read в цикле с параметром размера:

#!/usr/bin/python

import urllib2

f=file('python.mp3', 'w')

url=urllib2.urlopen("http://mp3.streampower.be/radio1-high.mp3")

while True:
    f.write(url.read(1024))

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

Мой пример кода создаст вам хороший и медленный mp3-файл. Возможно, вам придется настроить 1024, если потоки отправляют намного быстрее, чем обычные битрейты mp3, но это должно быть хорошо. (Поток 128 Кбит / с потребует 16 системных вызовов в секунду до write(2), что не должно вызывать стресса. Но при скорости 10 Мбит или выше это будет больно, и вам следует использовать больший размер read.)

...