Lire un flux radio sans fmodex (début d'hypothèse)
Publié : lun. 24/déc./2018 11:20
J'essaye de trouver un moyen pour lire les webradios sans utiliser la lib fmodex (bonne lib, mais qui fait 1,4 Mo et dont on utilise presque rien).
En écoutant en parallèle la radio et la diffusion par internet, je me suis rendu compte qu'il y avait une seconde de décalage.
Certaines radios sont de simples fichiers mp3 diffusés en continu.
Si on écoute un flux, et qu'on fait ctrl+s on obtient bien un fichier mp3.
Partant de là et sachant que PB lit les mp3 avec la lib movie, j'ai testé un truc.
Enregistrer quelques secondes puis les lire.
Programme très moche mais qui fonctionne et illustre le principe
Sur ce principe, je me suis dit qu'il devrait être possible à la fois d'enregistrer le fichier et de le lire par bloc.
Ici, je l'ai fait avec des fichiers car je manipule mal des downloads en mémoire.
Le problème est que le fichier interrompu est considéré comme non fermé et donc non lisible, c'est pourquoi je le recopie avant de le lire et ça marche.
J'ai pensé utiliser les fonction ReceiveNetworkData() il faut alors penser à créer le magic number pour créer l'entête mp3
Ce que je cherche à concrétiser serait donc de lire le flux par petits blocs d'une secondes puis de le lire en tant que fichier avec movie
Hypothèse 1: "tailler" le début du fichier fichier au fur et à mesure de l'avance en lecture
Hypothèse 2: Faire une succession de petits fichiers lus les uns après les autres (mais gérer l'eventuel bruit ou pause entre fichiers)
Si vous avez des suggestions, idées ?
Si ça fonctionne ce serait l'occasion d'une fonction qui pourrait être ajouté à la lib movie.
En écoutant en parallèle la radio et la diffusion par internet, je me suis rendu compte qu'il y avait une seconde de décalage.
Certaines radios sont de simples fichiers mp3 diffusés en continu.
Si on écoute un flux, et qu'on fait ctrl+s on obtient bien un fichier mp3.
Partant de là et sachant que PB lit les mp3 avec la lib movie, j'ai testé un truc.
Enregistrer quelques secondes puis les lire.
Programme très moche mais qui fonctionne et illustre le principe
Code : Tout sélectionner
InitNetwork()
OpenWindow(0, 0, 0, 500, 300, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Tmp_FileName$ = GetTemporaryDirectory() + "FluxRadio.mp3"
Telechargement = ReceiveHTTPFile("http://direct.franceinter.fr/live/franceinter-midfi.mp3", Tmp_FileName$, #PB_HTTP_Asynchronous)
If Telechargement
Repeat
; Charger 5 secondes de flux
Delay(1000)
i + 1
If i = 6 : Break : EndIf
Debug "Téléchargement en cours: " + HTTPProgress(Telechargement) + " octets reçus"
Delay(500) ; Libérer le CPU
ForEver
Else
Debug "Erreur de téléchargement"
EndIf
AbortHTTP(Telechargement)
FinishHTTP(Telechargement)
Delay(1000)
InitMovie()
; Je ne sais pas pourquoi, mais impossible de réouvrir le fichier
; Donc copie et là ça fonctionne
Tmp_FileName2$ = GetTemporaryDirectory() + "WebRadio.mp3"
CopyFile(Tmp_FileName$, Tmp_FileName2$)
Debug Tmp_FileName2$
Debug FileSize(Tmp_FileName2$)
If LoadMovie(0, Tmp_FileName2$)
PlayMovie(Read_Radio, WindowID(0))
Delay(5000)
EndIf
Ici, je l'ai fait avec des fichiers car je manipule mal des downloads en mémoire.
Le problème est que le fichier interrompu est considéré comme non fermé et donc non lisible, c'est pourquoi je le recopie avant de le lire et ça marche.
J'ai pensé utiliser les fonction ReceiveNetworkData() il faut alors penser à créer le magic number pour créer l'entête mp3
Ce que je cherche à concrétiser serait donc de lire le flux par petits blocs d'une secondes puis de le lire en tant que fichier avec movie
Hypothèse 1: "tailler" le début du fichier fichier au fur et à mesure de l'avance en lecture
Hypothèse 2: Faire une succession de petits fichiers lus les uns après les autres (mais gérer l'eventuel bruit ou pause entre fichiers)
Si vous avez des suggestions, idées ?
Si ça fonctionne ce serait l'occasion d'une fonction qui pourrait être ajouté à la lib movie.