2017-04-26 5 views
1

저는 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과 비교 . 나머지 데이터는 어디에 있습니까? 나는 몇 걸음을 놓쳤는가? 또는 잘못된 구성입니까? 도움 주셔서 감사합니다.

답변

1

샘플을 인터리브하고 "코드로 구분"하면 channelsPerBuffer (인터리브가 잘된 것 같습니다)을 곱하면됩니다. 따라서 스테레오의 경우 샘플의 절반을 놓치고 있습니다. . audioTotal의 길이는 fileLengthInFrames*channelsPerBuffer을해야

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

에 for 루프를 변경해보십시오.

p.s. 클라이언트와 파일 샘플 속도가 동일하면 왜 을 다시 계산합니까?

+0

'audioTotal'의 길이가 10이므로'fileLengthInFrames * clientFormat.mChannelsPerFrame'을 반복하면 범위를 벗어납니다. 'fileLengthInFrames'를 두 번 계산 했습니까? – hoangpx

+0

oops,'audioTotal'도 잘못되었습니다. 그 길이는'fileLengthInFrames * clientFormat.mChannelsPerFrame'이어야한다. 파일에서'fileLengthInFrames'을 가져 와서 다시 계산하십시오. –

+0

는'channelsPerBuffer'를 사용하는 업데이트 된 답변으로, 인터리브 된 것과 인터리브되지 않은 것의 차이를 이해하고있는 것으로 보입니다. –