저는 Python 코드를 Objective C로 변환하여 ios 장치에서 실행하려고합니다. 오디오 파일을 읽는 코드입니다. 파이썬에서는 AudioSegment를 사용하여 파일을 읽습니다. 결과는 배열로 2 개의 채널로 나뉩니다. 예를 들어CoreAudio로 올바른 FileLengthFrames 가져 오기
는 :
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 ++;
}
}
}
을 그리고 지금은 목표 C에서이 분리 된 채널이 :
Left channel [-1,-2,-3,-4,-5] //length = 5
Right channel [ 1, 2, 3, 4, 5] //length = 5
그래서 내가 목표 C에서 가져온 총 길이가 10 파이썬에서 20과 비교 . 나머지 데이터는 어디에 있습니까? 나는 몇 걸음을 놓쳤는가? 또는 잘못된 구성입니까? 도움 주셔서 감사합니다.
'audioTotal'의 길이가 10이므로'fileLengthInFrames * clientFormat.mChannelsPerFrame'을 반복하면 범위를 벗어납니다. 'fileLengthInFrames'를 두 번 계산 했습니까? – hoangpx
oops,'audioTotal'도 잘못되었습니다. 그 길이는'fileLengthInFrames * clientFormat.mChannelsPerFrame'이어야한다. 파일에서'fileLengthInFrames'을 가져 와서 다시 계산하십시오. –
는'channelsPerBuffer'를 사용하는 업데이트 된 답변으로, 인터리브 된 것과 인터리브되지 않은 것의 차이를 이해하고있는 것으로 보입니다. –