Битрейт:
# This allocates a double pointer and a MediaTrack object in RAM, then points to
# it, but no value is assigned to this double pointer or the MediaTrack object.
mediaTrack_pp = ctypes.POINTER(vlc.MediaTrack)()
# Assigns the MediaTrack in the double pointer to the values stored in `media`,
# returning the amount of media tracks as `n`
n = vlc.libvlc_media_tracks_get(media, ctypes.byref(mediaTrack_pp))
# Converts the double pointer to `POINTER` class that Python understands. We can
# then get the value the pointer is pointing at.
info = ctypes.cast(mediaTrack_pp, ctypes.POINTER(ctypes.POINTER(vlc.MediaTrack) * n))
# This gets the actual value of the double pointer i.e. value of MediaTrack
media_tracks = info.contents[0].contents
Частота дискретизации (добавляя приведенный выше код):
# According to the API doc, MediaTrack class has an `u` field which has an
# `audio` field, containing the audio track.
audio = ctypes.cast(media_tracks.u.audio, ctypes.POINTER(vlc.AudioTrack))
# The AudioTrack class has a `rate` field, which is the sample rate.
sample = audio.contents.rate
Основная причина, по которой я не мог получить битрейт, заключается в том, что я не понимал, как получить тип данных LP_LP_MediaTrack
. Это двойной указатель экземпляра MediaTrack.
Когда vlc.libvlc_media_tracks_get(media, ctypes.byref(mediaTrack_pp))
запускается, я думаю, что библиотека просто устанавливает копии экземпляра MediaTrack в media
в фактическую область памяти, на которую mediaTrack_pp
указывает
Затем мы можем получить фактический объект в Python, используя метод ctypes.cast()
. Этот алгоритм должен применяться ко всем кодам Python, которые используют типы данных LP_xxx
, даже для других библиотек.
После того, как эта проблема была решена, осталось только изучить документацию по API.
Документация по классу VLC MediaTrack
person
Arkyo
schedule
30.09.2020