Получите правильные FileLengthFrames с CoreAudio

Я работаю над преобразованием моего кода 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

Таким образом, общая длина от питона составляет 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 ++;
            }
        }
}

И теперь у меня есть 2 отдельных канала от цели c:

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

Таким образом, общая длина, которую я получил от цели c, равна 10 по сравнению с 20 в python. Где мои остальные данные? Я пропустил несколько шагов? Или неправильная конфигурация? Спасибо за помощь.

1 ответ

Решение

Когда у вас есть чередующиеся образцы и вы "разделяете их по коду", вы забываете умножить на channelsPerBuffer (что кажется чересчур подкованным?), так что для стерео вы пропускаете половину семплов. Попробуйте изменить цикл for на

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

Длина audioTotal также должен быть fileLengthInFrames*channelsPerBuffer,

ps зачем пересчитывать fileLengthInFrames если частота выборки клиента и файла одинакова?

Другие вопросы по тегам