Red de conocimientos turísticos - Conocimientos sobre calendario chino - Preguntas sobre la biblioteca de decodificación libmad

Preguntas sobre la biblioteca de decodificación libmad

MAD (libmad) es una biblioteca de decodificación de audio MPEG de alta precisión de código abierto que admite el estándar MPEG-1. libmad proporciona salida PCM de 24 bits, cálculos totalmente de punto fijo y es ideal para plataformas de hardware integradas que no admiten operaciones de punto flotante. La decodificación de archivos MP3 se puede lograr utilizando una serie de API proporcionadas por libmad.

El archivo de encabezado "mad.h" define la estructura de datos y las funciones API de libmad[15].

Estructura mad_synth

Almacena datos PCM después de decodificar y filtros de síntesis

Estructura mad_pcm

Definición Muestra de audio rate, define la frecuencia de muestreo de audio, el número de canales y los datos de muestra PCM, utilizados para inicializar el audio

Estructura mad_frame

Estructura utilizada para grabar datos PCM después de decodificar fotogramas MPEG. mad_header se utiliza para registrar información básica de fotogramas MPEG, como el número de capa MPEG, el modo de canal, la velocidad de bits de transmisión y la velocidad de bits de muestreo. Los modos de canal incluyen mono, dos canales, canales de mezcla estéreo combinados y estéreo normal.

MAD implementa la decodificación a través de un mecanismo de función de devolución de llamada. Cada función de devolución de llamada devuelve un tipo de enumeración mad_flow, a través del cual se puede controlar el proceso de decodificación. Cuando no se procesa, MAD normalmente genera formato little endian de 32 bits almacenado en mad_fixed_t. MAD solo es responsable del proceso de decodificación y funciona de la siguiente manera: recibe información de una fuente externa, la decodifica cuadro por cuadro y devuelve información durante el proceso de decodificación para obtener el resultado del proceso de decodificación. Los desarrolladores deben configurar manualmente las entradas y salidas.

Programación del método de decodificación: inicialice mad_decoder, que contiene punteros a funciones de entrada, salida, filtro, error y devolución de llamada de mensajes. La inicialización se logra mediante mad_decoder_init() [16].

struct mad_decoder decoder;

struct my_playbuf playbuf; //Establecer búfer de datos

mad_decoder_init(&decoder,&playbuf,input_ func,header_func,/*filter* / 0, output_func, /*error*/ 0, /* message */ 0);

En esta función de inicialización, la función de entrada de devolución de llamada apunta a input_func, la función que procesa la información del encabezado del marco apunta a header_func, y otras funciones de filtro, error y mensajes no están configuradas y están configuradas en 0.

Luego, MAD ingresa al ciclo de decodificación:

Cuando la función de decodificación completa la decodificación de los datos, llama a input_func

Cuando input_func le dice a la función de decodificación que todos los datos han sido decodificados. Después de eso, llama a input_func.

Decodifica el encabezado del marco y llama a la función header_func

Decodifica los datos principales en el marco

Llama a la función filter_func; >Envíe los datos decodificados, llame a la función output_func;

Repita los pasos anteriores.

MAD consultará el estado de mad_flow al final de cada fotograma decodificado para decidir si decodificar el siguiente fotograma.

La estructura de datos de enum mad_flow se define de la siguiente manera:

enum mad_flow{

MAD_FLOW_CONTINUE = 0x0000, /*Continuar decodificando el siguiente cuadro*/

MAD_FLOW_STOP = 0x0010, / *Detener decodificar este flujo de bits y salir normalmente*/

MAD_FLOW_BREAK = 0x0010, /*Detener decodificar este flujo de bits y devolver un error*/

MAD_FLOW_IGNORE = 0x0020 /*No decodifica este fotograma, salta al siguiente fotograma*/

};

En la mayoría de los casos, la función de devolución de llamada devolverá MAD_FLOW_CONTINUE. El formato de declaración de la función de devolución de llamada que se personalizará es:

enum mad_flow (*input_func)(void *, struct mad_stream *);

enum mad_flow (*input_func)(void * , struct mad_stream *);

Este es el formato de declaración de la función de devolución de llamada que se personalizará.

enum mad_flow (*header_func)(void *, struct mad_header const *);

enum mad_flow (*filter_func)(void *, struct mad_stream const *, struct mad_frame *);

enum mad_flow (*output_func)(void *, struct mad_header const *, struct mad_pcm *);

enum mad_flow (*output_func)(void *, struct mad_header const *, struct mad_pcm *);

enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *);

El puntero void * pasa los datos almacenados en el búfer a estas funciones de devolución de llamada, Procesan los datos.

La función input_func normalmente realiza las siguientes operaciones:

if (more_data_available)

buffer = refill_buffer();

mad_ stream_buffer(stream,buffer,length_of_buffer);

p>

Devuelve MAD_FLOW_CONTINUE;

De lo contrario, devuelve MAD_FLOW_STOP;

La función header_func leerá información importante del marco del archivo de encabezado señalado por mad_header, como la lectura asignada a mad_timer_t Para la longitud del fotograma, puede cambiar la longitud del fotograma desde mad.h.

En la función output_func, utilice el puntero mad_pcm que apunta a los datos PCM y realice una operación similar a lo siguiente:

mad_fixed_t *left_ch = pcm- >samples[0], *right_ch = pcm->samples[1] //Envía muestras al canal izquierdo y derecho respectivamente

int nsamples = pcm->longitud;

muestra int firmada;

char unsigned * buffer = some_buffer;

char unsigned * ptr = buffer;

while (nsamples--)

p>

{

muestra = (int con signo) do_downsample(*left_ch++)

*ptr++ = (carácter sin firmar) (muestra & gt; > 0);

*ptr++ = (carácter sin firmar) (muestra >> 8);

muestra = (int con signo) do_downsample(* right_ch++)

*ptr++ = (carácter sin firmar) (muestra > 0);

*ptr++ = (carácter sin firmar) (muestra >> 8);

Definición de función de devolución de llamada. Después de definir la función de devolución de llamada, puede comenzar a decodificar:

mad_decoder_run(&decoder, MAD_DECODER_MODE_SYNC);

Una vez completada la decodificación, llame a mad_decoder_finish(&decoder);

Esta es la primera vez que se llama a Mad_decoder_finish(&decoder).