我有一个AudioFormat对象(从audioInputStream.getFormat()
返回)。 我有一个时间戳(以毫秒为单位),我想从中开始从相应的 wav 文件中读取。 如何确定从音频输入流读取/跳过多少字节才能到达适当的时间戳?
我对帧速率(以及它与采样率的关系)感到困惑。
这就是我到目前为止所拥有的... startPos 是以毫秒为单位的时间戳。
float skipTotalFrames = audioInputStream.getFormat().getFrameRate() * (startPos / 1000);
long byteStartPos = (long) (audioInputStream.getFormat().getFrameSize() * skipTotalFrames);
我在哪里?
编辑:我的代码确实有效,我只是有其他错误。
WAV 格式通常以 44 字节标头开头,后跟每秒采集 44,100 次的音频样本(采样率),其中每个样本是 16 位有符号整数小端序(位深度)...比特率是通过乘以这两个基本因素来计算的:(采样率)*(位深度)...这是单声道,所以如果立体声,这些样本是交错的
查看您引用的 API,第一个探测属性:vbr(可变比特率) 如果它是真的,你想要的计算将无法实现。 对于 WAV,它应该始终保持恒定的比特率(即 false)。 然后检索属性:比特率
比特率 = (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;