Separador de audio y video FFmpeg (2)

Lógica de procesamiento:

1. Inicialización del programa: el código inicializa las variables y estructuras de datos requeridas al principio, incluido el contexto de formato del archivo de entrada, el archivo de salida y otros parámetros.

2. Apertura del archivo de entrada y recuperación de información: el programa intenta abrir el archivo de entrada (in_filename) y recuperar la información de la transmisión (transmisión de video y transmisión de audio) en el archivo de entrada.

3. Creación de archivos de salida: el programa crea dos archivos de salida, uno para almacenar el flujo de código de video (out_filename_v) y el otro para almacenar el flujo de código de audio (out_filename_a). También se crean contextos de formato para ambos archivos de salida.

4. Copia y configuración de secuencias: el programa atraviesa cada secuencia en el archivo de entrada y crea la secuencia de salida correspondiente según el tipo de secuencia (video o audio). Luego copia el contexto del códec del flujo de entrada al flujo de salida y establece algunos indicadores necesarios.

5. Impresión de información de formato de salida: el programa imprime la información de formato del archivo de entrada y del archivo de salida para que el usuario pueda comprender la información detallada de estos archivos.

6. Apertura del archivo de salida: si el archivo de salida no es una salida estándar, el programa intenta abrir el archivo de salida.

7. Escribir encabezado de archivo: el programa escribe el encabezado del archivo de salida como preparación para comenzar a escribir datos.

8. Separación y escritura de datos: el programa ingresa al bucle principal, lee continuamente los paquetes de datos (AVPacket) en el archivo de entrada y luego escribe estos paquetes de datos en el archivo de salida correspondiente según el tipo de transmisión (video o audio) al que ellos pertenecen. .

9. Para transmisiones de video, si el filtrado de flujo de bits H.264 (USE_H264BSF) está habilitado, el programa procesará los paquetes de video para garantizar que estén en el formato correcto.

10. Luego, el programa convierte las marcas de tiempo (PTS y DTS) y las escribe en el archivo de salida.

11. Escriba al final del archivo: cuando se hayan procesado todos los paquetes de datos, el programa escribe al final del archivo de salida para completar la salida.

12. Limpieza de recursos: finalmente, el programa cierra el archivo de entrada y el archivo de salida, libera los recursos correspondientes y luego sale.

13. Manejo de errores: si ocurre un error en cualquier etapa, el programa imprimirá un mensaje de error y devolverá un código de error apropiado.

En general, el objetivo principal de este código es separar las transmisiones de video y audio en el archivo de entrada y escribirlas en dos archivos de salida separados. Esto ayuda a dividir y procesar las partes de video y audio de los archivos multimedia.

Explicaciones importantes de códigos de función

int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **opciones);

Los parámetros de la función en la biblioteca FFmpeg para abrir archivos multimedia de entrada
se explican a continuación:
ps: un puntero al puntero AVFormatContext, utilizado para almacenar el contexto del formato de entrada creado después de abrir el archivo.
URL: ingrese la ruta o URL del archivo multimedia.
fmt: Parámetro opcional que especifica el formato de entrada a utilizar. Normalmente, puede configurarlo en NULL para que FFmpeg detecte automáticamente el formato de entrada según la extensión o el contenido del archivo.
opciones: parámetro opcional utilizado para pasar opciones adicionales.
La función de esta función es abrir el archivo multimedia de entrada especificado y crear un contexto de formato de entrada AVFormatContext para él. Este contexto contiene información sobre el archivo multimedia de entrada, como la cantidad de transmisiones, el tipo de transmisión (video, audio, etc.), la duración, etc. Una vez que el archivo de entrada se abre correctamente y se crea el contexto, puede utilizar este contexto para acceder a la información del archivo multimedia y leer los paquetes de datos (AVPacket) que contiene.

int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **opciones);

Función de biblioteca FFmpeg utilizada para obtener información de transmisión de archivos multimedia de entrada. Los
parámetros se explican a continuación:
ic: el contexto de formato del archivo multimedia de entrada, es decir, el contexto abierto a través de la función avformat_open_input.
opciones: parámetros opcionales utilizados para pasar opciones adicionales. Normalmente, puedes configurarlo en NULL.
La función de esta función es analizar el archivo multimedia de entrada y extraer información de la transmisión (como transmisión de video, transmisión de audio), incluida la cantidad de transmisiones, información del códec de transmisión, duración, velocidad de fotogramas, etc. Esta información se almacena en la matriz de secuencias en la estructura AVFormatContext y cada elemento corresponde a la información de una secuencia.
En resumen, esta función se utiliza para comprender la estructura y el contenido del archivo multimedia después de abrir el archivo multimedia de entrada para operaciones posteriores de procesamiento y decodificación.
Pregunta relacionada: ¿Es comprensible que esta función se utilice para inicializar la matriz de transmisiones?
Respuesta: No es del todo correcto. La función avformat_find_stream_info no se usa para inicializar la matriz de transmisiones, pero se usa para analizar y obtener información de transmisión del archivo multimedia real después de abrir el archivo multimedia de entrada, y almacenar esta información en la matriz de transmisiones.
Específicamente, las tareas principales de esta función son:
1. Identificar varias secuencias presentes en el archivo multimedia de entrada (por ejemplo, secuencia de vídeo, secuencia de audio, secuencia de subtítulos, etc.).
2. Obtenga la información detallada de cada transmisión, incluida la información del códec, la duración, la velocidad de cuadros, la resolución, etc. de la transmisión.
3. Almacene esta información en la matriz de transmisiones en la estructura AVFormatContext para que las operaciones posteriores puedan acceder y utilizar esta información de transmisión.
Por lo tanto, su función principal es llenar la matriz de transmisiones en la estructura AVFormatContext en lugar de inicializar la matriz. La inicialización generalmente se realiza al crear la estructura AVFormatContext. Esta función se llama para obtener información más detallada sobre la transmisión en el archivo multimedia para operaciones de procesamiento multimedia posteriores.

int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oformat, const char *format_name, const char *nombre de archivo);

Los parámetros del contexto de formato (AVFormatContext)
utilizados para crear archivos multimedia de salida se explican a continuación:
ctx: puntero al puntero AVFormatContext utilizado para almacenar el contexto del formato de salida creado.
offormat: parámetro opcional utilizado para especificar el formato de salida. Por lo general, se puede establecer en NULL para que FFmpeg seleccione automáticamente el formato de salida según la extensión del archivo de salida.
format_name: parámetro opcional utilizado para especificar el nombre del formato de salida.
nombre de archivo: la ruta o URL del archivo de salida.
La función principal de esta función es crear un contexto de formato de salida para preparar los datos multimedia que se escribirán en el archivo de salida. Este contexto contiene información sobre el formato del archivo de salida, como el formato del contenedor, el codificador, etc.
Una vez que el contexto del formato de salida se haya creado correctamente, puede usarlo para configurar varias propiedades del archivo de salida, como codificador de video, codificador de audio, información de transmisión, etc., y luego prepararse para comenzar a escribir datos en el archivo de salida.

AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c);

Los parámetros se explican a continuación:
s: Puntero al contexto del formato de salida, es decir, el contexto creado por avformat_alloc_output_context2.
c: Puntero a la estructura AVCodec que representa el códec utilizado por la transmisión.
La función principal de esta función es crear una nueva secuencia de salida para escribir datos multimedia (como video, audio) en el archivo de salida. El flujo de salida contiene información sobre el flujo, como codificador, base de tiempo, índice, etc.
Normalmente, después de crear un contexto de formato de salida, debe crear una secuencia de salida correspondiente para cada tipo de secuencia (por ejemplo, vídeo, audio) que desee escribir en el archivo de salida.
Una vez que se crea el flujo de salida, puede configurarlo, configurando el codificador del flujo y otras propiedades en preparación para escribir datos en el archivo de salida. Esta función devuelve un puntero al flujo de salida recién creado. Puede utilizar este puntero para configurar aún más los parámetros del flujo de salida.

int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src);

Se utiliza para copiar el contenido de un contexto de códec (AVCodecContext) a otro contexto de códec. Los
parámetros se explican a continuación:
dest: contexto de códec de destino, es decir, el contexto al que desea copiar la información.
src: el contexto del códec fuente, el contexto desde el cual desea copiar información.
La función principal de esta función es copiar la información de configuración de un contexto de códec (por ejemplo, codificador, parámetros de codificación, parámetros de decodificación, etc.) del contexto de origen al contexto de destino para que ambos tengan la misma configuración. Esto generalmente se usa para garantizar que la configuración del codificador del flujo de salida coincida con la del flujo de entrada.
Esto se hace para garantizar que la configuración del códec permanezca consistente al copiar datos multimedia del flujo de entrada al flujo de salida, manteniendo así la calidad y el formato de los datos multimedia.

¡Detengámonos aquí primero y sigamos compartiendo mañana! ! !

Supongo que te gusta

Origin blog.csdn.net/qqshenbaobao/article/details/133219553
Recomendado
Clasificación