我正在尝试编写一个将从Soundcloud URL播放mp3的python脚本
这就是我已经做过的事情:
from urllib.request import urlopen
url = "soundcloud.com/artist/song.mp3"
u = urlopen(url)
data = u.read(1024)
while data:
player.play(data)
data = u.read(1024)
我尝试了pyaudio
许多选项,例如更改格式,频道,费率。
我只是从扬声器发出奇怪的声音,我在谷歌搜索pyaudio
播放mp3并没有找到任何信息。
我通过从mp3传递字节然后执行play函数来创建pygame
对象来尝试Sound
。我没有收到任何错误:脚本运行但没有播放。
我正在使用Python 3和Ubuntu。
答案 0 :(得分:9)
如果您碰巧安装了VLC(或者愿意安装VLC),那么这应该可行:
import vlc
p = vlc.MediaPlayer("http://your_mp3_url")
p.play()
这样做的好处是它适用于VLC使用的所有内容,而不仅仅是MP3。如果你愿意,它也可以暂停。
答案 1 :(得分:2)
很抱歉,我没有Python3在这里进行测试,要使用mp3
来流pyaudio
,您需要在PCM数据中对其进行解码,我知道pymedia可以做到这一点,但它太旧了,只支持python27
。
要以正确的方式执行此操作,您需要了解音频的某些属性,例如采样率,通道数,位分辨率等,以便在pyaudio中进行设置。
我可以使用python27
+ pyaudio
来说明我是如何做到这一点的,首先我将展示如何对流.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)
选择大缓冲区,python在while循环中很慢,我使用大小为8192
的块来做,请注意format
,channels
和rate
是严格的属性对于此wav
文件,因此对于.wav
我们不需要解码,它是PCM
数据,现在mp3
我们将需要解码并放入PCM
格式流。
让我们尝试使用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)
这可能是秘密,因为我从来没有看到任何人在python中展示如何做到这一点,对于python3我不知道任何可以将.mp3解码成像pymedia一样的部分。
此处这两个代码正在为.wav
和.mp3
答案 2 :(得分:1)
检查您是否可以使用URL
手动下载文件。如果其受保护的站点使用username / passwd,您可能需要先处理它。
如果没有,这是一个工作代码,使用url
从urllib2
下载文件,然后使用pydub播放。
这是一个两步过程,第一个mp3文件被下载并保存到文件中,然后使用外部播放器播放。
import urllib2
from pydub import AudioSegment
from pydub.playback import play
mp3file = urllib2.urlopen("http://www.bensound.org/bensound-music/bensound-dubstep.mp3")
with open('./test.mp3','wb') as output:
output.write(mp3file.read())
song = AudioSegment.from_mp3("./test.mp3")
play(song)
**更新**
你确实提到你需要从网络流媒体。在这种情况下,您可能希望使用GStreamer
这是SO link。