오디오 큐어로 오디오 버퍼 데이터를 읽습니다
-
12-09-2019 - |
문제
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
그것을 명확히하기 위해.