gpt4 book ai didi

java - 使用 JLayer 将 MP3 解码为 PCM 来检测幅度

转载 作者:行者123 更新时间:2023-12-01 14:05:33 25 4
gpt4 key购买 nike

背景:我正在使用 JLayer播放 MP3 文件。我正在尝试分析 MP3 中变化的幅度/音频电平。通过分析,我想确定 MP3 开头和结尾处的静音持续时间。此外,当 MP3 正在播放时,我想要一个图表来显示音频级别(如视觉声波)。

问题:为了进行有效的分析,我需要能够分析原始 PCM 数据。目前,我正在分析通过 AudioInputStream 检索并发送到 SourceDataLine 的 byte[]。 PCM 是短[​​]而不是字节[],这意味着我没有获得完整的数据。

我使用均方根 (RMS) 来确定音量级别。

处理byte[]的播放代码:

AudioInputStream in = null;
AudioFile af = null; //Custom class which holds some data about mp3.
SourceDataLine line = null;

// Set current audio file.
af = musicPlaylist.get(0);

line = (SourceDataLine) AudioSystem.getLine(af.getLineInfo());
line.open(af.getAudioFormat());
line.start();

in = getAudioInputStream(af.getAudioFormat(), af.getAudioStream());

int bR = playbackBufferSize;

final byte[] buffer = new byte[bR];
int n = 0;
while (playMedia) {
if ((n = in.read(buffer, 0, buffer.length)) == -1) {
break;
}

if (line != null) {
line.write(buffer, 0, n);

int amp = (int) Math
.ceil((rmsAudioLevel(decode(buffer)) / 32767) * 100);
mainScreen.setAmpDisplayLevel(amp, String.valueOf(amp));
mainScreen.updateGraph(amp);
}
}

本质上:如何在播放 MP3 时现场解码 PCM 数据,以便我可以显示音量级别并检测沉默?

最佳答案

首先,您将获取 buffer[] 中的所有 PCM 数据。但您可能必须将字节组装成 PCM 数据。您的音频格式将告诉您正在使用多少位编码。最常见的是 16 位数据,但有时也会出现 24 或 32 位数据。对于 16 位数据,您可以附加两个连续的字节来构建一个短数据。两个字节的顺序取决于格式是小端还是大端。我注意到此屏幕右侧的“相关”列中有一个链接:如何从 wav 文件获取 PCM 数据 - 该链接或其他类似链接应该会为您提供所需代码的示例。

第二个问题,我认为在单独的 buffer[] 数组上执行 RMS 并不完全正确。我在这一点上可能是错的。我认为它更像是一个移动平均值,其中一个 buffer[] 开头的一些数据应该包括前一个 buffer[] 结尾的一些数据。该公式是否要求您“返回”或“平均”N 个帧?如果是这样,您将需要保留之前的 buffer[],以应对 N 数量跨越两帧的情况。并且您将迭代当前的 buffer[],一次一“帧”(或者将 buffer[] 传递给实际上执行此操作的子例程)。

关于java - 使用 JLayer 将 MP3 解码为 PCM 来检测幅度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18938622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com