C# 计算字节数组的定时流的帧速率和大小

C# 计算字节数组的定时流的帧速率和大小,c#,audio,timer,C#,Audio,Timer,这个问题可能有点棘手 我正在尝试使用System.Timer通过Windows套接字发送字节[] 数据为wav文件,常用编码为8Khz,每个样本16位 这篇文章详细解释了我要做的事情: 在MP3应用程序中,假设设备从以128 kbit/sec和48 kHz采样频率编码的文件发送MP3流。这意味着每隔24.0毫秒发送384字节长的MP3音频帧。因此,如果设备只是将周期计时器设置为24.0毫秒,并在计时器过期时发送数据包,则将保持恒定的比特率 我的问题是,这些数字是如何得出的?音频帧是如何384字节

这个问题可能有点棘手

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

数据为wav文件,常用编码为8Khz,每个样本16位

这篇文章详细解释了我要做的事情:

在MP3应用程序中,假设设备从以128 kbit/sec和48 kHz采样频率编码的文件发送MP3流。这意味着每隔24.0毫秒发送384字节长的MP3音频帧。因此,如果设备只是将周期计时器设置为24.0毫秒,并在计时器过期时发送数据包,则将保持恒定的比特率

我的问题是,这些数字是如何得出的?音频帧是如何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));

没有一个能给出上面的数字。

128kbit/sec不是比特采样,而是比特秒

换言之,它是16kB/s(一个字节中有8位)。因此,如果您决定“sample”的长度为384字节,则需要每秒发送
16000/384=41.6666个“samples”

如果您希望尽可能平稳地发送数据(“采样”之间的时间间隔是恒定的),这意味着您必须每秒发送384字节41.6666次,即每:
1s/41.66666=24ms

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


谢谢xryl669!
FrameLengthInBytes = 144 * BitRate / SampleRate + Padding

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