2011-01-09 6 views
2

Hey fellows, J'essaie de créer une application pour le changement de la voix en temps réel. Dans un premier temps, j'ai réussi à enregistrer des données audio dans un fichier spécifique et à les lire après l'enregistrement. Maintenant, j'essaie de changer le code pour lire les audiobuffeurs juste après les avoir enregistrés en boucle. Ma question est, comment il est possible de lire les Audiodata directement à partir de l'enregistrement Audioqueue et non (comme indiqué dans la documentation) à partir d'un fichier. Je suis reconnaissant pour toute idée et pourrait montrer des parties de code si nécessaire. Merci d'avance, Lukas (d'Allemagne)Lecture en temps réel de l'enregistrement AudioQueue

+0

Quelle plate-forme/langue envisagez-vous d'utiliser? (Il est difficile de dire à partir de votre question.) –

+0

Le programme est conçu pour fonctionner sur IPhone. La langue utilisée est Objective-C. Jusqu'à présent, la plupart de mon code provient du Guide AudioQueueReference. – Lukas

+0

J'ai ré-étiqueté votre question avec des tags plus significatifs - vous obtiendrez plus de réponses maintenant. –

Répondre

1

Regardez l'exemple de SpeakHere. Cette ligne sources les données audio:

OSStatus result = AudioFileReadPackets(THIS->GetAudioFileID(), false, &numBytes,  inCompleteAQBuffer->mPacketDescriptions, THIS->GetCurrentPacket(), &nPackets, 
             inCompleteAQBuffer->mAudioData); 

Alors, plutôt que appeler AudioFileReadPackets, vous pouvez simplement utiliser un memcpy pour copier sur la mémoire tampon de données enregistrées. Ou, en variante, fournir à la lecture AudioQueue un pointeur vers le tampon de données audio. Pendant la lecture, avancez un pointeur mCurrentPacket dans le tampon.

Pour enregistrer, vous ferez quelque chose de très similaire. Plutôt que d'écrire dans un fichier, vous écrirez dans un tampon en mémoire. Vous devez d'abord allouer cela avec un malloc. Ensuite, vos entrées AudioQueue capturent des données enregistrées, vous copiez ces données dans le tampon. Lorsque d'autres données sont copiées, vous avancez la tête d'enregistrement ou mCurrentPacket vers une nouvelle position.