如何将音频数据与时间相关联

Posted

技术标签:

【中文标题】如何将音频数据与时间相关联【英文标题】:How to relate audio data to time 【发布时间】:2015-03-05 22:15:22 【问题描述】:

假设我想从 Mp3 文件中读取 1 毫秒的声音数据并呈现它。像这样的:

var stream = NAudio.WaveStream.Mp3FileReader(filename);
int intervalInMilliseconds = someInterval;
int bytesPerInterval = ???;
for(int i = 0; i < bytesPerInterval;i++)

     Console.WriteLine(stream.GetByte());

我需要做什么来解决 bytesPerInterval?这甚至可以准确地做到吗? (注意:这里不需要 NAudio,这正是我目前使用的。)

或者如果我有一个字节索引,是否可以确定播放该字节的时间点(相对于时间 00:00:0000)?

【问题讨论】:

【参考方案1】:

您无法直接从 MP3 读取 1 毫秒的音频数据。 MP3 在具有固定大小时间片的频域中工作。一个典型的切片大约是 13 毫秒。

要获得准确的时序,您需要将音频转换回时域中的样本。使用 16 位 PCM 样本每秒对 CD 质量的音频进行 44,100 次采样。计算此数据的原始大小(以字节为单位)很简单:

sampleCount * bytesPerSample * channels

此外,一毫秒的音频不会平均分为 44.1kHz,因此您需要选择合适的时间。

【讨论】:

你能举一个例子来读取一个时间片的平均划分吗?不确定如何定义 sampleCount 或 bytesPerSample。 @Colton 你想做什么?如果每 1/44,100 秒就有一个样本,那么选择一个是该样本数倍的点。每个样本的字节数是位深度。如果您有 16 位样本,则每个样本有 2 个字节。不过,这一切都与 MP3 无关。您只能在帧边界处对 MP3 进行切片,即便如此,您也必须处理位储存器,它可以将数据拖到远离您尝试播放的帧的几帧。 基本上,我只是想从这篇文章中了解音频数据的工作原理。我的最终目标是计算指定间隔、指定点等的声波幅度(不确定哪种技术最有用),然后在这些数据上应用 AI 技术。类似于音频可视化器所做的,但我需要字节,而不是视觉。我需要能够说“在 1.5 秒时,幅度为 x”,幅度将是 [1.5 间隔,1.5] 之间数据的总和......我认为。 @Colton 好的,所以完全放弃 MP3,因为这与您的问题完全无关。回到 PCM 样本的时域世界……这些样本值为采样的时间点量化的幅度值。有许多不同的方式来存储这些样本....不同的字节序、交织、浮点等,但归根结底都是幅度。 对,但我需要知道播放振幅的时间点。那么从 pcm 数据中,如果我想获取时间 0s 和时间 1s 之间的所有字节,我应该读取 44,100 个数据单位吗?我希望有一个源自 mp3 的示例(即显示我也需要检索 pcm 数据的任何内容)。我不是很精通音频,所以我不确定我所说的是否有道理。

以上是关于如何将音频数据与时间相关联的主要内容,如果未能解决你的问题,请参考以下文章

Android:如何将数据与联系人相关联

在 VueJS 中如何将输入类型复选框与输入类型文本相关联

如何将我的用户的支出与他们在 Firebase 中的个人资料相关联?

如何将文件类型与 iPhone 应用程序相关联?

如何将 PayPal 交易与我数据库中的会员帐户信息相关联?

如何将交易收据与可在 iTunes Connect 中下载的财务报告相关联?