11
votes

Enregistrement en streaming et économie de radio Internet en Python

Je cherche un extrait de Python pour lire un flux de radio Internet (.asx, .phs, etc.) et le sauvegarder dans un fichier.

Le projet final est le script Cron'ed qui enregistrera une heure ou deux de radio Internet, puis la transférer sur mon téléphone pour la lecture pendant mon trajet. (3G est un peu pointillé le long de mes commutes)

Les snippies ou les pointeurs sont les bienvenus.


0 commentaires

5 Réponses :


1
votes

Je ne connais que la façon dont les œuvres de streaming shoutcast (qui seraient le fichier .PLS que vous mentionnez):

Vous téléchargez le fichier Pls, qui n'est qu'une playlist. Son format est assez simple car il s'agit simplement d'un fichier texte qui pointe sur l'endroit où le flux réel est.

Vous pouvez vous connecter à ce flux car il est juste http, qui diffuse des flux MP3 ou AAC. Pour votre utilisation, il suffit d'enregistrer chaque octet, vous arrivez à un fichier et vous obtiendrez un fichier MP3 ou AAC, vous pouvez transférer sur votre lecteur MP3.

shoutcast a une addition qui est facultative: métadonnées. Vous pouvez trouver comment cela fonctionne ici , mais n'est pas vraiment nécessaire.

Si vous voulez une application d'exemple qui le fait, faites-moi savoir et je vais faire quelque chose plus tard.


1 commentaires

Merci, je vais essayer d'essayer



7
votes

Afin de bricoler et de jouer avec elle a trouvé StreamRipper travailler mieux. Ceci est la commande que j'utilise xxx


0 commentaires

3
votes

Je suis conscient que c'est d'un an, mais c'est toujours une question viable que j'ai récemment créé.

La plupart des stations de radio Internet vous donneront une option de type de téléchargement, je choisis la version mp3, puis lisez les informations d'une prise brute et écrivez-la dans un fichier. L'astuce consiste à déterminer la rapidité que votre téléchargement est comparé à la lecture de la chanson afin que vous puissiez créer une balance sur la taille de lecture / écriture. Ce serait dans votre tampon def.

Maintenant que vous avez le fichier, il convient de simplement le laisser sur votre lecteur (enregistrement), mais la plupart des joueurs supprimeront du fichier le chunk déjà joué et effacez le fichier hors du lecteur et de la RAM lorsque la diffusion en continu est arrêtée.

J'ai utilisé des extraits de code à partir d'une archive de fichier sans l'application de compression pour gérer une grande partie de la manipulation du fichier de fichiers, la lecture, la mise en mémoire tampon de la magie. Il est très similaire dans la façon dont le processus coule. Si vous écrivez un code sudo-code (que je recommande vivement), vous pouvez voir les similitudes.


1 commentaires

Y a-t-il vraiment besoin de s'inquiéter de la rapidité avec laquelle il est téléchargé en ce qui concerne la mise à la tamponner? Vous pouvez simplement avoir votre code sauver les morceaux audio tels qu'ils arrivent. C'est assez automatique avec Python en utilisant quelque chose comme: req = urllib.request.request (URL); resp = urllib.request.urlopen (req); en-tête = respectheaders (); avec ouvert (OUTFILE, 'WB') AS F: Shuttil.copyFileObj (respect, f)



13
votes

Ce qui suit a travaillé pour moi à l'aide de la bibliothèque de requêtes pour gérer la requête HTTP.

import requests

stream_url = 'http://your-stream-source.com/stream'

r = requests.get(stream_url, stream=True)

with open('stream.mp3', 'wb') as f:
    try:
        for block in r.iter_content(1024):
            f.write(block)
    except KeyboardInterrupt:
        pass


5 commentaires

Cela aide mais comment puis-je jeter des blocs répétés dans le fichier?


Il semble que requêtes ne prenne pas en charge Shoutcast Protocol (certaines radios), il soulève une erreur avec Badstatusline ('yle 200 OK \ r \ n',))


Voir ma solution pour cela ci-dessous, @Doomsday - Il m'a fallu un certain temps pour trouver le meilleur moyen, mais je remplace le contrôle de statut qui le fait et le dit icy 200 ok est vraiment http /1.0 200 OK Quel est le moyen le plus propre de passer cela et sur plus de choses amusantes. J'espère que ça aide!


Pour ceux qui recherchent l'URL du flux, sur de nombreux sites Web, il n'est pas évident où le trouver. Mais de nombreux sites de streaming fournissent un fichier .pls (playlist) à télécharger, et si vous ouvrez le fichier .PLS dans un éditeur de texte, il aura l'URL du flux.


Je me demande s'il existe un moyen de prendre les données audio dans "Bloc" et de le traiter pour l'espace mort - vous pouvez donc décider de savoir à l'écriture de ce bloc ou non.



7
votes

Si vous constatez que vos demandes ou vos demandes urllib.Request à Python 3 ne sauvegardent pas d'enregistrer un flux car vous recevez "ICY 200 OK" en retour au lieu d'une en-tête "http / 1.0 200", vous devez dire au sous-jacent Fonctions yle 200 OK est ok!

Ce que vous pouvez faire efficacement est d'intercepter la routine qui gère la lecture de l'état après l'ouverture du flux, juste avant de traiter les en-têtes. P>

Mettez simplement une routine comme celle-ci au-dessus de votre Code d'ouverture du flux. p> xxx pré>

puis mettez ces lignes au début de votre routine principale, avant d'ouvrir l'URL. P>

ORIGINAL_HTTP_CLIENT_READ_STATUS = urllib.request.http.client.HTTPResponse._read_status
urllib.request.http.client.HTTPResponse._read_status = NiceToICY


0 commentaires