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

时间:2016-05-26 00:02:58

标签: c# audio timer

这个问题可能有点棘手。

我正在尝试使用System.Timer在Windows Socket上发送Byte []。

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

本文详细解释了我要做的事情:Creating audio applications with Bluetooth

  

在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));

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

1 个答案:

答案 0 :(得分:1)

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

不同地说,它是16kB / s(一个字节中的8位)。因此,如果你决定"样本"是384字节长,然后你需要发送16000 / 384 = 41.6666 "samples" per second

如果你想尽可能平滑地发送它(" sample"之间的时间段是恒定的),这意味着你必须每秒发送这384个字节41.6666次,即每个:{{ 1}}。

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

1s / 41.66666 = 24ms