Gambas France BETA


Pas de compte ? Incription

Faire un lecteur Multimedia :

Grâce à un bout de code de Vuott la réalisation simple d'un lecteur multimédia pour lire les webradios, les fichiers multimédia de votre disque dur ou d'internet.

L'exemple sur la forge : Lecteur multimedia

Le Code :



Nous allons utiliser un composant déjà tout prêt :
gb.media

Ne pas oublier de cocher ces composants dans les propriétés de votre projet.

Les déclarations nécessaires :


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
'les composants GB à cocher :
'dbus, desktop, desktop-X11 : pour utiliser les fonctions d'appel du bureau
'gui-trayicon : pour utiliser le dit trayicon
'media : pour utiliser les composants multimedia de gstream
'net et net.curl : pour utiliser le HTTPClient pour enregistrer les stations web
'sdl2.audio : pour fournir des sons au programme
'settings : pour enregistrer la configuration du programme
'ne pas oublier l'environnement graphique QT ou GTK (qui ne respecte pas les signatures de la freedesktop)


PRIVATE $TextArea1 AS TextArea 'pour affichage méta données
PRIVATE $slider1 AS Slider 'progression video
PRIVATE $DrawingArea1 AS DrawingArea 'affichage fichier
PRIVATE $mp AS MediaPlayer 'le media player
PRIVATE $ecran AS Control 'soit le drawingarea soit fenêtre externe
PRIVATE $i AS INTEGER 'indice du fichier webradio à enregistrer
PRIVATE $sAdress AS STRING 'variable devant contenir le futur flux
PRIVATE $hFile AS File 'fichier devant contenir le flux enregistré
PRIVATE $sTemp AS STRING 'variable temporaire
PRIVATE $ht AS HttpClient 'création du client HTTP
PRIVATE $sapScreenShot AS NEW Picture[]'enregistrement image
PRIVATE $bChoix AS BOOLEAN 'bascule entre fichier du disque et webradio
PRIVATE $bFichierWeb AS BOOLEAN 'bascule fichier web ou fichier
PRIVATE $sStationChoisie AS STRING 'station web choisie
PRIVATE $Meta AS NEW Collection 'collection des metadonnées
PRIVATE $ss AS NEW String[] 'pour l'enregistrement des metadonnées
PRIVATE $plugVis AS MediaControl 'le control de visionnage
PRIVATE $tipoPlug AS String[] = ["goom", "goom2k1", "monoscope", "spacescope",
"spectrascope", "synaescope", "wavescope", "Aucune"] ' les différents spectroscopes de gstreamer

STATIC PUBLIC hLock AS Stream '<-------' fichier de verrouillage du démarrage

PUBLIC sFichierChoix AS STRING 'fichier choisi pour lecture
PUBLIC ind AS INTEGER 'index des stations
PUBLIC siInd AS SHORT 'index des visions
PUBLIC saStationUrl AS String[] 'URL des stations
PUBLIC saNom AS String[] 'nom des stations
PUBLIC sChemMusique AS STRING 'chemin dossier musique
PUBLIC sDir AS STRING 'chemin d'enregistement image
PUBLIC sDirAudio AS STRING 'chemin d'enregistrement audio
PUBLIC bMenu AS BOOLEAN 'bascule menus ou non
PUBLIC bMeta AS BOOLEAN 'bascule meta ou non
PUBLIC bExterne AS BOOLEAN 'bascule menuexterne ou non
PUBLIC bBorder AS BOOLEAN 'bascule bordures ou non

Ces images pour situer chaque contrôle :




Le splitter va contenir un DrawingArea et un TextArea :


Qui vont recevoir l'affichage du spectroscope et des métadonnées.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
PUBLIC SUB _new() 'initialisations globales

Application.MainWindow = ME 'fenêtre principale
TRY hLock = LOCK User.home & "/." & Application.Title & "-" & Application.Version & "-lock" '<-- blocage fichier démarrage

IF ERROR THEN
Message.Title = ("Attention!")
Message(("Une seule instance du Progamme est possible."))
QUIT '<-------------------------' on peut car le formulaire n'est pas encore lancé
ENDIF

Module_Settings.InitDefaultPath '<-' Initializing the default path for storing settings
$TextArea1 = NEW TextArea(Splitter1) AS "TextArea1"
$TextArea1.Tooltip = ("Ensemble des Méta Données du flux"
$DrawingArea1 = NEW DrawingArea(Splitter1) AS "DrawingArea1"
$DrawingArea1.Tooltip = ("Zone de visionnage")
$slider1 = NEW Slider(ME) AS "slider1" 'slider pour déplacement dans videos
$mp = NEW MediaPlayer AS "MediaPlayer1" 'mediaplayer lui-même
$sapScreenShot = NEW Picture[] 'picture array d'images sauvegardées
$ecran = $DrawingArea1 'au démarrage est égal au drawingarea
sDir = "" 'répertoire images
sDirAudio = "" 'répertoire Audio
$bChoix = TRUE 'bascule sur stations radios pour commencer sur radio

END

L'ouverture du formulaire :


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
PUBLIC SUB Form_Open()

IF NOT Settings.Exist("General" &/ "ind") OR IsNull(ind) THEN
config()'<-------------------------------------------'configuration de première utilisation
ELSE
Module_Settings.RestoreSettings() '<-----------------' Restore settings
Module_Settings.RestoreFormPosition(ME)'<------------' Restore settings
ENDIF

SelectMusicFolder()
stations()
$DrawingArea1.Cached = TRUE 'pour obtenir un bel affichage
ToggleButton1.Value = FALSE 'situation d'ouverture
dimensions() 'dimensions des objets à l'ouverture
ComboBox1.Enabled = TRUE 'liste des radios accessibles
TrayIcon1.Show() 'affichage trayIcon dans barre de tâches
ME.Title = Application.Name & " ~ " & ("Version : ") & Application.Version
Menu2.Caption = ("Version : ") & Application.Version
$slider1.Visible = FALSE 'pas de slider sur web radios
$slider1.Enabled = TRUE
$slider1.H = 20
btnStop.Picture = Picture["icon:/small/stop"]
VisionCheck()
'["goom", "goom2k1", "monoscope", "spacescope", "spectrascope", "synaescope", "wavescope", "Aucune"] ' les différents spectroscopes de gstreamer pour rappel
sIndVision()
bMenuMenu() 'menus visibles ou non
bMenuMeta() 'metadonnées cochées ou non
bMenuExterne() 'fenêtre externe ou non
bMenuBorder() 'bordure de fenêtre ou non

END

Les stations de radio web :


1
2
3
4
5
6
7
8
9
10
11
12
13
PRIVATE SUB stations() 'sélection des stations web de radio

$sStationChoisie = saStationUrl[ind]'la station choisie correspond à l'index du combobox

WITH ComboBox1
.ReadOnly = TRUE 'pour pouvoir modifier la liste
.List = saNom
.Text = .List[ind]
END WITH

CATCH

END

Le bouton de lecture ou de pause :


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
PUBLIC SUB ToggleButton1_Click() 'lecture ou stop

IF ToggleButton1.Value THEN 'ToggleButton1.Value = True
$TextArea1.Clear
$sTemp = Temp 'affectation temporaire
Choix()

IF NOT MenuExterne.Checked THEN 'affectation du mediaplayer
$mp.SetWindow($DrawingArea1) 'affectation dans le drawingArea
ELSE
$mp.SetWindow(NULL) 'affectation dans fenêtre externe gérée par gstream
ENDIF

$mp.Play
ToggleButton1.Picture = Picture["icon:/small/pause"]
ToggleButton1.Tooltip = ("Pause")
ELSE 'ToggleButton1.Value = False
$mp.Pause
IF $bChoix THEN ComboBox1.Enabled = TRUE ELSE ComboBox1.Enabled = FALSE
Menu2.Caption = "Version : " & Application.Version ' jusqu'à changement pour fichier choisi
ToggleButton1.Picture = Picture["icon:/small/play"]
ToggleButton1.Tooltip = ("Lecture")
ENDIF

CATCH 'voir Mediaplayer1_message

END

Les évènements liés au mediaPlayer :


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
PUBLIC SUB MediaPlayer1_End()

ToggleButton1.Value = FALSE

END

PUBLIC SUB MediaPlayer1_State()

$Meta.Clear
$ss.Clear
'printMedia() 'pour contrôle

END

PUBLIC SUB MediaPlayer1_Message((Source) AS MediaControl, Type AS INTEGER, (Texte) AS STRING)'différents messages

SELECT CASE Type
CASE Media.Info
Message.Title = ("Message d'information ...")
Message.Info(Texte)
CASE Media.Warning
Message.Title = ("Message d'avertissement ...")
Message.Warning(Texte)
CASE Media.Error
Message.Title = ("Message d'erreur ...")
IF Texte = "Not Available" THEN
Message.Error(("Station indisponible") & "\n" & ("pour l'instant..."))
ELSE
Message.Error(Texte)
ENDIF
btnStop_Click()
END SELECT

END

PUBLIC SUB MediaPlayer1_Tag(tagList AS MediaTagList) 'meta données

FOR EACH tag AS STRING IN tagList.Tags
IF NOT $Meta.Exist(tag) THEN
$Meta[tag] = tagList[tag]
$ss.Push(tag)
$ss.Push(tagList[tag])
ELSE
$ss[$ss.Find(tag) + 1] = tagList[tag]
ENDIF
NEXT

$TextArea1.Clear

FOR c AS SHORT = 0 TO $ss.Max STEP 2
$TextArea1.Text &= $ss[c] & ": " & $ss[c + 1] & gb.NewLine
NEXT

END

PUBLIC SUB MediaPlayer1_Position() 'position dans le flux

DIM monTexte AS STRING

IF $bChoix THEN 'radios
monTexte = ComboBox1.Text
$slider1.Visible = FALSE
ME.Title = monTexte & " ~ " & Str(Time(0, 0, 0, $mp.Pos * 1000))
ELSE 'fichier
monTexte = sFichierChoix
$slider1.Visible = TRUE
$slider1.MinValue = 0
$slider1.MaxValue = CInt($mp.duration)
$slider1.Value = CInt($mp.Pos)
ME.Title = monTexte & " ~ " & Str(Time(0, 0, 0, $mp.Pos * 1000)) & " / " & Str(Time(0, 0, 0, $mp.Duration * 1000))
ENDIF

END

L'utilisation du HTTPClient pour enregistrer une radio :


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
PUBLIC SUB TgBsauve_Click() 'sauvegarde radio

IF IsNull(sDirAudio) THEN MenuRepertSon_Click()

$hFile = OPEN sDirAudio &/ "Fichier" & CStr($i) & ".ogg" FOR CREATE 'instanciation du fichier de sauvegarde

IF $mp.State <> Media.playing THEN 'si radio ne joue pas
ModSon.son("beep")
RETURN
ENDIF

IF NOT $bChoix AND IF NOT $bFichierWeb THEN 'si pas fichier du web return
ModSon.son("beep")
RETURN
ENDIF

IF NOT TgBsauve.Value THEN 'false
TgBsauve.Picture = Picture["icon:/small/cancel"]
' TgBsauve.Enabled = False 'commenté à cause des stations qui ne veulent pas d'enregistrement
TgBsauve.Tooltip = ("Sauvegarde en attente")
ComboBox1.Enabled = FALSE 'pendant le temps de la sauvegarde
$ht = NEW HttpClient AS "HTTP" 'instanciation du client HTTP
$sAdress = "" 'vidage du fichier cible d'enregistrement
WITH $ht
.Close 'ferme tout flux éventuellement déjà ouvert
.URL = $sTemp
' .TimeOut = 20 'chez moi marche mieux sans
' .Async = True 'chez moi marche mieux sans
.TargetFile = $sAdress
' .Debug = True 'pour debugger la connection et voir les info du serveur
.Get 'voir HTTP_Read
END WITH
ELSE 'true
TgBsauve.Picture = Picture["icon:/small/save"]
TgBsauve.Background = Color.Default
TgBsauve.Tooltip = ("Sauvegarde arrêtée"
ComboBox1.Enabled = TRUE 'à nouveau accessible car sauvegarde arrêtée

IF $ht.Status = 4 THEN 'connection succès
ModSon.son("camera1")
$hfile.Save(sDirAudio &/ "Fichier" & CStr($i) & ".ogg", $sAdress)
Message.Title = ("Message d'information !")
Message.Info(("Enregistrement effectué" & "\n" & ("dans le répertoire ") & sDirAudio)
INC $i 'incrément de $i
$ht.Stop() 'requête annulée
$hfile.Close 'fermeture du fichier enregistré
ELSE 'connection échec
ModSon.son("beep")
Message.Title = ("Message d'erreur !")
Message.Error(("Enregistrement impossible"))
ENDIF

ENDIF

END

PUBLIC SUB HTTP_Read() 'lecture de la station pour enregistrement

DIM sBuf AS STRING

' sBuf = Read #$ht, -100000 'idem suivant
' Read #$ht, sBuf, -100000 'demander à Vuott pourquoi cette valeur
READ #$ht, sBuf, -Lof(LAST)
$sAdress &= sBuf

END

PUBLIC SUB HTTP_Connect() 'connection établie

' Print "Connection à " & $ht.URL & " établie";; "$ht.Status = ";; $ht.Status
TgBsauve.Tooltip = ("Connection établie" & "\n" & ("Enregistrement en cours.")
TgBsauve.Background = Color.Red 'couleur indiquant l'enregistrement
' TgBsauve.Enabled = True 'ne fonctionne pas sur certaines radios qui refusent l'enregistrement

END

Choix d'un spectroscope parmi ceux proposés par Gstreamer :


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PRIVATE SUB sIndVision() 'choix de la visionneuse

IF siInd <> 7 THEN
$plugVis = NEW MediaControl($mp, $tipoPlug[siInd]) 'instanciation des visionnages
ELSE
$plugVis = NULL
$DrawingArea1.Clear
ENDIF

$mp.Video.Visualisation = $plugVis
WAIT
ToggleButton1.Value = TRUE

CATCH

END

Le trayIcon


car on peut simplement écouter les radios sans formulaire visible
1
2
3
4
5
6
PUBLIC SUB TrayIcon1_Click()

ME.Minimized = NOT ME.minimized
IF NOT ME.Minimized THEN ME.Show 'pour avoir la form au dessus des autres

END



====================

Navigation :



<-- Liens du Wiki : <--
<-- Accueil du WIKI : <--

====================

La Documentation :



====================