Red de conocimiento informático - Consumibles informáticos - Adicional: comprensión del concepto FFmpeg

Adicional: comprensión del concepto FFmpeg

Introducción a FFmpeg

FFmpeg es un conjunto de programas informáticos de código abierto que se pueden utilizar para grabar, convertir audio y vídeo digitales y convertirlos en transmisiones. Utilice licencia LGPL o GPL. Proporciona una solución completa para grabar, convertir y transmitir audio y vídeo. Contiene la muy avanzada biblioteca de códecs de audio/vídeo libavcodec. Para garantizar una alta portabilidad y calidad de códec, muchos códecs en libavcodec se desarrollaron desde cero.

FFmpeg está desarrollado bajo la plataforma Linux, pero también puede compilarse y ejecutarse en otros entornos de sistemas operativos, incluidos Windows, Mac OS X, etc. Este proyecto fue iniciado por primera vez por Fabrice Bellard y ahora lo mantiene Michael Niedermayer. Muchos desarrolladores de FFmpeg provienen del proyecto MPlayer y actualmente FFmpeg también se encuentra en el servidor del equipo del proyecto MPlayer. El nombre del proyecto proviene del estándar de codificación de vídeo MPEG, con el "FF" delante que significa "Fast Forward".

Módulo FFmpeg

libavformat: se utiliza para la generación y análisis de varios formatos de encapsulación de audio y video, incluidas funciones como obtener la información requerida para la decodificación para generar estructuras de contexto de decodificación y lectura de audio. y fotogramas de vídeo.

libavcodec: se utiliza para varios tipos de codificación y decodificación de sonido/imagen;

libavutil: contiene algunas funciones de utilidad pública

libswscale: usado Se usa para escalar escenas de video y convertir mapas de colores;

libpostproc: se usa para el procesamiento posterior al efecto;

ffmpeg: una herramienta proporcionada por este proyecto, que se puede usar para la conversión de formato , decodificación o codificación en tiempo real de tarjetas de TV, etc.

ffsever: un servidor de transmisión de transmisión multimedia en tiempo real HTTP

ffplay: es un reproductor simple que utiliza la biblioteca ffmpeg; para analizar y decodificar, y se muestra a través de SDL

Principio de codificación H.264 Trama I/B/P

Descripción de tres tipos de tramas

I trama : cuadro de codificación dentro del cuadro, el cuadro I representa el cuadro clave. Puede entenderlo como la preservación completa de este cuadro, solo se necesitan los datos de este cuadro al decodificar (porque contiene la imagen completa)

Características de I frame:

1. Es un cuadro codificado por compresión de fotograma completo. Realiza codificación de compresión JPEG y transmisión de información de imagen de fotograma completo

2. Al decodificar, la imagen completa se puede reconstruir utilizando solo los datos del fotograma I

3. El cuadro I describe los detalles del fondo de la imagen y los sujetos en movimiento;

4. Los cuadros I se generan sin referencia a otras imágenes

5. Los cuadros I son cuadros de referencia para los cuadros P y; Cuadros B (su calidad afecta directamente la calidad de los cuadros posteriores en el mismo grupo);

6. El cuadro I es el cuadro básico (el primer cuadro) del grupo de cuadros GOP, y solo hay uno. Cuadro I en un grupo;

7. Los cuadros I no necesitan considerar vectores de movimiento

8. La cantidad de información en los datos ocupada por los cuadros I es relativamente grande;

Trama P: Trama de codificación predictiva directa. El cuadro P representa la diferencia entre este cuadro y un cuadro clave anterior (o cuadro P). Al decodificar, debe superponer la diferencia definida en este cuadro con la imagen previamente almacenada en caché para generar la imagen final. (Es decir, el cuadro de diferencia, el cuadro P no tiene datos de imagen completos, solo los datos que son diferentes del cuadro anterior)

Predicción y reconstrucción del cuadro P: el cuadro P usa el cuadro I fotograma como marco de referencia. Encuentre el valor predicho y el vector de movimiento de "un cierto punto" en el fotograma P en el fotograma I, tome la diferencia de predicción y envíela junto con el vector de movimiento. En el extremo receptor, el valor predicho del "punto determinado" del cuadro P se encuentra a partir del cuadro I en función del vector de movimiento y se suma a la diferencia para obtener el valor de muestra del "punto determinado" del cuadro P. obteniendo así el marco P completo.

Características del cuadro P:

1. El cuadro P es un cuadro codificado 1 ~ 2 cuadros después del cuadro I

2. El cuadro P adopta compensación de movimiento; El método transmite la diferencia y el vector de movimiento (error de predicción) entre este y el cuadro I o P anterior;

3. Durante la decodificación, el valor de predicción y el error de predicción en el cuadro I deben sumarse antes de la reconstrucción completa. se puede completar la imagen del cuadro P;

4. El cuadro P pertenece a la codificación entre cuadros de predicción directa. Solo se refiere al cuadro I o al cuadro P más cercano a él;

5. El cuadro P puede ser el cuadro de referencia del cuadro P posterior o el cuadro de referencia del cuadro B anterior y posterior. ;

6. Dado que el cuadro P es un cuadro de referencia, puede causar la propagación de errores de decodificación

7. Debido a que es una transmisión diferencial, la compresión del cuadro P es; relativamente alto.

Trama B: trama codificada por interpolación predictiva bidireccional. El cuadro B es un cuadro de diferencia bidireccional, es decir, el cuadro B registra la diferencia entre este cuadro y los cuadros anteriores y posteriores (los detalles son más complicados, hay 4 situaciones, pero lo pongo de esta manera para hacerlo más simple) En otras palabras, para decodificar el cuadro B, no solo se debe obtener la imagen almacenada en caché anterior, y la imagen final se obtiene superponiendo las imágenes anterior y siguiente con los datos de este cuadro. La tasa de compresión del cuadro B es alta, pero la CPU se cansará al decodificar.

Predicción y reconstrucción del fotograma B

El fotograma B utiliza el fotograma I o P anterior y el fotograma P siguiente como marcos de referencia para "encontrar" el "punto determinado" del fotograma B Se toman el valor de predicción y dos vectores de movimiento, y se toman y transmiten la diferencia de predicción y el vector de movimiento. El extremo receptor "encuentra (calcula)" el ​​valor predicho en los dos fotogramas de referencia basándose en el vector de movimiento y lo suma con la diferencia para obtener el valor de muestra de "punto determinado" del fotograma B, obteniendo así el fotograma B completo.

Características de los cuadros B

1. Los cuadros B se predicen a partir del cuadro I o P anterior y el siguiente cuadro P

2. Cuadros B ¿Qué es? transmitido es el error de predicción y el vector de movimiento entre este y el cuadro I o P anterior y el siguiente cuadro P;

3. El cuadro B es un cuadro de codificación predictiva bidireccional;

4 .El cuadro B tiene la relación de compresión más alta, porque solo refleja los cambios en los sujetos en movimiento entre los cuadros de referencia C, y la predicción es más precisa;

5. El cuadro B no es un cuadro de referencia y no causar la propagación de errores de decodificación.

Nota: Los fotogramas I, B y P se definen artificialmente en función de las necesidades del algoritmo de compresión. Todos son fotogramas físicos reales. En términos generales, la tasa de compresión del cuadro I es 7 (similar a JPG), el cuadro P es 20 y el cuadro B puede llegar a 50. Se puede ver que el uso de cuadros B puede ahorrar mucho espacio, y el espacio guardado se puede usar para guardar más cuadros I, lo que puede proporcionar una mejor calidad de imagen con la misma velocidad de bits.

Método de compresión h264:

1. Agrupación: divide varios fotogramas de imágenes en un grupo (GOP, es decir, una secuencia, para evitar cambios de movimiento, el número de). Los marcos no deben ser demasiado altos.

2. Definir fotogramas: defina cada imagen de fotograma de cada grupo en tres tipos, a saber, fotograma I, fotograma B y fotograma P

3. Predecir fotograma: fotograma I Como básico; cuadro, el cuadro I se usa para predecir el cuadro P, y luego el cuadro I y el cuadro P se usan para predecir el cuadro B

4. Transmisión de datos: finalmente, la información de diferencia entre el cuadro I; Los datos y la predicción se almacenan y transmiten. La compresión intracuadro también se denomina compresión espacial. Al comprimir un cuadro de imagen, solo se consideran los datos de este cuadro sin considerar la información redundante entre cuadros adyacentes. En realidad, esto es similar a la compresión de imágenes estáticas. El intracuadro generalmente utiliza un algoritmo de compresión con pérdida. Dado que la compresión intracuadro codifica una imagen completa, se puede decodificar y mostrar de forma independiente. La compresión dentro del cuadro generalmente no logra una compresión muy alta, similar a la codificación jpeg.

El principio de la compresión entre cuadros es: los datos de los cuadros adyacentes tienen una gran correlación, o la información de los dos cuadros antes y después cambia muy poco. Es decir, los vídeos continuos tienen información redundante entre fotogramas adyacentes. Según esta característica, comprimir la cantidad de redundancia entre fotogramas adyacentes puede aumentar aún más la cantidad de compresión y reducir la relación de compresión.

La compresión entre fotogramas, también llamada compresión temporal, comprime datos comparando datos entre diferentes fotogramas en la línea de tiempo. La compresión entre cuadros generalmente no tiene pérdidas. El algoritmo de diferenciación de cuadros es un método típico de compresión de tiempo. Compara la diferencia entre este cuadro y los cuadros adyacentes y solo registra la diferencia entre este cuadro y sus cuadros adyacentes, lo que puede reducir en gran medida la cantidad de datos.

Por cierto, compresión con pérdida (Lossy) y compresión sin pérdida (Lossy less). La compresión sin pérdidas significa que los datos antes y después de la compresión son exactamente iguales. La mayoría de las compresiones sin pérdidas utilizan el algoritmo de codificación de longitud de ejecución RLE. La compresión con pérdida significa que los datos descomprimidos no son consistentes con los datos antes de la compresión. Durante el proceso de compresión, parte de la información de imagen o audio que es insensible al ojo y oído humanos se pierde y la información perdida no se puede recuperar. Casi todos los algoritmos de alta compresión utilizan compresión con pérdida para lograr el objetivo de velocidades de datos bajas. La tasa de pérdida de datos está relacionada con la tasa de compresión. Cuanto menor es la tasa de compresión, más datos se pierden y el efecto de descompresión generalmente es peor. Además, algunos algoritmos de compresión con pérdida utilizan compresión repetida varias veces, lo que puede provocar una pérdida adicional de datos.

Análisis del encabezado NAL H264

Si el Slice correspondiente a la NALU es el comienzo de una trama, se representa con 4 bytes, es decir, 0x00000001; 3 bytes, 0x000001.

Encabezado NAL: bit_prohibido, nal_reference_bit (prioridad) 2 bits, nal_unit_type (tipo) 5 bits. Identifica el tipo de datos RBSP en la unidad NAL. Las unidades NAL con nal_unit_type de 1, 2, 3, 4 y 5 se denominan unidades VCL NAL, y otros tipos de unidades NAL son unidades no VCL.

0: No especificado

1: Fragmentos que no utilizan división de datos en imágenes que no son IDR

2: Fragmentos de división de datos de clase A en imágenes que no son IDR imágenes

p>

3: Fragmentos de división de datos de clase B en imágenes no IDR

4: Fragmentos de división de datos de clase C en imágenes no IDR

5: Fragmentos de imagen IDR

6: Información de mejora suplementaria (SEI)

7: Conjunto de parámetros de secuencia (SPS)

8: Conjunto de parámetros de imagen (PPS) )

9: Delimitador

10: Terminador de secuencia

11: Terminador de secuencia

12: Relleno de datos

13: Extensiones del conjunto de parámetros de secuencia

14: Unidad NAL prefijada

15: Conjunto de parámetros de subsecuencia

16 – 18: Reservado

19: Segmentos de imagen codificados no auxiliares que utilizan partición de datos

20: Extensión de segmento codificado

21 – 23: Reservado

24 – 31: No especificado

Las cadenas SPS y PPS de H.264 contienen los parámetros de información necesarios para inicializar el decodificador H.264, incluido el perfil, nivel, ancho y alto de la imagen, filtro de desbloqueo, etc., utilizados para la codificación.

Velocidad de código: 256~512 kb/s

Velocidad de cuadros: 15~20 fps

Resolución: 1280x720(HD) 640x368(VGA) 1920x1080(UHD)

AAC (Advanced Audio Coding)

Nombre chino: Advanced Audio Coding, que apareció en 1997 y se basa en la tecnología de codificación de audio MPEG-2. Ha sido desarrollado conjuntamente por Fraunhofer IIS, Dolby Laboratories, AT&T, Sony y otras empresas con el objetivo de sustituir el formato MP3.

En 2000, después de que surgiera el estándar MPEG-4, AAC reintegró sus características y agregó tecnología SBR y tecnología PS. Para distinguirlo del tradicional MPEG-2 AAC, también se llamó MPEG-4 AAC.

Ventajas: En comparación con mp3, el formato AAC tiene mejor calidad de sonido y archivos más pequeños.

Desventajas: AAC es un formato de compresión con pérdida y existe una brecha "esencial" en la calidad del sonido en comparación con los formatos populares sin pérdida como APE y FLAC. Además, USB3.0 con una velocidad de transmisión más rápida y MP3 de gran capacidad por encima de 16G están ganando popularidad, lo que también hace que el halo "compacto" de AAC ya no exista.

La frecuencia de muestreo de audio se refiere al número de veces que el dispositivo de grabación muestrea la señal de sonido en un segundo. Cuanto mayor sea la frecuencia de muestreo, más realista y natural se restaurará el sonido. En las tarjetas de captura convencionales de hoy en día, las frecuencias de muestreo generalmente se dividen en tres niveles: 22,05 KHz, 44,1 KHz y 48 KHz. 22,05 KHz solo pueden alcanzar la calidad de sonido de las transmisiones de FM, 44,1 KHz es el límite teórico de la calidad del sonido de un CD y 48 KHz es el límite. más preciso.

La tasa de bits se refiere al número de bits transmitidos por segundo. La unidad es bps (bit por segundo). Cuanto mayor sea la velocidad de bits, más rápida será la velocidad de transmisión de datos. La velocidad de bits en el sonido se refiere a la cantidad de datos binarios por unidad de tiempo después de convertir una señal de sonido analógica en una señal de sonido digital. Es un indicador indirecto de la calidad del audio. El principio de velocidad de bits (velocidad de código) en video es el mismo que en sonido. Ambos se refieren a la cantidad de datos binarios por unidad de tiempo después de convertir una señal analógica en una señal digital.

En la codificación de canales, un bloque de datos fuente de tamaño de símbolo K se asigna a una palabra de código de tamaño de símbolo N a través de la codificación, luego K/N se convierte en la tasa de código, asumiendo que la tabla de símbolos antes y después de la codificación no no cambiar.

Hay muchas estructuras en FFMPEG. Las estructuras más críticas se pueden dividir en las siguientes categorías:

Protocolo de solución (piler flags —gt; cflags plus OTHER_CFLAGS="-fembed-bitcode".

Optimización de FFmpeg

1 Optimización de la memoria. La memoria está aumentando. No se puede recuperar a tiempo.

Para la optimización de la decodificación, consulte la última biblioteca de decodificación, la eficiencia de la decodificación y la estabilidad.

YUV-gt; ¿RGB? Sombreador OpenGLES para mostrar.

Transcodificación FFmpeg

1. Separar secuencias de vídeo y audio

ffmpeg -i input_file -vcodec copy -an output_file_video //Separar secuencia de vídeo

ffmpeg -i input_file -acodec copy -vn output_file_audio // Separar flujo de audio

2. Demultiplexación de video

ffmpeg –i test.mp4 –vcodec copy –an –f m4v test .264

ffmpeg –i test.avi –vcodec copy –an –f m4v test.264

3. Transcodificación de vídeo

ffmpeg –i test.mp4 –vcodec h264 –s 352 278 –an –f m4v test.264 ? //Transcodificar al archivo de flujo de código original

ffmpeg –i test.mp4 –vcodec h264 –bf 0 –g 25 –s 352

278 –an –f m4v test.264? //Transcodificar al archivo de flujo de código original

ffmpeg –i test.avi -vcodec mpeg4 –vtag xvid –qsame test_xvid.avi //Transcodificar a archivo encapsulado

//-bf control de número de fotograma B, -g control de intervalo de fotograma clave, -s control de resolución

4. Encapsulación de vídeo

ffmpeg –i archivo_video –i archivo_audio –vcodec copy –acodec copia archivo_salida

5. Corte de vídeo

ffmpeg –i test.avi –r 1 –f image2 image-3d.jpeg //Extraer imagen

ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi //Cortar vídeo

//-r frecuencia para extraer imágenes, -ss hora de inicio, -t duración

6. Grabación de video

ffmpeg –i rtsp:/ /192.168.3.205:5555/test –vcodec copy out.avi

7.Reproducción de secuencia YUV

ffplay -f rawvideo -video_size 1920x1080 input.yuv

8. Convertir secuencia YUV a AVI

ffmpeg –s w*h –pix_fmt yuv420p –i input.yuv –vcodec mpeg4 output.avi

llamada al sistema

#includelt ; ; string.hgt; intmain(){charcommand[50]; strcpy(comando, "ffmpeg –s w*h –pix_fmt yuv420p –i input.yuv –vcodec mpeg4 system( coma");

nd); return(0);}

Las funciones y estructuras de datos más importantes en FFMpeg son las siguientes:

Estructura de datos:

(1) AVFormatContext

(2) AVOutputFormat

(3) AVInputFormat

(4) AVCodecContext

(5) AVCodec

( 6) AVFrame

(7) AVPacket

(8) AVPicture

(9) AVStream

Función de inicialización:

(1) av_register_all()

(2) avcodec_open()

(3) avcodec_close()

(4) av_open_input_file()

(5) av_find_input_format()

(6) av_find_stream_info()

(7) av_close_input_file()

Códec de audio y vídeo función:

(1) avcodec_find_decoder()

(2) avcodec_alloc_frame()

(3) avpicture_get_size()

(4 ) avpicture_fill ()

(5) img_convert()

(6) avcodec_alloc_context()

(7) avcodec_decode_video()

(8 ) av_free_packet()

(9) av_free()

Operaciones de archivo:

(1) avnew_steam()

( 2) av_read_frame()

(3) av_write_frame()

(4) dump_format()

Otras funciones:

(1 ) avpicture_deinterlace ()

(2) ImgReSampleContext()