Как получить битрейт, частоту дискретизации и количество битов на выборку в python-vlc

Я пытаюсь получить битрейт, фактические биты частоты дискретизации на образец аудиофайла, используя python-vlc.

Я видел, что мы можем использовать libvlc_media_tracks_get() для получения битрейта, но я не уверен, как получить другие.

Но даже если этот метод может получить все 3 информации, мне все равно не удастся заставить метод работать. Он принимает 2 аргумента p_md и tracks. Я не понимаю, что такое tracks. В нем говорится, что требуется экземпляр LP_LP_MediaTrack, но я никак не могу понять, что это значит.


person Arkyo    schedule 21.09.2020    source источник
comment
Вы сначала разобрали или воспроизвели медиа?   -  person mfkl    schedule 21.09.2020
comment
Да, я сделал это   -  person Arkyo    schedule 21.09.2020
comment
Если вы решили эту проблему самостоятельно, то либо подождите день и опубликуйте реальный ответ, если вы думаете, что другим будет полезно узнать, как это сделать, либо удалите вопрос, если вы думаете, что они смогут найти точно такую ​​же информацию. ты сделал. Не редактируйте ответ в вопросе, SO работает не так.   -  person Mike 'Pomax' Kamermans    schedule 21.09.2020
comment
Нет, я еще не нашел свой ответ. То, что я понял, как получить битрейт, не означает, что у меня есть другие.   -  person Arkyo    schedule 21.09.2020
comment
Можете ли вы объяснить, как я могу распечатать значение битрейта с помощью модуля python-vlc?   -  person Chris P    schedule 30.09.2020
comment
bits_per_sample = audio_total_size_in_bits/(total_duration_in_seconds*sample_rate_hz)   -  person Chris P    schedule 30.09.2020
comment
@ChrisP Я изменил вопрос и опубликовал ответ с его объяснением.   -  person Arkyo    schedule 30.09.2020


Ответы (1)


Битрейт:

# 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