如何在 OS X 上交换原始 PCM 音频数据中的立体声通道?
How do I swap stereo channels in raw PCM audio data on OS X?
我正在将 OS X 上的外部解码库中的音频写入 AIFF 文件,并且我能够使用 OSSwapInt32 交换数据的字节顺序().
生成的 AIFF 文件(16 位 PCM 立体声)确实可以播放,但左右声道互换了。
在我写入每个缓冲区时是否有任何方法可以交换通道?
这是相关循环:
do
{
xmp_get_frame_info(writer_context, &writer_info);
if (writer_info.loop_count > 0)
break;
writeModBuffer.mBuffers[0].mDataByteSize = writer_info.buffer_size;
writeModBuffer.mBuffers[0].mNumberChannels = inputFormat.mChannelsPerFrame;
// Set up our buffer to do the endianness swap
void *new_buffer;
new_buffer = malloc((writer_info.buffer_size) * inputFormat.mBytesPerFrame);
int *ourBuffer = writer_info.buffer;
int *ourNewBuffer = new_buffer;
memset(new_buffer, 0, writer_info.buffer_size);
int i;
for (i = 0; i <= writer_info.buffer_size; i++)
{
ourNewBuffer[i] = OSSwapInt32(ourBuffer[i]);
};
writeModBuffer.mBuffers[0].mData = ourNewBuffer;
frame_size = writer_info.buffer_size / inputFormat.mBytesPerFrame;
err = ExtAudioFileWrite(writeModRef, frame_size, &writeModBuffer);
} while (xmp_play_frame(writer_context) == 0);
此解决方案非常适用于 2 声道音频。我选择在您循环更改字节顺序的同时执行此操作以避免额外的循环。我正在经历 1/2 的循环,并在每次迭代中处理两个样本。样本是交错的,所以我从奇数样本索引复制到偶数样本索引,反之亦然。
for (i = 0; i <= writer_info.buffer_size/2; i++)
{
ourNewBuffer[i*2] = OSSwapInt32(ourBuffer[i*2 + 1]);
ourNewBuffer[i*2 + 1] = OSSwapInt32(ourBuffer[i*2]);
};
另一种方法是使用 table 查找通道映射。
我正在将 OS X 上的外部解码库中的音频写入 AIFF 文件,并且我能够使用 OSSwapInt32 交换数据的字节顺序().
生成的 AIFF 文件(16 位 PCM 立体声)确实可以播放,但左右声道互换了。
在我写入每个缓冲区时是否有任何方法可以交换通道?
这是相关循环:
do
{
xmp_get_frame_info(writer_context, &writer_info);
if (writer_info.loop_count > 0)
break;
writeModBuffer.mBuffers[0].mDataByteSize = writer_info.buffer_size;
writeModBuffer.mBuffers[0].mNumberChannels = inputFormat.mChannelsPerFrame;
// Set up our buffer to do the endianness swap
void *new_buffer;
new_buffer = malloc((writer_info.buffer_size) * inputFormat.mBytesPerFrame);
int *ourBuffer = writer_info.buffer;
int *ourNewBuffer = new_buffer;
memset(new_buffer, 0, writer_info.buffer_size);
int i;
for (i = 0; i <= writer_info.buffer_size; i++)
{
ourNewBuffer[i] = OSSwapInt32(ourBuffer[i]);
};
writeModBuffer.mBuffers[0].mData = ourNewBuffer;
frame_size = writer_info.buffer_size / inputFormat.mBytesPerFrame;
err = ExtAudioFileWrite(writeModRef, frame_size, &writeModBuffer);
} while (xmp_play_frame(writer_context) == 0);
此解决方案非常适用于 2 声道音频。我选择在您循环更改字节顺序的同时执行此操作以避免额外的循环。我正在经历 1/2 的循环,并在每次迭代中处理两个样本。样本是交错的,所以我从奇数样本索引复制到偶数样本索引,反之亦然。
for (i = 0; i <= writer_info.buffer_size/2; i++)
{
ourNewBuffer[i*2] = OSSwapInt32(ourBuffer[i*2 + 1]);
ourNewBuffer[i*2 + 1] = OSSwapInt32(ourBuffer[i*2]);
};
另一种方法是使用 table 查找通道映射。