如何从URL播放mp3

时间:2016-07-03 14:55:52

标签: python ubuntu audio

我正在尝试编写一个将从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。

3 个答案:

答案 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的块来做,请注意formatchannelsrate是严格的属性对于此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,您可能需要先处理它。

如果没有,这是一个工作代码,使用urlurllib2下载文件,然后使用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

查看Python Bindings

这是SO link