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

Java - Determine number of bytes to read from wave file to get to timestamp

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

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

这是我目前所拥有的...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)。然后检索 属性 : bitrate

比特率 = (sample_rate) * (bit_depth) * (number_of_channels) === 每秒比特数

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;