如何从 URL 播放 mp3

新手上路,请多包涵

我正在尝试编写一个 python 脚本,它将从 Soundcloud URL 播放 mp3

这是我已经做过的:

 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,但没有找到任何信息。

我尝试了 pygame 通过创建 Sound 对象,方法是从 mp3 传递字节,然后执行播放功能。我没有收到任何错误:脚本运行但没有播放任何内容。

我正在使用 Python 3 和 Ubuntu。

原文由 LichKing 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 763
2 个回答

如果您碰巧安装了 VLC(或愿意安装它),那么这应该有效:

 import vlc
p = vlc.MediaPlayer("http://your_mp3_url")
p.play()

这样做的好处是它可以与 VLC 一起工作的所有东西一起工作,而不仅仅是 MP3。如果您愿意,也可以暂停。

您可以使用安装 python 的 vlc

 pip install python-vlc

原文由 randomdude999 发布,翻译遵循 CC BY-SA 4.0 许可协议

对不起,但我没有 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)

choose large buffer, python is slow in while loop, i did it using chunks of size 8192 , note that format , channels and rate are the rigth attributes for this wav file, so for .wav we not need decode, it is a PCM data, now for 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,我不知道任何可以像 pymedia 那样将 .mp3 解码成片段的东西。

这两个代码正在为 .wav.mp3 工作

原文由 ederwander 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题