Compression des données PCM

J’utilise les fonctions WinAPI – Wave pour créer un programme d’enregistrement qui enregistre le microphone pendant X secondes. J’ai cherché un peu sur le net et découvert que les données PCM étaient trop volumineuses, et ce serait un problème de les envoyer via des sockets

Comment puis-je le compresser en quelque chose de plus petit? Un moyen simple / “pas cher”?

J’ai également remarqué que lorsque je déclare le format à l’aide des fonctions de l’API Wave, j’utilise le code suivant:

WAVEFORMATEX pFormat; pFormat.wFormatTag= WAVE_FORMAT_PCM; // simple, uncompressed format pFormat.nChannels=1; // 1=mono, 2=stereo pFormat.nSamplesPerSec=sampleRate; // 44100 pFormat.nAvgBytesPerSec=sampleRate*2; // = nSamplesPerSec * n.Channels * wBitsPerSample/8 pFormat.nBlockAlign=2; // = n.Channels * wBitsPerSample/8 pFormat.wBitsPerSample=16; // 16 for high quality, 8 for telephone-grade pFormat.cbSize=0; 

Comme vous pouvez le constater, pFormat.wFormatTag= WAVE_FORMAT_PCM; peut-être que je peux insérer quelque chose d’autre à la place de WAVE_FORMAT_PCM , pour que ce soit compressé immédiatement? J’ai vérifié d’autres valeurs dans MSDN, bien qu’aucune d’elles ne fonctionne pour moi dans Visual Studio …

Alors qu’est-ce que je peux faire?

Merci!

La méthode la plus simple consiste simplement à réduire votre taux d’échantillonnage de 44100 à quelque chose de plus gérable, tel que 22050, 16000, 11025 ou même 8000. La plupart des codecs vocaux ne dépassent toutefois pas 16 000 hz. Et les plus anciens sont optimisés pour 8khz.

La prochaine étape consiste à trouver un codec. Il existe une poignée de codecs à utiliser avec le Gestionnaire de compression audio de Windows , mais la plupart d’entre eux remontent à Windows 95 et ont un son affreux par rapport aux normes modernes après décompression.

Vous pouvez toujours convertir en WMA en temps réel à l’aide du SDK de format ou des API Media Foundation. Ou allez simplement chercher une bibliothèque MP3 open source comme LAME .

Pour une parole de qualité téléphonique, vous pouvez passer à 8 bits par échantillon et à une fréquence d’échantillonnage de 8 000. Cela réduira considérablement la quantité de données.

Le GSM a une bonne compression. Vous pouvez convertir un bloc de données PCM en GSM (ou tout autre codec que vous avez installé) à l’aide de acmStreamConvert() . Reportez-vous à MSDN pour plus de détails:

Conversion de données d’un format à un autre