문제

Audioqueue를 통해 오디오 데이터를 읽으려고합니다. 그렇게하면 파일의 비트 깊이가 16 비트인지 확인할 수 있습니다. 그러나 실제 샘플 데이터를 얻을 때 -128에서 128까지의 값 만 볼 수 있습니다. 그러나 의심스러운 인터리브 데이터를보고 있는데, 이는 데이터를 올바르게 읽지 않는다고 확신합니다.

우선, 소스 파일이 44100, 16 비트, 모노 WAV 파일인지 확인할 수 있습니다.

내 버퍼는 다음과 같이 할당됩니다.

char *buffer= NULL;
buffer = malloc(BUFFER_SIZE);
assert(buffer);

모든 관련 값은 설정 및 사용됩니다.

AudioFileReadPackets(inAudioFile,false,&bytesRead,NULL,packetNum,&numPackets,buffer);       

테스트로 데이터가 검색된 것을 볼 수 있도록 실행합니다.

for(int i=0;i<BUFFER_SIZE;i++){
  NSLog(@"%i", buffer[i]);
}

이제 내 소스 파일이 사방에 정점에 도달하지만 -128과 128에서 최대 값 만 볼 수 있습니다. 16 비트 파일이기 때문에 값은 대신 -32768 ~ 32768 일 것으로 예상합니다.

또한 데이터에는 두 가지 패턴이있는 것 같습니다. 반환 된 데이터의 예는 다음과 같습니다.

70
-13
31
-11
-118
-9
-15
-7
116
-4
31
-1
28
1
84
2
-123
3
-97
4
110
5
54
6
126

이제 두 번째 줄로 시작하여 다른 모든 행을 살펴보십시오 : -13. 그것이 고르게가 아니라 최소한 부드럽게 어떻게 증가하는지보십시오. 홀수 행은 그 부드러운 근처에 있지 않습니다.

내 첫 생각은 이것이 인터리브 스테레오 데이터이지만, 하나는 하나의 채널 일뿐 아니라 인터리빙이 없어야한다는 것입니다.

가장 좋은 추측은 데이터를 잘못 읽었으므로 샘플 데이터가 두 번의 반환에 걸쳐 있습니다. 올바르게 읽는 방법을 알고 있습니까?

전체 질문을 읽어 주셔서 감사합니다. 그리고 당신이 제공 할 수있는 통찰력에 감사드립니다.

도움이 되었습니까?

해결책

char *buffer= NULL;

그게 이유야. 16 비트 샘플이 아닌 서명 된 바이트를 반복하고 있습니다.

변수를 대신 2 바이트 값에 대한 포인터를 보유하는 것으로 선언하십시오.

SInt16 *buffer = NULL;

그런 다음 바이트의 절반 이상의 샘플을 반복합니다.

for(int i=0;i < (BUFFER_SIZE / sizeof(*buffer));i++){
  NSLog(@"%i", buffer[i]);
}

이름을 바꿀 것입니다 BUFFER_SIZE 에게 BUFFER_SIZE_BYTES 그것을 명확히하기 위해.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top