Question

Je tente de lire les données audio via AudioQueue. Quand je le fais, je peux vérifier que la profondeur de bits du fichier est de 16 bits. Mais quand je reçois les données réelles de l'échantillon, je ne vois que des valeurs de -128 à 128. Mais je vois aussi suspect à la recherche de données intercalées, ce qui me rend à peu près sûr que je ne suis pas à lire correctement les données.

Donc, pour commencer, je peux vérifier que le fichier source est 44100, 16 bits, le fichier wav mono.

Ma mémoire tampon est allouée ainsi:

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

Toutes les valeurs correspondantes sont définies et utilisées dans:

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

Comme un test, juste pour que je puisse voir les données récupérées, je lance:

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

Maintenant, je sais que mes pics de fichier source dans tous les sens, mais les valeurs que je vois que max à -128 et 128. Être comme cela est un fichier 16 bits, je me attends à ce que les valeurs seraient plutôt être -32768 32768.

En outre, il semble y avoir deux tendances dans les données. Voici un exemple des données renvoyées:

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

Maintenant, prenez un coup d'œil à tous les deux rangs en commençant par la deuxième ligne: -13. Voyez comment elle augmente, et non de façon uniforme, mais au moins en douceur? Les lignes impaires ne sont pas loin de cela lisse.

Ma première pensée serait que ce sont des données stéréo intercalés, mais non, il est un seul canal, donc il ne devrait pas y avoir de désentrelacement, droit?

Ma meilleure estimation est que je suis en train de lire les données de manière incorrecte, de sorte que les données de l'échantillon est répartie sur plusieurs deux retours. Toute idée comment lire correctement?

Merci pour la lecture à travers toute la question, et pour toute idée que vous pouvez offrir.

Était-ce utile?

La solution

char *buffer= NULL;

C'est la raison. Vous itérer octets signés, pas des échantillons de 16 bits.

déclarer la variable comme contenant un pointeur à des valeurs de deux octets à la place:

SInt16 *buffer = NULL;

Alors, itérer plus de la moitié autant d'échantillons sous forme d'octets:

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

Je renommer BUFFER_SIZE à BUFFER_SIZE_BYTES pour le clarifier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top