¿Es posible la codificación h264 acelerada por hardware?

11

La Raspberry Pi realizará una codificación h264 acelerada por hardware al grabar video desde la placa de la cámara. ¿Cómo puedo codificar h264 (usando aceleración de hardware) cuando las imágenes de origen no provienen directamente de la cámara?

¿Hay alguna herramienta de línea de comando que soporte esto?

Si no, ¿qué API debería considerar para que esto sea posible?

Szabolcs
fuente
¿Qué estás codificando y cómo lo haces actualmente? - ¿Está convirtiendo archivos de video, procesándolos a partir de imágenes y sonido, etc.?
Wilf
@Wilf Estoy interesado en esto en general, sin embargo, tengo una aplicación actual: codificar un lapso de tiempo directamente al video. No puedo usar raspivid porque necesito bajas tasas de fotogramas entre 1/5 y 2 fps. Además, la exposición automática raspivid entra en oscilaciones bajo mis condiciones de iluminación (poca luz). Por lo tanto, quiero usar raspistill, pero codificar directamente en video para que el resultado no ocupe demasiado espacio (como lo harían los JPEG). Como segunda aplicación, quiero publicar el proceso de cada cuadro en tiempo real usando Mathematica (tomará mucho tiempo de CPU) y luego enviarlos para que se codifiquen en h264.
Szabolcs
1
@Wilf Tengo una solución parcial que creo que debería ser posible hacer funcionar: la idea es algo así raspiyuv -o - | rpi-encode-yuv(aproximadamente) de dónde es la rpi-encode-yuvherramienta desde aquí . El tamaño del marco está codificado en esta herramienta, por lo que debe cambiarlo al comienzo del archivo C y volver a compilarlo. Desafortunadamente, aún no he logrado obtener una salida correctamente alineada, ya raspiyuvque no parece codificar el tamaño del cuadro en su salida. Obtengo una imagen que cambia gradualmente y que finalmente se convierte en basura. Sigo trabajando en eso.
Szabolcs

Respuestas:

8

GStreamer está incluido en Raspbian y con su complemento OpenMAX utilizará las capacidades de codificación de hardware de Raspberry Pi.

Consulte este enlace para obtener un tutorial sobre cómo hacer lo que está buscando: https://www.raspberrypi.org/forums/viewtopic.php?t=72435

Si está interesado en la transcodificación, acabo de publicar una respuesta a otra pregunta que podría interesarle: ¿Qué velocidad puedo esperar de la codificación por hardware H264?

M. Rubio-Roy
fuente
¡Gracias! No puedo probar esto en este momento, pero aceptaré por adelantado según su tutorial.
Szabolcs
1

Parece que compilando ffmpeg usted mismo, en RPi3B + puede obtener

CODIFICACIÓN DE VIDEO DE 30 FPS DE ALTA COMPLEJIDAD DESDE UNA SECUENCIA DE IMAGEN JPEG DE 1920 X 1080 - MOVIMIENTO SIGNIFICATIVO Y DETALLE INTRAFRAME - CONFIGURACIÓN DE ALTA CALIDAD:

Codificación H.264 basada en software (CPU): 2.6 FPS (11.5 veces más lenta que en tiempo real)

Codificación H.264 basada en hardware (GPU): 6.3 FPS (4.8 veces más lenta que en tiempo real)

CODIFICACIÓN DE VIDEO DE 30 FPS DE ALTA COMPLEJIDAD DESDE UNA SECUENCIA DE IMAGEN DE 640 X 480 JPEG - MOVIMIENTO SIGNIFICATIVO Y DETALLE INTRAFRAME - CONFIGURACIÓN DE ALTA CALIDAD:

Codificación H.264 basada en software (CPU): 18 FPS (1.7 veces más lenta que en tiempo real)

Codificación H.264 basada en hardware (GPU): 38 FPS (1.3 veces MÁS RÁPIDO que en tiempo real)

El script para ayudar a lograr todo esto está en un hilo del foro .

akostadinov
fuente