在 Python 中播放远程音频文件? [关闭]
Posted
技术标签:
【中文标题】在 Python 中播放远程音频文件? [关闭]【英文标题】:Playing remote audio files in Python? [closed] 【发布时间】:2013-12-25 22:51:57 【问题描述】:我正在寻找一种可以轻松播放远程 .mp3 文件的解决方案。我查看了适用于本地文件的“pyglet”模块,但它似乎无法处理远程文件。我可以临时下载 .mp3 文件,但由于 .mp3 文件可能看起来很大,因此不建议这样做。
我更希望它是跨平台的,而不是仅限 Windows 等。
例如,播放来自以下位置的音频文件:
http://example.com/sound.mp3
只需在下载文件时进行流式传输,我的想法是用 Python 编写一个 MP3 播放器,它可以打开 Soundcloud 歌曲。
【问题讨论】:
@LevLevitsky 我正在使用 Python 和 Tkinter 为 Soundcloud 创建一个 GUI 应用程序,有些声音可能超过 40 分钟。这会导致等待时间很长,我想要可以播放声音的东西。 我会选择 vlc 媒体播放器并使用子进程。它是跨平台的,支持流式传输。 【参考方案1】:Pygame 是一个很好的起点。它无论如何都不是完美的,但它确实可以处理声音,它有一个混音器,并且还支持 midi。它也是跨平台的。
【讨论】:
找不到播放远程文件的模块 API,但它似乎是一个很棒的模块! 刚试过。这对 Mixer.music 和 Sound 对象都不起作用。【参考方案2】:您可以将GStreamer 与python bindings 一起使用(需要PyGTK)。
那么你就可以使用这段代码了:
import pygst
import gst
def on_tag(bus, msg):
taglist = msg.parse_tag()
print 'on_tag:'
for key in taglist.keys():
print '\t%s = %s' % (key, taglist[key])
#our stream to play
music_stream_uri = 'http://mp3channels.webradio.antenne.de/chillout'
#creates a playbin (plays media form an uri)
player = gst.element_factory_make("playbin", "player")
#set the uri
player.set_property('uri', music_stream_uri)
#start playing
player.set_state(gst.STATE_PLAYING)
#listen for tags on the message bus; tag event might be called more than once
bus = player.get_bus()
bus.enable_sync_message_emission()
bus.add_signal_watch()
bus.connect('message::tag', on_tag)
#wait and let the music play
raw_input('Press enter to stop playing...')
GStreamer playbin Docs
更新
控制播放器:
def play():
player.set_state(gst.STATE_PLAYING)
def pause():
player.set_state(gst.STATE_PAUSED)
def stop():
player.set_state(gst.STATE_NULL)
def play_new_uri( new_uri ):
player.set_state(gst.STATE_NULL)
player.set_property('uri', new_uri )
play()
【讨论】:
【参考方案3】:PyAudio 似乎是您正在寻找的东西。它是一个 python 模块,可让您重现和录制流式音频文件。它还允许您实现服务器。
根据 PyAudio 的网站:在 GNU/Linux、Microsoft Windows 和 Apple Mac OS X 中运行。
这是我从http://people.csail.mit.edu/hubert/pyaudio/#examples 复制的示例:
"""PyAudio Example: Play a WAVE file."""
import pyaudio
import wave
import sys
CHUNK = 1024
if len(sys.argv) < 2:
print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0])
sys.exit(-1)
wf = wave.open(sys.argv[1], 'rb')
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
data = wf.readframes(CHUNK)
while data != '':
stream.write(data)
data = wf.readframes(CHUNK)
stream.stop_stream()
stream.close()
p.terminate()
我想你也会觉得this 很有趣。肯定会给你带来一些想法。
【讨论】:
以上是关于在 Python 中播放远程音频文件? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Win10 的音频设备图形隔离 怎么关?可不可以直接结束任务?如图
播放存储在谷歌驱动器中的音频文件(远程 URL) - Swift