Java - 确定从波形文件读取的字节数以获取时间戳

标签 java audio wav frame-rate sample-rate

我有一个AudioFormat对象(从audioInputStream.getFormat()返回)。我有一个时间戳(以毫秒为单位),我想开始从相应的 wav 文件中读取。如何确定从 AudioInputStream 读取/跳过多少字节才能到达适当的时间戳?

我对帧速率(以及它与采样率有何关系或无关)感到困惑。

这就是我到目前为止所拥有的...startPos 是以毫秒为单位的时间戳。

float skipTotalFrames = audioInputStream.getFormat().getFrameRate() * (startPos / 1000);
long byteStartPos = (long) (audioInputStream.getFormat().getFrameSize() * skipTotalFrames);

我在哪里下车?

编辑:我的代码确实有效,只是有其他错误。

最佳答案

WAV 格式通常以 44 字节 header 开头,后跟每秒采集 44,100 次的音频样本(采样率),其中每个样本都是 16 位有符号整数小尾数(位深度)...比特率是通过将这两者相乘来计算的基本因素:(采样率)*(位深度)...这是单声道,因此如果是立体声,则这些样本是交错的

查看您引用的API,首先探测属性:vbr(可变比特率)如果它是真的,您想要的计算将无法实现。对于 WAV,它应该始终是恒定的比特率(IE. false)。然后检索属性:比特率

比特率 = (采样率) * (位深度) * ( channel 数) === 每秒位数

For argument sake lets say your ...

sample_rate = 44100;  // 44.1 kHz which is typical
bit_depth = 16;       // also typical
number_of_channels = 2;  // mono --> 1   stereo --> 2

look_ahead_milli_sec = 1500; // you are given this in milliseconds

bit_rate = sample_rate * bit_depth * number_of_channels;
bit_rate = 44100 * 16 * 2;
bitrate = 1411200; // based on above calculation

bytes_per_second = bitrate / 8; // bits to bytes per sec
bytes_per_second = 1411200 / 8; // bits to bytes per sec
bytes_per_second = 176400; // bytes per sec

look_ahead_in_bytes = (bytes_per_second / 1000) * look_ahead_milli_sec;

look_ahead_in_bytes = (176400 / 1000) * 1500;    
look_ahead_in_bytes = 264600;

关于Java - 确定从波形文件读取的字节数以获取时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28951339/

相关文章:

android - 看不见的音频文件

Java,计算字符串中唯一字符之间的差异

java - 如何在 java 中使用 .pem 文件证书发布数据

audio - “WAV parameter set”是正确的名字吗?

wpf - WPF MediaKit音频问题

读取 Wav 头文件的代码会产生奇怪的结果? C

python - 通过fft查找wav文件的频率幅度和相位

android - 从磨损接收数据后写.wav为空

java 1.4 高质量图像调整大小

java - 使用 Java/ICEFaces 转义 url GET 中的 URL 参数