我正在将Python代码转换为Objective C,以便在ios设备上运行。有关读取音频文件的代码。在Python中,我使用AudioSegment读取文件,结果是数组中有2个分离的通道。

例如:

Left channel  [-1,-2,-3,-4,-5,-6,-7,-8,-9,-10]  //length = 10
Right channel [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]   //length = 10


因此,python的总长度为20

这是我在目标C中获得音频输出的方式

float *audioTotal = malloc(fileLengthInFrames * sizeof(float));
SInt16 *inputFrames = (SInt16*)bufferList->mBuffers[0].mData;
for(int i = 0; i < fileLengthInFrames; ++i) {
    audioTotal[i] = (float)inputFrames[i];
    printf("%f ", audioTotal[i]);
}


输出为:

[-1, 1, -2, 2, -3, 3, -4, 4, -5, 5] // length = 10


因此,目标c的输出是混合的左右声道。所以我必须用代码将它们分开:

if (clientFormat.mChannelsPerFrame > 1) {
        int indexLeft = 0;
        int indexRight = 0;
        float *leftAudio = malloc(fileLengthInFrames* sizeof(float));
        float *rightAudio = malloc(fileLengthInFrames * sizeof(float));
        for(int i = 0; i < fileLengthInFrames; i++) {
            if (i%2 == 0) {
                leftAudio[indexLeft] = audioTotal[i];
                printf("%f ", leftAudio[indexLeft]);
                indexLeft ++;
            } else {
                rightAudio[indexRight] = audioTotal[i];
                printf("%f ", rightAudio[indexRight]);
                indexRight ++;
            }
        }
}


现在我有两个与目标c分离的通道:

Left channel  [-1,-2,-3,-4,-5]  //length = 5
Right channel [ 1, 2, 3, 4, 5]   //length = 5


所以我从目标c得到的总长度是10,而在python中是20。
我其余的数据在哪里?我错过了一些步骤吗?还是配置错误?
感谢帮助。

最佳答案

当您有交织的样本并“按代码分隔它们”时,您会忘记乘以channelsPerBuffer(这似乎是交织的?),因此对于立体声,您会丢失一半的样本。尝试将for循环更改为

for(int i = 0; i < fileLengthInFrames*channelsPerBuffer; i++) {
    // display left and right samples here ...
}


audioTotal的长度也应为fileLengthInFrames*channelsPerBuffer

ps。如果客户端和文件的采样率相同,为什么要重新计算fileLengthInFrames

10-08 08:12
查看更多