2009-08-08 8 views
6

Estoy intentando leer datos de audio a través de AudioQueue. Cuando lo hago, puedo verificar que la profundidad de bits del archivo sea de 16 bits. Pero cuando obtengo los datos de muestra reales, solo estoy viendo valores de -128 a 128. Pero también veo datos intercalados que parecen sospechosos, lo que me hace estar bastante seguro de que simplemente no estoy leyendo los datos correctamente.Lectura de datos del búfer de audio con AudioQueue

Para empezar, puedo verificar que el archivo fuente es 44100, 16 bits, mono wav.

Mi búfer se asigna así:

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

Todos los valores pertinentes se establecen y se utiliza en:

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

Como prueba, sólo para que yo puedo ver los datos recuperados, corro :

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

Ahora, sé que mis picos de archivos fuente por todo el lugar, pero los valores no veo más que un máximo de -128 nd 128. Dado que se trata de un archivo de 16 bits, esperaría que los valores fueran de -32768 a 32768.

Además, parece haber dos patrones en los datos. He aquí un ejemplo de los datos devueltos:

 
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 

Ahora echar un vistazo a cada dos filas a partir de la segunda fila: -13. Vea cómo aumenta, no de manera uniforme, pero al menos sin problemas? Las filas impares no están ni cerca de eso sin problemas.

Lo primero que pensé es que se trata de datos estéreo intercalados, pero no, es solo un canal, por lo que no debería haber entrelazado, ¿verdad?

Mi mejor estimación es que solo estoy leyendo los datos incorrectamente, por lo que los datos de muestra se distribuyen entre dos declaraciones. Alguna idea de como leerlo correctamente?

Gracias por leer toda la pregunta y cualquier información que pueda ofrecer.

Respuesta

8
char *buffer= NULL; 

Esa es la razón. Está iterando sobre bytes firmados, no muestras de 16 bits.

Declarar la variable como la celebración de un puntero a los valores de dos bytes en su lugar:

SInt16 *buffer = NULL; 

A continuación, iterar más de la mitad de muestras como bytes:

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

que sería cambiar el nombre de BUFFER_SIZE a BUFFER_SIZE_BYTES a aclararlo

+0

Gracias de nuevo Peter! –

Cuestiones relacionadas