我有一个采样率为
44100
的 mp3 文件,我们将其命名为 a.mp3
。
使用Python库
ffmpegio
和以下代码,我得到的样本总量等于290704
。
with ffmpegio.open(file, 'ra', blocksize = 16, sample_fmt = 'dbl') as file_opened:
for i, indata in enumerate(file_opened):
do some stuff
print((i + 1) * 16)
但是,
ffmpegio.probe.audio_streams_basic('a.mp3')[0]['nb_samples']
给了我
292608
如何解释
292608
和 290704
之间的区别?
我在
ffmpegio
文档中进行搜索,但没有发现任何引起我注意的内容:
https://python-ffmpegio.github.io/python-ffmpegio/
谢谢。
我试图获取有关如何计算样本总数的更多信息
ffmpegio.probe.audio_streams_basic()
而且,差异似乎并没有随着 mp3 文件长度的增加而增加。
(我是
ffmpegio
开发者)
据我所知,最有可能的嫌疑是
audio_streams_basic()
报告不正确nb_samples
。如果 ffprobe 不返回 audio_streams_basic
,则 nb_samples
根据 ffprobe 的输出计算 nb_samples
。它的计算是基本的 atm,仅基于持续时间时间戳,可能忽略开始时间和其他计时。
尝试
from pprint import pprint
pprint(ffmpegio.probe.full_details(file,select_streams=0))
并查看您是否在流信息中看到
nb_samples
。如果未包含,请在 GitHub 上报告问题,并提供剪切粘贴的流信息。
也可以尝试一下
fs, x = ffmpegio.audio.read(file)
print(x.shape)
确保样本计数与流读取器的样本计数匹配。
最后,除了处理发布评论的最后一个块之外,读取流保证一次返回
blocksize
个样本。