Cet article porte sur une brève introduction à la fenêtre Gestionnaire de compression audio API.

Ceci est une copie d'un article que j'ai écrit pour les développeurs Delphi Newsletter

Les éléments que j'ai écrite pour cet article font partie d'un projet open-source et sont disponibles sur ma page d'accueil.

Gestionnaire de compression audio

Il ya de nombreuses années, avant que je ne savait vraiment ce que l'internet a été, j'ai entendu une rumeur d'un "téléphone Internet". Ce logiciel aurait pu transmettre la parole entre deux personnes sur internet en temps réel, permettant à l'échelle mondiale des appels téléphoniques pour le prix d'un appel local. Lyn Avec le frère de la vie aux États-Unis et entre nous qui vivent au Royaume-Uni, les appels téléphoniques ont été rares, et toujours beaucoup trop cher. Ainsi, vous pouvez vous imaginer à quel point cette rumeur est la technologie pour nous. Donc, en fait, passionnant, que nous avons nous-mêmes connectés.

Pour couper une longue histoire courte, nous avons essayé ce téléphone logiciel, et il est horrible! Donc, mauvaise en fait que nous avons pris avec notre ligne téléphonique normale et ridicule des frais de téléphone.

GOOD NEWS! C'était il ya longtemps, et depuis, les choses ont parcouru un long chemin (et les appels téléphoniques sont aussi beaucoup moins cher). Avec la popularité croissante de l'internet, des médias est devenue plus grande qualité encore plus petits en taille.

Il existe maintenant de nombreux formats de streaming audio autour, et même le streaming vidéo, et tout cela a été rendu accessible aux personnes à très faibles bandes passantes. Ce n'est pas tout, non seulement ces formats (Quicktime, RealAudio, et même MP3) deviennent plus populaires, ils sont également devenus plus accessibles pour le développeur.

Codecs

Certaines de ces routines de compression ont été rendues accessibles par le biais de l'introduction de "codecs". Un certain nombre de codecs sont installés en standard sur l'installation de Windows (merci Microsoft!)

GSM - Je pense que ce format est utilisé par certains réseaux de téléphonie mobile

DSP TrueSpeech - J'ai entendu parler d'une manifestation de ce 1 bit audio format, très clair!

Fraunhofer IIS MP3- C'est certainement mon préféré de tous, il vous permet de créer vos propres MP3

PCM - Le standard utilisé par les fenêtres, la plupart des codecs peuvent convertir vers / à partir du PCM

Note:
Une liste complète est obtenue par de la section multimédia du panneau de configuration. Double-cliquez sur "Multimédia", puis cliquez sur le bouton "dispositifs" tab, puis la compression audio

Alors, quel est l'intérêt d'un codec? Eh bien, un codec est un peu comme un composant ActiveX. Composants ActiveX permis aux développeurs de mettre en œuvre la fonctionnalité au sein de leurs applications sans avoir à écrire tout le code (par exemple, l'incorporation d'un document Word). Codecs faire le même genre de chose, mais se concentrer sur la conversion de formats de médias dans d'autres formats de médias. Par exemple, si vous voulez écrire une application qui prend des données audio d'un CD audio, puis converti en MP3, le seul travail que vous devez faire vous-même serait

  1. Extrait les données audio de la piste
  2. Rédiger une tête valide MP3 sur votre disque dur
  3. Charger le codec pour encoder les données audio au format MP3

ACM et l'API

Tout d'abord, je ne mentionnerai que les ACM pour «Gestionnaire de compression audio". Il s'agit de la bibliothèque écrite par Microsoft dans le cadre de Windows, qui agit comme interface de programmation pour les codecs.

L'ACM appartient réellement à MMSystem.pas (Windows qui gère le multimédia), mais, pour une raison quelconque, il a été omis. La première tâche est donc de trouver une copie de MSACM.pas, qui est une API de conversion de cette API. Celui que j'ai trouvé le plus utile est la conversion de François Piette, qui a été affichée sur le projet Jedi (www.Delphi-Jedi.org).

ACM exige que le promoteur d'entreprendre les mesures suivantes afin de convertir entre les formats de médias

  1. Vous devez choisir votre format d'entrée et de sortie. Ceci est basé sur le TWaveFormatEX record, mais, attention, cette structure n'est pas assez grande pour stocker les informations requises de la plupart des codecs.

    C'est grâce à cela que j'ai utilisé mon propre record TACMFormat, qui n'est plus qu'un record TWaveFormatEX avec quelques octets supplémentaires marqués à la fin. Vous devez vraiment pas de sens (que je connais) pour savoir ce que les
    ces octets supplémentaires moyenne, ou comment elles devraient être fixées. Ma solution à ce problème était d'utiliser le acmFormatChoose pour permettre au développeur de choisir le format au moment de la conception, puis ces valeurs ont écoutés au sein de l'IDE en tant que propriété personnalisée (en savoir plus sur ce côté).

  2. Vous devez ensuite ouvrir un flux ACM. C'est fait en appelant cmStreamOpen, en passant par les formats d'entrée et de sortie afin que le MCA est conscient de ce qui est requis de lui. A ce point, le MCA, soit un retour valable pour traiter un flux, ou vous recevrez un code d'erreur, tels que ACMERR_NotPossible pour indiquer que la transformation demandée ne peut pas être effectuée (en savoir plus sur ce côté).
  3. L'ordre du jour à effectuer est de déterminer la taille du tampon de sortie. Appel acmStreamSize informe l'ACM de combien d'octets que vous avez l'intention de lui fournir à chaque fois, elle sera de retour le
    la taille de la mémoire tampon de sortie (ce sera presque toujours estimé à plus de veiller à ce que vous offre une assez grande mémoire tampon).
  4. La dernière étape de préparation est de préparer un en-tête. Tous nous avons besoin de faire ici est d'appeler acmStreamPrepareHeader gérer le flux de passage, nous avons reçu de acmStreamOpen. L'en-tête que nous nous préparons également l'ACM dire l'adresse de notre "source" buffer, et l'adresse de notre destination "buffer (The ACM ne pas allouer la mémoire pour nous, nous avons besoin de nous renvoyer).

À ce stade, tous de notre travail de préparation est effectué. Tout ce que nous devons faire maintenant est en fait la demande que nos données sont converties. Comme l'ensemble de nos préparation est terminée, cette tâche est effectivement une simple étape. Il est obtenu en appelant acmStreamConvert. Cette routine, nous devons fournir les Stream Handle (Donc, il sait que les formats, nous travaillons avec), et notre tête Poignée (si il sait que la taille, l'emplacement de la source et de destination, les tampons). Cette routine précise le nombre réel d'octets utilisés dans la conversion par
cbDstLengthUsed mise dans l'en-tête. ACM Votre session est maintenant prêt pour un autre segment de données!

Une fois que vous avez terminé votre session ACM, il est temps de libérer les ressources que nous avons utilisés. C'est la partie la plus simple de tous. L'en-tête est disponible en utilisant acmStreamUnprepareHeader, et le flux de sortie en utilisant acmStreamClose.

Choisir un format

Avant d'entreprendre les étapes ci-dessus, nous devons avoir notre entrée et de sortie des formats prêts. Comme je l'ai dit précédemment, ces formats sont basés sur TwaveFormatEX (déclarés en MMSystem.pas), qui est juste un dossier précisant les débits, la fréquence etc etc A moins que vous ne l'intention de convertir entre différents formats PCM (qui est vraiment très peu probable) , ce format est tout ne va pas être suffisant. Le format suivant est utilisé à la place tout au long de l'élément de code ci-joint.


TACMWaveFormat = emballé record
cas de l'entier
0: (Format: TWaveFormatEx);
1: (RawData: Array [0 .. 128] de l'octet);
fin;

L'idée ici est que nous pouvons encore accéder à la TWaveFormatEX de données en se référant à l'Format partie du dossier, encore RawData nous fournit suffisamment de place pour d'autres données requises pour aucun de ces codecs.

Bien que nous ne savons pas, soit la taille de ce complément de données, ou ce qu'il représente, il est toujours une tâche facile à acquérir. Ceci est fait en utilisant acmFormatChoose.

AcmFormatChoose exige seulement un paramètre de type TACMFormatChooseA. Ce paramètre est une simple suite de la tenue de la structure (des) information.

pwfx
Un pointeur vers une structure TWaveFormatEX de recevoir le résultat (en fait nous passer TACMFormat)

cbwfx
La taille en octets de la mémoire tampon qui est de recevoir le résultat.

cbStruct
La taille de cette structure

Note:
Un autre point mérite d'être mentionnée est fdwStyle, qui détient des drapeaux spécifiant des options supplémentaires pour le format de boîte de dialogue de sélection. En particulier, le (très long) ACMFORMATCHOOSE_STYLEF_INITTOWFXSTRUCT pavillon, qui informe la boîte de dialogue que le tampon pointé par pwfx contient déjà un format valide, qui doit être affiché comme la valeur par défaut lorsque le dailog semble).

Un peu de chinois murmure

Précédemment, j'ai mentionné le ACMERR_NotPossible erreur. Cette mai se produire pour deux raisons.

Les deux premiers de la note (tout simplement parce qu'ils sont les plus faciles à expliquer) sont

  1. Le codec que vous avez spécifié sur votre machine, mai ne pas être disponibles sur une machine cliente
  2. Même si vous pouvez les convertir à partir d'un format audio, vous ne pouvez pas convertir à lui. C'est le cas avec le Fraunhofer IIS MP3. Bien que Windows 9x, Windows NT et les utilisateurs peuvent créer des fichiers MP3 sur le contenu de leur coeur, pour une raison quelconque, la possibilité a été supprimée dans Windows 2000 (oui, encore merci Microsoft). Bien que les utilisateurs mai Win2K écouter le résultat, ils ne sont pas autorisés à les produire à moins qu'ils ne payer d'abord!

Le final est un peu plus compliquée, et garantit l'expression
«Chinese Whisper».

ACM ne sont pas tous les formats sont interchangeables, par exemple (je suis juste de ces up, si elles travaillent effectivement ne pas écrire en disant que j'avais tort), vous mai ne pas être en mesure de convertir

GSM 8Bit MONO> MP3 8Bit MONO

Vous avez besoin de trouver un «intermédiaire». C'est très souvent un format PCM, la plupart (sinon toutes) les codecs ont été conçus pour convertir en PCM un format plus adapté.

L'exemple ci-dessus serait donc réalisé comme ceci.

GSM 8Bit MONO> PCM 8Bit MONO> MP3 8Bit MONO

Conversion en "MP3 16BIT STEREO" aurait probablement besoin d'encore une autre étape (entre le PCM et MP3, afin de convertir 8 bits à 16 bits PCM PCM).

Je pense que vous allez maintenant comprendre pourquoi cette section est appelée «Chinese Whisper». (Si quelqu'un peut me dire le sens de cette expression, je vous serais reconnaissant de bien!)

Les talents cachés de l'ACM

Vous mai mai ou ne pas être convaincu que le MCA est une bonne chose. Cela semble tout à fait beaucoup de travail juste pour convertir un format dans un autre média. Compte tenu de l'alternative de la rédaction de votre propre format audio de petite taille pour Internet streaming, ou d'écrire votre propre routine de compression MP3, ACM britannique, c'est ce que nous appelons «un doddle".

Imaginez une simple application qui prend en entrée de votre microphone, des compresses à un format approprié pour le streaming sur une très faible bande passante, puis le transmet à un PC de destination sur TCP / IP. Alors que dans le même temps, reçoit des données compressées, décompresser, puis il joue de votre haut-parleur (aka, un simple téléphone internet).

Ai-je dit simple? Eh bien, en fait, oui!

Cela sonne comme un lot de travail, et est probablement (sauf avec les éléments fournis, il est en fait très simple).

C'est là que les talents cachés de l'ACM en ligne de compte. Bien que quelques-unes des codecs ACM sont mappable-Wave. Ce qui signifie qu'ils mai être considéré comme un standard WAVE dispositif lors de la lecture ou l'enregistrement audio.

Par exemple. Il est assez facile d'ouvrir une entrée pour une source de son GSM. Une fois que vous recevez un tampon de données de la vague de périphérique d'entrée, il est comprimé et déjà prêt pour la transmission. En revanche, dès que les données sont reçues par l'intermédiaire de votre TCP / IP, il est possible de lire ces données directement par l'intermédiaire d'un dispositif de vague.

  1. Les données à partir de MIC
  2. Envoyer des données par socket
  3. Les données de prise de
  4. Envoyer des données à des vagues dispositif

La norme PCM données serait beaucoup trop grande pour le streaming en temps réel sur un modem. Considérant que le GSM peut être transmise 6.1 aussi faible que 1.5k/second et MP3 16BIT MONO peuvent être écoutés à un simple 2k/second.

En dehors de Win2K ne pas pouvoir (ou même autorisé) à créer des fichiers MP3, il ya autre chose convient de mentionner à propos de ce format. Même si elle peut très facilement être considérée comme une onde de périphérique, il ne semble pas fonctionner comme une vague en appareil. C'est la raison pour laquelle je trouve qu'il est nécessaire de convertir les données PCM à MP3 manuellement (qui s'est avérée tout à fait faire un beau projet de démonstration)

Composants, démos et le code source

Eh bien, c'est tout beau et dandy parle ce genre de choses, mais ce n'est pas vraiment une grande utilité sans preuves tangibles à l'appui.

C'est la raison pour laquelle j'ai inclus trois composantes, et de deux démonstrations (démos ont été compilées en Delphi 5). Ces composants sont disponibles en téléchargement sur mon site Delphi.

Composants

  1. TACMConvertor:C'est vraiment un double objectif. Tout d'abord, il convertit les données entre 2 formats différents médias. Deuxièmement, même si vous n'avez pas l'intention de convertir manuellement les données brutes, ce volet est utile pour la spécification d'entrée / sortie des formats de flux de l'ACM. (Le clic-droit composante éditeur vous permet de sélectionner le format de la boîte de dialogue acmFormatChoose à designtime)

  2. TACMIn:Ce composant est utilisé pour la réception des données de votre microphone. Vous pouvez spécifier un format PCM, ou vous pouvez spécifier n'importe quel format susceptible d'être cartographié par le biais du dispositif WaveIn.
  3. TACMOut:Ce composant est utilisé replaying audio par l'intermédiaire de votre sortie audio. Encore une fois, vous sélectionnez mai à la sortie en format PCM, ou tout autre format susceptible d'être cartographié par waveout votre appareil. Le NumBuffers propriété spécifie le nombre de tampons que vous voulez remplir avant de commencer à jouer. Il ne s'agit pas d'une grande utilité lorsque vous souhaitez instant audio (de téléphonie sur Internet), mais peuvent venir très utile lorsque vous voulez faire la diffusion audio sur Internet, et vous voulez un peu plus de mémoire tampon audio dans le cas où votre vitesse de connexion varie.

Démos

La première démo est en fait assez simple. Le TACMConvertor est utilisé seulement pour spécifier les formats d'entrée et de sortie. Cette démonstration ouvre une ACMIn et un ACMOut en même temps. Audio en est presque immédiatement fil de retour, mais avec un léger retard, ce qui fait de vous paraître un peu comme Elvis Prestley (Bien que je ne suis pas un fan d'Elvis, "All Shook Up" a été la première chanson à l'esprit lorsque je l'ai testé)

La seconde démo est un peu plus compliqué et se décompose en deux parties.

La première partie (Demo2.dpr) agit comme un serveur. Il dispose d'un socket serveur écoutant sur le port 6565 pour de nouvelles connexions. En même temps, il prend l'audio à partir de la MIC, le convertit en MP3 16BIT 8KHz MONO (2k/second) et les tuyaux il à chaque client connecté.

La deuxième partie (Demo2Client.dpr)agit comme un client. La première zone de texte exige de l'adresse IP du serveur, tandis que la seconde (SpinEdit) d'entrée est le nombre de tampons que vous avez besoin. Une fois que vous cliquez sur connecter (et le nombre de tampons a été remplie), vous commencez à entendre les données audio à partir du serveur. MP3 16BIT 8KHz MONO est étonnamment bonne qualité, mais aussi étonnamment faible bande passante.

Eh bien, c'est à peu près complète de cet article. J'espère que vous avez apprécié la lecture de parler beaucoup plus que j'ai beaucoup apprécié d'avoir à travailler tous out!



À partir de la version 2.0 de ces composants sont maintenant disponibles et commercial à http://www.droopyeyes.com

Average rating: