valaquarus | #1 Posté le 29/6/2024 à 08:38:08 |
---|
-- Unus Ex Altera -- | Bonjour à tous, comment obtenir les dimensions d'une vidéo ?Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
vuott | #2 Posté le 29/6/2024 à 21:53:26 |
---|
Ne cedere ineluctabili possimus | Vous pouvez utiliser les fonctions externes de libvlc:
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
76
77
78
79
80
81
82
83
84
85
86
87
88
| LIBRARY "libvlc:5.6.1"
PUBLIC STRUCT video_track_t i_height AS INTEGER i_width AS INTEGER i_sar_num AS INTEGER i_sar_den AS INTEGER i_frame_rate_num AS INTEGER i_frame_rate_den AS INTEGER i_orientation AS INTEGER i_projection AS INTEGER f_yaw AS SINGLE f_pitch AS SINGLE f_roll AS SINGLE f_field_of_view AS SINGLE i_multiview AS BYTE END STRUCT
PRIVATE ENUM libvlc_media_parse_local = 0, libvlc_media_parse_network, libvlc_media_fetch_local, libvlc_media_fetch_network = 4, libvlc_media_do_interact = 8
'libvlc_instance_t * libvlc_new (int argc, const char *const *argv) ' Create And initialize a libvlc instance. PRIVATE EXTERN libvlc_new(argc AS INTEGER, argv AS String[]) AS POINTER
'libvlc_media_t * libvlc_media_new_path (libvlc_instance_t *p_instance, const char *path) ' Create a media for a certain file path. PRIVATE EXTERN libvlc_media_new_path(p_instance AS POINTER, path AS STRING) AS POINTER
'int libvlc_media_parse_with_options (libvlc_media_t *p_md, libvlc_media_parse_flag_t parse_flag, int timeout) ' Parse the media asynchronously with options. PRIVATE EXTERN libvlc_media_parse_with_options(p_md AS POINTER, parse_flag AS INTEGER, timeout AS INTEGER) AS INTEGER
'unsigned libvlc_media_tracks_get (libvlc_media_t * p_md, libvlc_media_track_t *** tracks) ' Get media descriptor's elementary streams description. PRIVATE EXTERN libvlc_media_tracks_get(p_md AS POINTER, tracks AS POINTER) AS INTEGER
'void libvlc_media_release (libvlc_media_t *p_md) ' Decrement the reference count of a media descriptor object. PRIVATE EXTERN libvlc_media_release(p_md AS POINTER)
'libvlc_release (libvlc_instance_t * p_instance) ' Decrement the reference count of a libvlc instance, and destroy it if it reaches zero. PRIVATE EXTERN libvlc_release(p_instance AS POINTER)
PUBLIC SUB Main()
DIM inst, md, p AS POINTER DIM b AS BYTE DIM s AS STRING DIM tp, i AS INTEGER DIM vt AS Video_track_t
s = "/Chemin/du/fichier/vidéo" PRINT "Nom du fichier vidéo: " s inst = libvlc_new(0, NULL) IF inst == 0 THEN Error.Raise("Erreur !") md = libvlc_media_new_path(inst, s) IF md == 0 THEN Error.Raise("Erreur !") libvlc_media_parse_with_options(md, libvlc_media_parse_local, 0) REPEAT WAIT 0.01 i = libvlc_media_tracks_get(md, VarPtr(p)) UNTIL i > 0
FOR b = 0 TO i - 1 tp = Int@(Pointer@(p + (SizeOf(gb.Pointer) * b)) + 12) IF tp == 1 THEN vt = Pointer@(Pointer@(p) + (SizeOf(gb.Pointer) * 3)) WITH vt PRINT "\nDimensions du vidéo: " .i_width; "x"; .i_height; " pixel" END WITH ENDIF NEXT ' Libère la mémoire: libvlc_media_release(md) libvlc_release(inst) END
|
« Vita non suavis esse potest, nec Mors amara. » |
valaquarus | #3 Posté le 30/6/2024 à 10:12:44 |
---|
-- Unus Ex Altera -- | Bonjour Vuott, J'ai repris ton code et l'aie inscrit dans un module. J'ai deux erreurs : p n'est pas initialisé et la librairy n'est pas trouvée :
Je n'ai pas la librairy libvlc d'installé mais une autre libvlc5. J'ai changé la mention mais ça renvoie toujours la même erreur (code 60)Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
vuott | #4 Posté le 30/6/2024 à 11:14:56 |
---|
Ne cedere ineluctabili possimus | "p n'est pas initialisé" Ce n'est pas un problème.
En ce qui concerne la déclaration de la librairy, essayez ceci:
« Vita non suavis esse potest, nec Mors amara. » |
valaquarus | #5 Posté le 30/6/2024 à 12:50:03 |
---|
-- Unus Ex Altera -- | Merci Vuott, nous avons passé un cap, nouvelle erreur :
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
linuxos | #6 Posté le 30/6/2024 à 13:19:16 |
---|
Un peu de sel, de poivre et la crevette sera... | valaquarus,
Peut-etre plus simplement:
exiftool <fichier video>
ou
mediainfo <fichier video>
ou
ffprobe <fichier video>
Lien au cas ou: https://stackoverflow.com/questions/684015/how-can-i-get-the-resolution-width-and-height-for-a-video-file-from-a-linux-co
OlivierLorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous. |
valaquarus | #7 Posté le 30/6/2024 à 13:41:02 |
---|
-- Unus Ex Altera -- | Bonjour Linuxos, comment se sert on de ces commandes ?Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
vuott | #8 Posté le 30/6/2024 à 13:44:24 |
---|
Ne cedere ineluctabili possimus | nous avons passé un cap, nouvelle erreur : Je ne sais pas ce que c’est.« Vita non suavis esse potest, nec Mors amara. » |
vuott | #9 Posté le 30/6/2024 à 13:55:12 |
---|
Ne cedere ineluctabili possimus | Avez-vous la librairy 'Libquicktime' sur votre système ? « Vita non suavis esse potest, nec Mors amara. » |
spheris | #10 Posté le 30/6/2024 à 13:57:13 |
---|
| Valaquarus, Pour compléter ce que dit LinuxOs, utilise la commande shell ou exec.
Que ce soit exiftool, mediainfo, ou ffprobe, ces applications doivent être installées via ton gestionnaire de paquets. ;-) |
vuott | #11 Posté le 30/6/2024 à 13:58:05 |
---|
Ne cedere ineluctabili possimus | nous avons passé un cap, nouvelle erreur : Pouvez-vous lancer le programme en mode "étape par étape" et voir à quelle ligne l’erreur est soulevée?« Vita non suavis esse potest, nec Mors amara. » |
valaquarus | #12 Posté le 30/6/2024 à 14:20:40 |
---|
-- Unus Ex Altera -- | Il s'agit de cette ligne :
1
| IF md == 0 THEN Error.Raise("Erreur !")
|
Si elle est commentée il n'y a plus d'erreur affichée mais il ne se passe rien.
Je n'ai pas libquicktime d'installé.Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
valaquarus | #13 Posté le 30/6/2024 à 15:21:29 |
---|
-- Unus Ex Altera -- | Voici ce que j'ai fait avec le module de Vuott :
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
| PUBLIC SUB MenuExterne_Click() '<--------------------------' affichage fenêtre externe ou pas
$DrawingArea1.Clear
IF bExterne THEN $ecran.Window.Close() '<---------------' fermeture de la fenêtre externe
IF Desktop.Platform == "wayland" THEN $plugVis = NULL $ecran = NULL $mp.Video.Output = NULL '<---------------------------' fenêtre Gstreamer ELSE IF NOT MenuExterne.Checked THEN ME.AutoResize = FALSE ME.Resizable = TRUE Module_Settings.RestoreFormPosition(ME) $ecran = $DrawingArea1 bExterne = FALSE ELSE $ecran = NEW Window '<---------------------------' Nouvel objet créé à la volée $hObs = NEW Observer($ecran) AS "obs" '<---------' utilisation de l'observer attribué au nouvel objet '.Window
' $ecran.H = $DrawingArea1.H * 16 / 9 '<---------' définition des dimensions du nouvel objet ' $ecran.W = $DrawingArea1.W * 16 / 9 '<---------' définition des dimensions du nouvel objet
MDimVideo.video(Track) 'Track = $mp.URL '<------' appel du module
$ecran.H = MDimVideo.vt.i_height $ecran.W = MDimVideo.vt.i_width
$ecran.SetFocus() '<------------------------------' attribution du focus au nouvel objet $ecran.Window.Show() '<---------------------------' on montre le nouvel objet $ecran.Window.Text = ("~ Fenêtre Externe ~" bExterne = TRUE ENDIF
$mp.SetWindow($ecran) '<-----------------------------' sortie affichage sur $ecran interne ou externe dimensions() ENDIF
CATCH Message.Title = ("Une erreur est survenue !") Message.Error(Str(Error.Class) & ", code : " & Error.Code & "\n" & Str(Error.Backtrace) & " à " Error.Where)
END
|
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
| ' Gambas module file
LIBRARY "libvlc:5"
PUBLIC STRUCT video_track_t i_height AS INTEGER i_width AS INTEGER i_sar_num AS INTEGER i_sar_den AS INTEGER i_frame_rate_num AS INTEGER i_frame_rate_den AS INTEGER i_orientation AS INTEGER i_projection AS INTEGER f_yaw AS SINGLE f_pitch AS SINGLE f_roll AS SINGLE f_field_of_view AS SINGLE i_multiview AS BYTE END STRUCT
PUBLIC vt AS Video_track_t
PRIVATE ENUM libvlc_media_parse_local = 0, libvlc_media_parse_network, libvlc_media_fetch_local, libvlc_media_fetch_network = 4, libvlc_media_do_interact = 8
PRIVATE EXTERN libvlc_new(argc AS INTEGER, argv AS String[]) AS POINTER PRIVATE EXTERN libvlc_media_new_path(p_instance AS POINTER, path AS STRING) AS POINTER PRIVATE EXTERN libvlc_media_parse_with_options(p_md AS POINTER, parse_flag AS INTEGER, timeout AS INTEGER) AS INTEGER PRIVATE EXTERN libvlc_media_tracks_get(p_md AS POINTER, tracks AS POINTER) AS INTEGER PRIVATE EXTERN libvlc_media_release(p_md AS POINTER) PRIVATE EXTERN libvlc_release(p_instance AS POINTER)
PUBLIC SUB video(s AS STRING) AS Video_track_t '<---------------' fonction
DIM inst, md, p AS POINTER DIM b AS BYTE DIM tp, i AS INTEGER
inst = libvlc_new(0, NULL) IF inst == 0 THEN Error.Raise("Erreur !")
md = libvlc_media_new_path(inst, s) IF md == 0 THEN Error.Raise("Erreur !") '<--------------------' si cette ligne est commentée il n'y a pas d'erreur mais la fenêtre externe n'est pas ouverte
libvlc_media_parse_with_options(md, libvlc_media_parse_local, 0)
REPEAT WAIT 0.01 i = libvlc_media_tracks_get(md, VarPtr(p)) UNTIL i > 0
FOR b = 0 TO i - 1 tp = Int@(Pointer@(p + (SizeOf(gb.Pointer) * b)) + 12) IF tp == 1 THEN vt = Pointer@(Pointer@(p) + (SizeOf(gb.Pointer) * 3)) ENDIF NEXT
RETURN vt
libvlc_media_release(md) libvlc_release(inst)
END
|
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
vuott | #14 Posté le 30/6/2024 à 18:56:45 |
---|
Ne cedere ineluctabili possimus | Uhmmm...une solution, utilisant uniquement les ressources Gambas, pourrait être la suivante (le composant gb.media doit également être activé):
[Caput codicis] Public Sub Main() Dim mp As New MediaPlayer mp.URL = Media.URL("/chemin/du/fichier/vidéo") mp.Play With mp.Video.Image Print "Dimensions du vidéo: "; .W; "x"; .H; " pixel" End With mp.Close Quit End [terminus codicis]« Vita non suavis esse potest, nec Mors amara. » |
valaquarus | #15 Posté le 30/6/2024 à 19:56:00 |
---|
-- Unus Ex Altera -- | Fantastique de simplicité. Mais si on avait pu faire plus compliqué ...
Merci Vuott de cette leçon de choses Gracie milleSystème d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |