如何在python-vlc中获取比特率,采样率和每个样本的位数

问题描述

我正在尝试使用python-vlc获取音频文件每个样本的比特率,采样率实际比特。

我看到我们可以使用libvlc_media_tracks_get()obtain bitrate,但是我不确定如何获得其他人。

但是即使该方法可以获取所有3个信息,我仍然无法设法使该方法起作用。它需要2个参数p_mdtracks。我不明白什么是tracks。它说它需要一个LP_LP_MediaTrack的实例,但我无法以某种方式找到它的含义。

解决方法

比特率:

# 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))时,我认为该库只是将media中的MediaTrack实例设置为复制到mediaTrack_pp所指向的实际内存位置

然后我们可以使用ctypes.cast()方法在Python中获取实际对象。该算法应适用于所有使用LP_xxx数据类型的Python代码,甚至适用于其他库。

解决了这个问题后,剩下的就是处理API文档。
VLC MediaTrack class documentation

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...