用Python播放远程音频文件?

时间:2013-12-08 22:56:53

标签: python python-2.7 audio audio-streaming python-module

我正在寻找一种轻松播放远程 .mp3 文件的解决方案。我看过“pyglet”模块,该模块适用于本地文件,但它似乎无法处理远程文件。我可以临时下载 .mp3 文件,但由于 .mp3 文件看起来有多大,因此不予推荐。

我更希望它适用于跨平台而不是仅限Windows等。

示例,播放音频文件:

  

http://example.com/sound.mp3

只需在文件下载时传输文件,我的想法是用Python打开Soundcloud歌曲的MP3播放器。

3 个答案:

答案 0 :(得分:11)

您可以将GStreamerpython 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()

答案 1 :(得分:2)

Pygame是个好地方。它无论如何都不完美,但它确实可以处理声音,它还有一个混音器和midi支持。它也是跨平台的。

答案 2 :(得分:2)

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也很有趣。肯定会带给你一些想法。