Este artículo incluye una breve introducción a las ventanas de compresión de audio Manager API.

Esta es una copia de un artículo que escribí para el desarrollador Delphi Newsletter

Los componentes que he escrito para este artículo forman parte del proyecto de código abierto y están disponibles en mi página de inicio.

Administrador de compresión de audio

Hace muchos años, antes de que yo realmente sabía lo que era el internet, he oído un rumor de una "Internet Telephone". Esta pieza de software que supuestamente podría transmitir la voz entre dos personas en el Internet en tiempo real, permitiendo que todo el mundo las llamadas telefónicas por el precio de una llamada local. Con el hermano de Lyn que viven en los EE.UU. y nosotros que viven en el Reino Unido llamadas telefónicas fueron pocos y espaciados, y siempre demasiado caro. Así, usted puede imaginar lo emocionante esta tecnología se rumorea para nosotros. Por lo tanto, emocionante, de hecho, que nos conecta a nosotros mismos.

Para cortar una larga historia corta, hemos intentado este software de teléfono y era horrible! Tan mal, de hecho, que estamos atascados con nuestros normal de teléfono y cargos ridículo teléfono.

BUENAS NOTICIAS! Eso fue hace mucho tiempo, y desde entonces las cosas han recorrido un largo camino (y llamadas telefónicas son también mucho más barato). Con la creciente popularidad de la Internet, los medios de comunicación se ha convertido en aún mayor calidad en menor tamaño.

En la actualidad existen numerosos formatos de streaming de audio alrededor, e incluso streaming de vídeo, y todo esto se ha hecho accesibles a la población sobre anchos de banda muy bajo. Eso no es todo, no sólo tienen estos formatos (Quicktime, RealAudio, e incluso MP3) pasan a ser más populares, que también se han convertido en más accesible para el desarrollador.

Codecs

Algunas de estas rutinas de compresión se han hecho accesibles a través de la introducción de "codecs". Una serie de códecs se instalan como estándar en la instalación de Windows (gracias Microsoft!)

GSM - Creo que este formato es utilizado por algunas redes de telefonía móvil

DSP TrueSpeech - He oído una manifestación de este 1 bit formato de audio, muy claro!

Fraunhofer IIS MP3- Este es sin duda mi favorito de todos ellos, que te permite hacer tu propio MP3

PCM - El estándar utilizado por las ventanas, la mayoría de codecs puede convertir a / desde PCM

Nota:
Una lista completa puede obtenerse por en la sección multimedia de su panel de control. Haga doble clic en "Multimedia" y, a continuación, haga clic en el "artefactos", ficha y, a continuación, ampliar la compresión de audio

Entonces, ¿cuál es el punto de un codec? Bueno, un códec es un poco como un componente ActiveX. Componentes ActiveX permite a los desarrolladores implementar funcionalidad dentro de sus aplicaciones sin tener que escribir todo el código en cuestión (por ejemplo, la incrustación de un documento de Word). Codecs hacer el mismo tipo de cosa, sino concentrarse en la conversión de formatos de los medios de comunicación en otros formatos de los medios de comunicación. Por ejemplo, si quería escribir una aplicación que tuvo datos de audio de un CD de audio y, a continuación, convertirse en un MP3, el único trabajo que tendría que hacer usted mismo se

  1. Extraer los datos de audio de la pista
  2. Escribir una cabecera válida MP3 en el disco duro
  3. Instruya a los códec para codificar los datos de audio como MP3

ACM y API

En primer lugar, quiero mencionar que ACM de "Administrador de compresión de audio". Esta es la librería escrita por Microsoft como parte de Windows que actúa como programador de la interfaz de los códecs.

La ACM realmente pertenece en MMSystem.pas (que se ocupa de Windows multimedia), pero, por alguna razón, se ha omitido. La primera tarea, por lo tanto, es encontrar una copia de MSACM.pas, que es una API de la conversión de esta API. La he encontrado una muy útil es la conversión por Francois Piette, que se publicó en el Proyecto Jedi (www.Delphi-Jedi.org).

ACM exige el promotor para llevar a cabo los siguientes pasos a fin de convertir entre los formatos de los medios de comunicación

  1. Usted debe decidir sobre sus formatos de entrada y salida. Esto se basa en la TWaveFormatEX registro, pero se advirtió, esta estructura del registro no es en realidad lo suficientemente grandes como para almacenar la información necesaria de la mayoría de los codecs.

    Es debido a esto que he utilizado mi propio TACMFormat registro, que no es más que un TWaveFormatEX registro con un par de octetos en la etiqueta al final. ¿Realmente no tienen forma (que yo sepa) de encontrar lo que
    estos octetos extra decir, o cómo deben ser establecidos. Mi solución a este problema es utilizar el acmFormatChoose para permitir que el desarrollador de elegir los formatos en tiempo de diseño y, a continuación, estos valores han streaming dentro de la IDE como una costumbre de propiedad (más sobre esto más adelante).

  2. A continuación, debe abrir un flujo de ACM. Esto se hace llamando a cmStreamOpen, pasando la entrada y salida de los formatos a fin de que la ACM es consciente de lo que se requiere de ella. En este punto, la ACM o bien un retorno a manejar válida de un arroyo, o va a volver un código de error, tales como ACMERR_NotPossible para indicar que la transformación solicitada no puede realizarse (más sobre esto más adelante).
  3. El siguiente punto a realizar es determinar el tamaño del búfer de salida. Llamadas acmStreamSize informará a la ACM de cuántos bytes tiene la intención de abastecimiento con cada vez, entonces se devolverá el
    tamaño requerido del búfer de salida (esto casi siempre se calcula que más asegurar que el suministro lo suficientemente grande como un buffer).
  4. El último paso es la preparación para preparar una cabecera. Todos los que tenemos que hacer aquí es llamar a acmStreamPrepareHeader arroyo que pasa por el asa que hemos recibido de acmStreamOpen. La cabecera que nos preparamos también decirle a la ACM la dirección de nuestra "fuente" de amortiguación, y la dirección de nuestro "destino" de amortiguación (La ACM no asignar esta memoria para nosotros, tenemos que asignarlo a nosotros mismos).

En este punto, todos nuestros trabajos de preparación se realiza. Todo lo que necesitamos hacer ahora es solicitar que nuestros datos se convierte. Dado que todos los de nuestra preparación es completa, esto es realmente un paso muy simple. No se logra llamando a acmStreamConvert. Esta rutina nos obliga a proporcionar a la Stream Mango (para que sepa que los formatos que estamos trabajando con el), y la cabecera de nuestra gestión (para que sepa el tamaño, la ubicación de la fuente y el destino buffers). Esta rutina se especifique el número real de bytes utilizados en la conversión en
cbDstLengthUsed establecimiento dentro de la cabecera. Su ACM período de sesiones ya está listo para otra parte de los datos!

Una vez que haya terminado con su período de sesiones ACM es el momento de liberar los recursos que hemos utilizado. Esta es la parte más sencilla de todas. La cabecera es liberado mediante acmStreamUnprepareHeader, y el arroyo se libera mediante acmStreamClose.

La elección de un formato

Antes de emprender cualquiera de los pasos anteriores, debemos tener nuestra entrada y salida de formatos listos. Como he dicho antes, estos formatos se basan en TwaveFormatEX (declarada en MMSystem.pas), que es sólo un acta especificando las tasas de bits, la frecuencia etc etc A menos que sólo la intención de convertir entre diferentes formatos PCM (que es realmente muy poco probable) , Este formato es sólo no va a ser suficiente. El siguiente formato fue utilizado en lugar de todo el componente de código adjunta.


TACMWaveFormat = envasados registro
caso de entero
0: (Formato: TWaveFormatEx);
1: (RawData: Array [0 .. 128] de byte);
final;

La idea aquí es que todavía podemos acceder a la TWaveFormatEX datos haciendo referencia a la parte de formato del registro, y sin embargo nos RawData suministros con suficiente espacio para cualquier información adicional necesaria para cualquiera de los códecs individuales.

Aunque no sabemos bien el tamaño de esta información adicional, o lo que representa, es todavía una tarea sencilla para adquirirla. Esto se hace utilizando acmFormatChoose.

AcmFormatChoose sólo requiere un parámetro de tipo TACMFormatChooseA. Este parámetro es una simple estructura de la celebración de los siguientes (los) información.

pwfx
Un puntero a una estructura TWaveFormatEX para recibir el resultado (que en realidad pasa TACMFormat)

cbwfx
El tamaño en bytes del buffer que va a recibir el resultado.

cbStruct
El tamaño de esta estructura

Nota:
Otro tema digno de mención es fdwStyle, que tiene banderas especificar opciones adicionales para el formato de cuadro de diálogo de selección. En particular, es la (muy largo) ACMFORMATCHOOSE_STYLEF_INITTOWFXSTRUCT pabellón, que informa el cuadro de diálogo que el buffer apuntado por pwfx ya contiene un formato válido, que debe mostrarse como el predeterminado cuando el dailog parece).

Un poco de chino susurro

Anteriormente he mencionado la ACMERR_NotPossible error. Esto puede ocurrir por un par de razones.

Los dos primeros de la nota (simplemente porque son los más fáciles de explicar) son

  1. El códec que se especifica en su máquina, puede no estar disponible en una máquina cliente
  2. A pesar de que usted puede convertir de un formato de audio, no se puede convertir a la misma. Este es el caso con el Fraunhofer IIS MP3. Si bien Windows 9x y Windows NT los usuarios pueden crear archivos MP3 a su corazón el contenido, por alguna razón la capacidad fue eliminado en Windows 2000 (Sí, gracias una vez más Microsoft). Aunque Win2K los usuarios pueden escuchar los resultados, no se les permite generar, a menos que paguen a alguien primero!

El final es un poco más complicado, y garantiza la expresión
"Whisper chino".

No todos los formatos de ACM son intercambiables, por ejemplo (me acaba de hacer estas, de manera que si en realidad el trabajo no escribir diciendo que yo estaba equivocado) que pueden no ser capaces de convertir

GSM 8bit MONO> MP3 8bit MONO

Usted necesita encontrar un "hombre medio". Esto es muy a menudo un formato PCM, ya que la mayoría (si no todos) los codecs fueron diseñados para la conversión de PCM en un formato más adecuado.

El ejemplo de arriba, por lo tanto, se lograría de este modo.

GSM 8bit MONO> 8bit PCM MONO> MP3 8bit MONO

Conversión a "STEREO MP3 16BIT" requeriría probablemente un paso (entre la PCM y MP3, con el fin de convertir de 8 bits PCM a 16 bits PCM).

Creo que ahora entiendo por qué esta sección se llama "chino Whisper". (Si alguien me puede decir el significado de esa frase Le agradecería que!)

El talento oculto de ACM

Usted puede o no estar convencidos de que el ACM es una buena cosa. Esto parece bastante justo de los trabajos para convertir los medios de comunicación un formato a otro. Teniendo en cuenta la alternativa de escribir su propio formato de audio lo suficientemente pequeño como para internet streaming, o escribir su propia rutina de compresión MP3, ACM es lo que británicos llaman "un doddle".

Imagine una simple aplicación que tenga entrada de su micrófono, lo comprime a un formato adecuado para streaming a través de una muy poco ancho de banda, y luego lo transmite a un PC de destino a través de TCP / IP. Al mismo tiempo que recibe los datos comprimidos, descomprime y, a continuación, que juega fuera de su altavoz (alias, un simple teléfono de Internet).

¿He dicho simple? Bueno, en realidad, sí!

Esto suena como un montón de trabajo, y probablemente es (salvo con los componentes suministrados en realidad es muy simple).

Aquí es donde los talentos ocultos de la ACM entrar en juego. Muy pocos de la ACM codecs son la onda-mappable. Que básicamente significa que puede ser tratado como un estándar de dispositivo de la onda cuando reproducción / grabación de audio.

Por ejemplo. Es muy fácil para abrir una entrada para una fuente de sonido GSM. Una vez que reciba un buffer de datos de la ola dispositivo de entrada ya está comprimido y listo para la transmisión. Por otra parte, tan pronto como se reciben datos a través de su socket TCP / IP, es posible reproducir estos datos directamente a través de una ola de dispositivo.

  1. Los datos a partir de las MIC
  2. Enviar datos a través de toma de
  3. Datos de la toma en
  4. Enviar datos a la onda de salida del dispositivo

El estándar PCM datos sería demasiado grande para caudales en tiempo real más de un módem. Considerando que el GSM 6.1 se puede transmitir, precios tan bajos como 1.5k/second, MP3 y 16BIT MONO se puede en un mero 2k/second.

Aparte de Win2K no poder (o incluso permite) para crear MP3, no es otra cosa vale la pena mencionar acerca de este formato. A pesar de que puede muy fácilmente ser tratada como una onda de salida del dispositivo, que no parecen funcionar como una ola en el dispositivo. ¿Cuál es la razón por la que consideró necesario para convertir la PCM a MP3 datos manualmente (que resultó bastante para hacer un buen proyecto de demostración)

Componentes, demos y código fuente

Bueno, todo bien y dandy hablando de estas cosas, pero esto no es realmente mucho uso sin algunas pruebas para respaldarlo.

Por esta razón, he incluido tres componentes, y dos demostraciones (demos fueron compilados en Delphi 5). Estos componentes están disponibles para descargar en mi sitio de Delphi.

Componentes

  1. TACMConvertor:Esto realmente sirve a dos propósitos. En primer lugar, que convierte datos entre 2 formatos diferentes medios de comunicación. En segundo lugar, incluso si usted no tiene intención de convertir manualmente los datos en bruto, este componente viene en útil para especificar de entrada / salida de los formatos de los flujos de ACM. (El derecho del editor, haga clic componente le permite seleccionar los formatos de la acmFormatChoose de diálogo en designtime)

  2. TACMIn:Este componente se utiliza para la recepción de datos desde el micrófono. Puede especificar un estándar de formato PCM, o puede especificar cualquier formato susceptible de ser asignada a través de la WaveIn dispositivo.
  3. TACMOut:Este componente se utiliza reproducir audio a través de su salida de audio. Una vez más, usted puede seleccionar para la producción en formato PCM, o cualquier otro formato capaz de ser asignado a través de su dispositivo WaveOut. El NumBuffers propiedad se especifica el número de buffers que desea cubrirse antes de empezar a jugar. Esto no es muy útil cuando se desea instantánea de audio (internet teléfonos), pero puede venir en útil cuando se desea hacer de radiodifusión de audio en Internet, y quieren algo más de buffer de audio sólo en caso de que su velocidad de conexión fluctúa.

Demos

La primera demo es en realidad bastante simple. El TACMConvertor sólo se utiliza para especificar la entrada y salida de los formatos. Esta demo se abre una ACMIn un ACMOut y al mismo tiempo. Audio en el hilo es casi de inmediato de vuelta, pero con un ligero retraso, por lo que sonar un poco como Elvis Prestley (Aunque yo no soy un fan de Elvis, "Todos los sacudió hasta" fue la primera canción que surgió a la mente cuando he probado)

La segunda demo es un poco más complicado y viene en dos partes.

La primera parte (Demo2.dpr) actúa como un servidor. Dispone de un socket de servidor escucha en el puerto 6565 para nuevas conexiones. Al mismo tiempo que se tarda en audio de la MIC, la convierte en MP3 16BIT 8Khz MONO (2k/second) y los tubos que a cada cliente conectado.

La segunda parte (Demo2Client.dpr)actúa como un cliente. El primer cuadro de edición requiere de la dirección IP del servidor, mientras que el segundo (SpinEdit) de entrada es el número de buffers adicionales que usted requiere. Una vez que haga clic en Conectar (y el número solicitado de buffers se ha cubierto), usted tiene que comenzar a oír el audio desde el servidor. MP3 16BIT 8Khz MONO es sorprendentemente buena calidad, y también sorprendentemente bajo ancho de banda.

Bueno, que casi completa este artículo. Espero que hayan disfrutado la lectura acerca de lo mucho más que me gustó tener que trabajar con todo!



A partir de la versión 2.0 de estos componentes son comerciales y ahora disponible en http://www.droopyeyes.com

Average rating: