单声道到立体声转换

我在这里有以下问题:我得到一个表示音频数据的字节块(uint16_t *),生成它们的设备正在捕获单声道声音,所以很明显我在1声道上有单声道音频数据。 我需要将这些数据传递给另一个设备,这需要交错的立体声数据(因此,2个通道)。 我想要做的基本上是复制数据中的1个通道,以便立体声数据的两个通道都包含相同的字节。 你能指点我这样做的有效算法吗?

谢谢,f。

如果你只想要交错的立体声样本,那么你可以使用这样的函数:

void interleave(const uint16_t * in_L, // mono input buffer (left channel) const uint16_t * in_R, // mono input buffer (right channel) uint16_t * out, // stereo output buffer const size_t num_samples) // number of samples { for (size_t i = 0; i < num_samples; ++i) { out[i * 2] = in_L[i]; out[i * 2 + 1] = in_R[i]; } } 

要从单个单声道缓冲区生成立体声,那么您只需为in_L和in_R传递相同的指针,例如

 interleave(mono_buffer, mono_buffer, stereo_buffer, num_samples); 

两个通道都传递相同的指针? 如果违反restrict规则,请使用memcpy()

对不起,但你的问题不是很广泛。 API? OS? CPUArchitectures?

您可能希望就地进行转换以节省一些内存。 取决于有问题的设备有多少内存。 所以你可能想要使用这样的东西而不是Paul R的方法:

 void interleave(uint16_t buf[], const int len) { for (int i = len / 2 - 1, j = len - 1; i > 0; --i) { buf[j--] = buf[i]; buf[j--] = buf[i]; } } 

从单声道设备获取声音数据时,您可以分配一个两倍于所需大小的缓冲区并将其传递给单声道设备。 这将用单声道音频填充缓冲区的一半。 然后将该缓冲区传递给上面的函数,该函数将其转换为立体声。 最后,您将缓冲区传递给立体声设备。 您可以节省额外的分配,从而减少33%的内存用于转换。

您将不得不复制缓冲区并复制它。 由于你没有告诉我们格式,它是如何终止的,我不能给代码,但它看起来像一个简单的for循环。

 int_16* allocateInterleaved(int_16* data, int length) int i; int *copy = malloc(sizeof(int_16)*length*2); if(copy == NULL) { /* handle error */ } for(i =0; i 

原谅任何明显的拼写错误,我的C有点生疏。 typdef,无论你需要什么类型签名16bit到int_16。 不要忘记释放复制缓冲区,或者更好地重用它。