如何从 URL 播放 mp3

问题描述 投票:0回答:5

我正在尝试编写一个 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
许多选项,例如更改格式、频道、速率。 我只是从扬声器中听到奇怪的声音,我在 Google 上搜索了
pyaudio
播放 mp3,但没有找到任何信息。

我尝试通过传递 mp3 中的字节来创建

pygame
对象,然后执行播放函数。我没有收到任何错误:脚本运行但没有播放任何内容。

我正在使用 Python 3 和 Ubuntu。

python ubuntu audio
5个回答
16
投票

Sound

这样做的优点是它可以与 VLC 兼容的所有东西一起使用,而不仅仅是 MP3。如果您愿意,也可以暂停。

您可以使用

安装适用于 python 的 vlc

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



3
投票
pip install python-vlc

流式传输

mp3
,你需要在PCM数据中解码它,我知道
pymedia
可以做到这一点,但它太旧了,只支持pyaudio .

要以正确的方式执行此操作,您需要了解音频的一些属性,例如采样率、通道数、位分辨率,以便在 pyaudio 中进行设置。

我可以展示如何使用

python27

+

python27
来实现,首先我将展示如何进行流式传输
pyaudio

.wav

选择大缓冲区,Python在while循环中很慢,我使用大小为
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)

的块来完成它,请注意,

8192
format
channels
是这个
rate
文件的正确属性,所以对于
 wav
我们不需要解码,它是一个
.wav
数据,现在对于
PCM
,我们需要解码并以
mp3
格式进行流式传输。

让我们尝试使用

PCM


pymedia

这可能是秘密,因为我从未见过有人展示如何在 python 中完成此操作,对于 python3,我不知道任何可以将 .mp3 解码为像 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)

.wav
    


2
投票
.mp3

。如果其受保护站点带有用户名/密码,您可能需要首先处理它。


如果没有,这里有一个工作代码,使用

URL

url
下载文件,然后使用
pydub
播放它。 它是一个两步过程,其中第一个 mp3 文件被下载并保存到文件,然后使用外部播放器播放。

urllib2

** 更新 **
您确实提到您需要从网络流式传输。在这种情况下,您可能需要查看

GStreamer
Python Bindings 这是一个

SO 链接


0
投票

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)



0
投票

导入 urllib.request #codigo vale 从 pydub 导入 AudioSegment 从 pydub.playback 导入播放

mp3file = urllib.request.urlopen("http://colecciones.humboldt.org.co/rec/sonidos/IAvH-CSA-2/IAvH-CSA-2.mp3") 以 open('./test.mp3','wb') 作为输出: 输出.write(mp3file.read())

ipd.Audio('./test.mp3') # 萨利达音频

© www.soinside.com 2019 - 2024. All rights reserved.