这个问题可能有点棘手。

我正在尝试通过Windows套接字使用System.Timer发送Byte []。

数据是一个wav文件,每个样本的通用编码为8Khz 16bits。

本文详细解释了我要做什么:Creating audio applications with Bluetooth



我的问题是,这些数字如何得出?音频帧的长度为 384 字节如何,我们如何知道周期计时器为 24.0毫秒

如何从编码格式(128 kbit / sec和48 kHz采样频率)计算出这些数字?

我尝试过的数学:

double BitsPerSample = 128000;
double SamplesPerSecond = 48000;

// 1 for Mono, 2 for Stereo:
double Channels = 2;

double SingleFramePeriod = 1 / SamplesPerSecond;
double BitsPerSecond = SamplesPerSecond * BitsPerSample * Channels;
double BytesPerSecond = ( BitsPerSecond / 8 );
double BytesPerFrame = (1 / (BitsPerSecond / 8));

这些都没有给我上述数字。

最佳答案

128 kbit / sec不是BitsPerSample,而是BitsPerSeconds。

换句话说,它是16kB / s(一个字节8位)。因此,如果您确定“样本”的长度为384个字节,则需要发送16000 / 384 = 41.6666 "samples" per second
如果您希望发送的消息尽可能平滑(“样本”之间的时间间隔是恒定的),这意味着您必须每秒发送4384666次这些384字节,即,每次:1s / 41.66666 = 24ms

显然,384字节不是MP3的任意选择,frame length的计算如下:

FrameLengthInBytes = 144 * BitRate / SampleRate + Padding

=> For 128 kbit/s, 48Khz, 0 padding, it gives 384 bytes

10-08 18:06