1

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

我看到我们可以libvlc_media_tracks_get()用来获取比特率,但我不知道如何获取其他的。

但即使这个方法可以获取所有 3 个信息,我仍然无法使该方法工作。它需要 2 个参数p_mdtracks. 我不明白是什么tracks。它说它需要一个实例,LP_LP_MediaTrack但我无法以某种方式找到这意味着什么。

4

1 回答 1

0

比特率:

# 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

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

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

于 2020-09-30T20:35:50.983 回答