【问题标题】:How do I swap stereo channels in raw PCM audio data on OS X?如何在 OS X 上交换原始 PCM 音频数据中的立体声通道?
【发布时间】:2015-08-31 20:00:29
【问题描述】:

我正在将来自 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);

【问题讨论】:

    标签: audio aiff


    【解决方案1】:

    此解决方案非常适用于 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]);
    };
    

    另一种方法是使用表查找进行频道映射。

    【讨论】:

      猜你喜欢
      • 2014-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 2020-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多