【问题标题】:How to play mp3 from URL如何从 URL 播放 mp3
【发布时间】:2016-11-05 09:16:10
【问题描述】:

我正在尝试编写一个可以从 Soundcloud URL 播放 mp3 的 python 脚本

这是我已经做过的:

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

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

我正在使用 Python 3 和 Ubuntu。

【问题讨论】:

  • 我猜你必须找到一种方法,首先将文件下载为 mp3,然后按照你提到的使用 pygame 播放它们。然而,下载应该是困难的部分...... url = "sound_cloud url" 会是什么样子?能给我举个例子吗?我你有类似 url="soundcloud.com/artist/song.mp3" 的东西,你可以简单地使用: import os; os.system('wget' + url) 但我怀疑 url 有这种格式。
  • 我需要它进行流式传输,网址如下所示:“ec-media.sndcdn.com/…”任何一个?
  • 如果我点击那个 url,我会得到“403 - Forbidden”。你确定网址正确吗?
  • 有可能,但您需要先解码PCM数据和流中的下载块......

标签: python ubuntu audio


【解决方案1】:

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

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

它的优点是它适用于 VLC 的所有功能,而不仅仅是 MP3。如果您愿意,也可以暂停。

您可以使用

为 python 安装 vlc
pip install python-vlc

【讨论】:

    【解决方案2】:

    抱歉,我这里没有 Python3 可以测试,使用 pyaudio 流式传输 mp3 您需要在 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)
    

    选择大缓冲区,python 在 while 循环中很慢,我使用大小为 8192 的块来完成它,请注意 formatchannelsrate 是这个 wav 文件的 rigth 属性,所以对于.wav,我们不需要解码,它是一个PCM 数据,现在对于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,我不知道任何可以将 .mp3 解码成 pymedia 那样的片段。

    这里这两个代码是为.wav.mp3 工作的

    【讨论】:

    • 好吧,这让我的扬声器爆炸了:/
    【解决方案3】:

    检查您是否可以使用 URL 手动下载文件。如果其受保护的站点使用用户名/密码,您可能需要先处理好它。

    如果没有,这里有一个工作代码,它使用urllib2url 下载文件,然后使用pydub 播放它。

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

    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)
    

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

    这是一个SO link

    【讨论】:

      猜你喜欢
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      • 2016-04-06
      • 2017-10-12
      相关资源
      最近更新 更多