2016-07-03 44 views
5

Sto cercando di scrivere uno script python che giocherà mp3 da Soundcloud URLCome si gioca mp3 dal URL

Questo è quello che ho già fatto:

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) 

ho cercato pyaudio con molte opzioni come cambiare formati, canali, velocità. e ho appena ricevuto uno strano suono dagli altoparlanti, ho cercato su Google il pyaudio riproducendo mp3 e non ho trovato alcuna informazione.

Ho provato pygame creando Sound oggetto passando i byte dal mp3 e quindi semplicemente eseguendo la funzione di riproduzione. Non ricevo errori: lo script viene eseguito ma non sta giocando nulla.

Sto lavorando con Python 3 e Ubuntu.

+0

Immagino che dovrai trovare un modo per scaricare i file come mp3 e poi riprodurli come hai detto con pygame per esempio. Il download dovrebbe essere la parte difficile comunque ... Come sarebbe url = "sound_cloud url"? Puoi fare un esempio? Avevo qualcosa come url = "soundcloud.com/artist/song.mp3" che potevi semplicemente usare: import os; os.system ('wget' + url) ma dubito che l'url abbia questo formato. – Ohumeronen

+0

ho bisogno di essere trasmessa, l'url è simile al seguente: "https://ec-media.sndcdn.com/cWHNerOLlkUq.128.mp3?f10880d39085a94a0418a7ef69b03d522cd6dfee9399eeb9a522079b6afcbe3bd34f537531708eb245f81c7e0db701476a167319865dd299cf41501b5895e9caee9e3be93d" qualcuno? – LichKing

+0

Ottengo "403 - Vietato" se clicco su quell'URL. Sei sicuro che l'URL sia corretto? – Ohumeronen

risposta

7

Se vi capita di avere VLC installato (o sono disposti a installarlo), allora questo dovrebbe funzionare:

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

Questo ha il vantaggio che funziona con tutto ciò con cui VLC lavora, non solo con l'MP3. Può anche essere messo in pausa se lo si desidera.

0

Verificare se è possibile scaricare manualmente il file utilizzando tale URL. Se il suo sito protetto con username/passwd, potrebbe essere necessario averne cura prima.

In caso contrario, qui è un codice funzionante che scarica il file da url utilizzando urllib2 e quindi lo riproduce utilizzando pydub.

È un processo in due passaggi in cui il primo file mp3 viene scaricato e salvato in file e quindi riprodotto utilizzando un lettore esterno.

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) 

** Aggiornamento **
Hai fatto menzione di cui avete bisogno in streaming via web. In tal caso si consiglia di guardare GStreamer con Python Bindings

Ecco uno SO link per quello.

2

dispiace, ma non ho python3 per testare qui, per lo streaming mp3 utilizzando pyaudio è necessario decodificare in dati PCM, so che pymedia può farlo, ma è troppo vecchio e solo sostengo python27.

Per fare ciò nel modo giusto è necessario conoscere alcuni attributi del proprio audio, cose come samplerate, numero di canali, risoluzione bit, per impostarlo nel pyaudio.

posso mostrare come lo faccio usando python27 + pyaudio, prima vi mostrerò come è fatto per lo streaming .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) 

scegliere buffer di grandi dimensioni, Python è lento nel ciclo while, l'ho fatto con pezzi di dimensioni 8192, notare che format, channels e rate sono attributi del rigth per questo file wav, quindi per .wav non abbiamo bisogno di decodifica, è un dato PCM, ora mp3 avremo bisogno di decodificare e mettere in formato PCM per lo streaming.

Lets provare a utilizzare 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) 

Questo può essere un segreto, perché non ho mai visto nessuno che mostra come questo può essere fatto in Python, per python3 io non so nulla in grado di decodificare .mp3 in pezzi come PyMedia do .

Ecco questi due codici sono streming e lavorando per .wav e .mp3