Solución:
Si tiene VLC instalado (o está dispuesto a instalarlo), entonces esto debería funcionar:
import vlc
p = vlc.MediaPlayer("http://your_mp3_url")
p.play()
Esto tiene la ventaja de que funciona con todo con lo que trabaja VLC, no solo con MP3. También se puede pausar si lo desea.
Puede instalar vlc para python usando
pip install python-vlc
Lo siento, pero no tengo Python3 para probar aquí, para transmitir mp3
utilizando pyaudio
necesitará decodificarlo en datos PCM, sé que pymedia puede hacerlo, pero es demasiado antiguo y solo admite python27
.
Para hacer esto de la manera correcta, necesitará conocer algunos atributos de su audio, cosas como frecuencia de muestreo, número de canales, resolución de bits, para configurarlo en el pyaudio.
Puedo mostrar cómo lo hago usando python27
+ pyaudio
, primero mostraré cómo se hace para transmitir .wav
from urllib2 import urlopen
#to python3.x
#from urllib.request import urlopen
import pyaudio
pyaud = pyaudio.PyAudio()
srate=44100
stream = pyaud.open(format = pyaud.get_format_from_width(1),
channels = 1,
rate = srate,
output = True)
url = "http://download.wavetlan.com/SVV/Media/HTTP/WAV/NeroSoundTrax/NeroSoundTrax_test4_PCM_Mono_VBR_8SS_44100Hz.wav"
u = urlopen(url)
data = u.read(8192)
while data:
stream.write(data)
data = u.read(8192)
elija un búfer grande, Python es lento en el ciclo while, lo hice usando trozos de tamaño 8192
, tenga en cuenta que format
, channels
y rate
son los atributos correctos para esto wav
archivo, así que para .wav
no necesitamos decodificar, es un PCM
datos, ahora para mp3
necesitaremos decodificar y poner PCM
formato para transmitir.
Intentemos usar pymedia
from urllib2 import urlopen
import pyaudio
import pymedia.audio.acodec as acodec
import pymedia.muxer as muxer
dm= muxer.Demuxer( 'mp3' )
pyaud = pyaudio.PyAudio()
srate=44100
stream = pyaud.open(format = pyaud.get_format_from_width(2),
channels = 1,
rate = srate,
output = True)
url = "http://www.bensound.org/bensound-music/bensound-dubstep.mp3"
u = urlopen(url)
data = u.read(8192)
while data:
#Start Decode using pymedia
dec= None
s= " "
sinal=[]
while len( s ):
s= data
if len( s ):
frames= dm.parse( s )
for fr in frames:
if dec== None:
# Open decoder
dec= acodec.Decoder( dm.streams[ 0 ] )
r= dec.decode( fr[ 1 ] )
if r and r.data:
din = r.data;
s=""
#decode ended
stream.write(din)
data = u.read(8192)
Esto puede ser secreto, porque nunca vi a nadie mostrando cómo se puede hacer esto en python, para python3 no sé nada que pueda decodificar .mp3 en pedazos como lo hace pymedia.
Aquí estos dos códigos se transmiten y funcionan para .wav
y .mp3