Ottenere informazioni generali e metadati da file audio-video con le risorse del API di VLC
Da Gambas-it.org - Wikipedia.
Versione del 3 gen 2020 alle 13:26 di Vuott (Discussione | contributi)
Con la libreria VLC è possibile anche estrarre da un file multimediale informazioni generali ed evenuali metadati.
E' necessario avere installata nel sistema e richiamare in Gambas la libreria condivisa: "libvlc.so.5.6.0"
Mostriamo un esempio:
Library "libvlc:5.6.0" 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 Struct audio_track_t i_channels As Integer i_rate As Integer 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 'libvlc_time_t libvlc_media_get_duration(libvlc_media_t *p_md) ' Get duration (in ms) of media descriptor object item. Private Extern libvlc_media_get_duration(p_md As Pointer) As Long 'char* libvlc_media_get_meta (libvlc_media_t * p_md, libvlc_meta_t e_meta) ' Read the meta of the media. Private Extern libvlc_media_get_meta(p_md As Pointer, e_meta As Integer) As String '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 'const char * libvlc_media_get_codec_description (libvlc_track_type_t i_type, uint32_t i_codec) ' Get codec description from media elementary stream. Private Extern libvlc_media_get_codec_description(i_type As Integer, i_codec As Integer) As String '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, p1, p2 As Pointer Dim tm As Long Dim b As Byte Dim s As String Dim tp, i As Integer Dim vt As Video_track_t Dim at As Audio_track_t Dim meta As String[] = ["Title:", "Artist:", "Genre", "Copyright:", "Album", "TrackNumber:", "Description:", "Rating:", "Date:", "Setting:", "URL:", "Language:", "NowPlaying:", "Publisher:", "EncodedBy:", "ArtworkURL:", "TrackID:", "TrackTotal:", "Director:", "Season:", "Episode:", "ShowName:", "Actors:", "AlbumArtist:", "DiscNumber:", "DiscTotal:"] Dim orient As String[] = ["Normal", "Flipped horizontally", "Flipped vertically", "Rotated 180 degrees", "Transposed", "Rotated 90 degrees clockwise", "Rotated 90 degrees anti-clockwise", "Anti-transposed"] s = "/percorso/del/file/video" Print "Nome file: "; s inst = libvlc_new(0, Null) md = libvlc_media_new_path(inst, s) libvlc_media_parse_with_options(md, libvlc_media_parse_local, 0) Sleep 0.1 tm = libvlc_media_get_duration(md) Print "Durata: "; Date(0, 0, 0, 0, 0, 0, tm) Print "\n- Metadati -" For b = 0 To meta.Max s = libvlc_media_get_meta(md, b) If Not IsNull(s) Then Print meta[b]; String(17 - Len(meta[b]), Chr(32)); s Next Print "\n- Codificatore -" p1 = Alloc(24) p2 = VarPtr(p1) i = libvlc_media_tracks_get(md, VarPtr(p2)) For b = 0 To i - 1 tp = Int@(Pointer@(p2 + (SizeOf(gb.Pointer) * b)) + 12) Print "Codifica: "; libvlc_media_get_codec_description(tp, Int@(Pointer@(p2 + (SizeOf(gb.Pointer) * b)))) Print "Tipo media: "; Select Case tp Case -1 Print "Sconosciuto" Case 0 Print "Audio" at = Pointer@(Pointer@(p2 + (SizeOf(gb.Pointer))) + 24) With at Print "Canali: "; at.i_channels Print "Frequenza camp.: "; at.i_rate End With Case 1 Print "Video" vt = Pointer@(Pointer@(p2) + 24) With vt Print "Risoluzione: "; .i_width; "x"; .i_height Print "Fotogrammi/sec.: "; .i_frame_rate_num Print "Orientazione: "; orient[.i_orientation] End With Case 2 Print "Testo" End Select Print Next ' Libera la memoria: Free(p1) libvlc_media_release(md) libvlc_release(inst) End