Gambas France BETA


Pas de compte ? Incription

H & W d'une vidéo

Ce sujet est résolu.

12
AuteurMessages
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.1.1 ~ Version Gambas : 3.19.2
vuott#2 Posté le 29/6/2024 à 21:53:26
Ne cedere ineluctabili possimusVous 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.1.1 ~ Version Gambas : 3.19.2
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:
1
LIBRARY "libvlc:5"
« 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.1.1 ~ Version Gambas : 3.19.2
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

Olivier
Lorsqu'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.1.1 ~ Version Gambas : 3.19.2
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 possimusAvez-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.1.1 ~ Version Gambas : 3.19.2
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.1.1 ~ Version Gambas : 3.19.2
vuott#14 Posté le 30/6/2024 à 18:56:45
Ne cedere ineluctabili possimusUhmmm...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 mille
Système d'exploitation : KDE neon 6.1.1 ~ Version Gambas : 3.19.2
12