Red de conocimiento informático - Material del sitio web - Cómo realizar codificación h264 y codificación aac en tiempo real

Cómo realizar codificación h264 y codificación aac en tiempo real

1. Introducción

El primero es la captura. Aquí se utiliza DirectShow, que encapsula audio y video hasta cierto punto. La ventaja es que puede utilizar la API nativa directamente y realizar las modificaciones que desee. La desventaja es que no puede ser multiplataforma. Las aplicaciones como la captura de audio y vídeo también requieren la plataforma Linux. Existe un enfoque multiplataforma. Para video, puedes usar OpenCV, para audio, puedes usar OpenAL o PortAudio, etc., y eso es todo.

Hay una amplia gama de opciones de codificación disponibles para vídeo, están H264, MPEG-4, WebM/VP8, Theora, etc., y para audio, están Speex, AAC, Ogg/Vorbis. , etc., todos los cuales tienen proyectos de código abierto correspondientes. Usé x264 para la codificación H264 y libfaac para la codificación aac. Más tarde, usé x264 para la codificación H264 y libfaac para la codificación aac. La posibilidad de cambiar el esquema de codificación depende de los requisitos del proyecto específico. Permítanme mencionar aquí WebM, un proyecto liderado por Google. Es completamente abierto y gratuito. Utiliza codificación VP8 y Vorbis y empaquetado webm (mkv). Su objetivo es reemplazar la codificación de video H264 actual. Se dice que es mejor que este último, pero en realidad no he probado el efecto. Sin embargo, es diferente cuando una empresa comercial toma la iniciativa. El soporte es muy completo y puedes prestarle atención si tienes tiempo.

2. Lógica y proceso

La idea básica es implementar la interfaz dshow ISampleGrabberCB y guardar cada búfer mediante devoluciones de llamada. Además del hilo de la interfaz y el hilo propio de dshow, iniciamos dos hilos, AudioEncoderThread y VideoEncoderThread, para obtener datos de SampleGrabber y llamar al codificador para codificar respectivamente. Los archivos codificados se pueden generar directamente. Vea la imagen:

Este programa está construido usando VS2010, vea la captura de pantalla del proyecto:

Base La siguiente es una encapsulación simple de algunas API del sistema, principalmente subprocesos y bloqueos. Aquí también simplemente encapsulo el proceso de captura de dshow, incluida la creación de un generador de gráficos, conexión de filtro, etc. directshow es muy difícil de usar. No hay otra forma de usarlo, pero debe usarse incluso si es difícil de usar. Debido a que es VS2010, se llama al dshow del SDK de Windows 7.1, no hay ningún archivo qedit.h y está definido oficialmente como ISampleGrabberCB. No se preocupe, todavía hay qedit.dll en el sistema, todo lo que tenemos que hacer es copiarlo desde Windows SDK 6.0 y luego agregar estas líneas de código en stdafx.h.

1 #pragma include_alias( "dxtrans.h", "qedit.h" )

2 #define __IDxtCompositor_INTERFACE_DEFINED__

3 #define __IDxtAlphaSetter_INTERFACE_DEFINED__

4 #define __IDxtJpeg_ INTERFACE_DEFINED__

5 #define __IDxtKey_INTERFACE_DEFINED__

6 #incluye "qedit.h"

3. >

Archivos relacionados:

Debajo del codificador hay códigos relacionados con la codificación de audio y video. x264Encoder encapsula la operación de llamar al codificador x264, FAACEncoder encapsula la operación de llamar al codificador libfaac, VideoEncoderThread y AudioEncoderThread son responsables del proceso principal. Publicaré el código clave a continuación.

A. Hilo de codificación de vídeo

El proceso principal primero inicializa el codificador x264 y luego inicia un bucle para llamar a DSVideoGraph para extraer los fotogramas de vídeo de SampleGrabber y llamar a x264 para codificarlos. . Este proceso es relativamente simple y la frecuencia de las llamadas es la velocidad de fotogramas del video que desea obtener. Una cosa a tener en cuenta es que la codificación x264 requiere mucho tiempo, por lo que al calcular el tiempo de inactividad del subproceso, debe tener en cuenta el tiempo consumido por este proceso para evitar capturar una velocidad de cuadros de video incorrecta.

B. Hilo de codificación de audio

El proceso principal es el mismo que el hilo de codificación de video, es decir, inicializar el codificador FAAC y luego realizar un bucle para llamar a DSAudioGraph para obtener el cuadro de video. SampleGrabber y llamando a faac para codificarlo. A diferencia del video, el audio se muestrea muy rápidamente, por lo que el audio debe capturarse casi continuamente, pero solo cuando se capturan nuevos datos en SampleGrabber; de lo contrario, su programa alcanzará el 100% de uso de la CPU, como se muestra en el código siguiente. Se utiliza IsBufferAvailaber() para realizar esto. detección.

Al llamar a faac para codificar, hay una cosa a la que se debe prestar atención, de lo contrario, el audio codificado será muy anormal. será un dolor de cabeza. unsigned long *maxOutputBytes);3 4 int FAACAPI faacEncEncode(faacEncHandle hEncoder, int32_t * inputBuffer, unsigned int samplesInput,5 unsigned char *outputBuffer, unsigned int bufferSize);

El tercer parámetro de faacEncEncode se refiere al número de muestras de entrada debe ser igual a inputSamples devuelto al llamar a faacEncOpen. Para hacer esto, establezca el tamaño del búfer en dshow usando la siguiente fórmula:

BufferSize = aac_frame_len * canales * wBytesPerSample// aac_frame_len = 1024