使用 CoreAudio 获取正确的 FileLengthFrames
Get correct FileLengthFrames with CoreAudio
我正在努力在 ios 设备上将我的 Python 代码转换为 Objective C 到 运行。读取音频文件的代码。在 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
下面是我如何在 objective 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
所以objective 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 个来自 objective c 的独立频道:
Left channel [-1,-2,-3,-4,-5] //length = 5
Right channel [ 1, 2, 3, 4, 5] //length = 5
所以我从 objective c 得到的总长度是 10,而 python 是 20。
我的其余数据在哪里?我错过了一些步骤吗?还是配置错误?
感谢您的帮助。
当你有交错样本并且你 "separate them by code" 时,你忘记乘以 channelsPerBuffer
(这似乎是交错精明的?),所以对于立体声你错过了一半的样本。尝试将 for 循环更改为
for(int i = 0; i < fileLengthInFrames*channelsPerBuffer; i++) {
// display left and right samples here ...
}
audioTotal
的长度也应该是fileLengthInFrames*channelsPerBuffer
。
p.s。如果客户端和文件采样率相同,为什么要重新计算 fileLengthInFrames
?
我正在努力在 ios 设备上将我的 Python 代码转换为 Objective C 到 运行。读取音频文件的代码。在 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
下面是我如何在 objective 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
所以objective 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 个来自 objective c 的独立频道:
Left channel [-1,-2,-3,-4,-5] //length = 5
Right channel [ 1, 2, 3, 4, 5] //length = 5
所以我从 objective c 得到的总长度是 10,而 python 是 20。 我的其余数据在哪里?我错过了一些步骤吗?还是配置错误? 感谢您的帮助。
当你有交错样本并且你 "separate them by code" 时,你忘记乘以 channelsPerBuffer
(这似乎是交错精明的?),所以对于立体声你错过了一半的样本。尝试将 for 循环更改为
for(int i = 0; i < fileLengthInFrames*channelsPerBuffer; i++) {
// display left and right samples here ...
}
audioTotal
的长度也应该是fileLengthInFrames*channelsPerBuffer
。
p.s。如果客户端和文件采样率相同,为什么要重新计算 fileLengthInFrames
?