在 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 播放音频文件时如何生成音频频谱?

播放存储在谷歌驱动器中的音频文件(远程 URL) - Swift

应用播放背景音频不起作用

Python播放mp3/wav文件音频(Pygame混音器)

按顺序播放音频文件[关闭]