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:17 di Vuott (Discussione | contributi) (Creata pagina con "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...")

(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)

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
  pose1 As Single
  pose2 As Single
  pose3 As Single
  pose4 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 = "/ruta/del/archivo/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 "Unknown"
   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 "Text"
 End Select
 Print

Next


' Libera la memoria:
 Free(p1)
 libvlc_media_release(md)
 libvlc_release(inst)
 
End


Riferimenti