ffmpeg se bloquea al intentar grabar vídeo en resoluciones más altas

ffmpeg se bloquea al intentar grabar vídeo en resoluciones más altas

Estoy intentando grabar algunos videos usando una cámara USB, pero tengo algunos problemas al usar ffmpeg.

Si ejecuto ffmpeg -f video4linux2 -t 00:00:10 -i /dev/video0 out.mpg, el programa intenta grabar con una resolución de 640x480 y ffmpegse bloquea.

Sin embargo, si agrego y grabo en resoluciones inferiores a 640x480 (por ejemplo, 320x240), el video se graba correctamente -s.ffmpeg

Después de un bloqueo, si presiono CTRL+C, ffmpeg se reanuda, generando un archivo de 0 kB de tamaño. Usando stracepuedo ver que una ioctlllamada al dispositivo sigue regresando -EINVALy ioctllas posteriores regresan -EAGAIN.

ioctl(3, VIDIOC_G_STD, 0xbe84dfb0)      = -1 EINVAL (Invalid argument)
ioctl(3, VIDIOC_DQBUF, {type=V4L2_BUF_TYPE_VIDEO_CAPTURE}) = -1 EAGAIN (Resource temporarily unavailable)

¿Alguna idea de por qué sucede esto?

Estoy usando ffmpegla versión 2.8.7, construida hasta busyboxla 1.25. La arquitectura del host es un procesador ARM que ejecuta el kernel 3.2.

También intenté compilar la versión más reciente desde la fuente y el problema persiste...

Respuesta1

Descubrí el motivo: transcodificación y volumen de datos sin procesar.

Usando la línea de comando mencionada en mi pregunta, estaba leyendo desde un formato sin formato (yuv422) y transcodificandolo a mpeg-1, que era la codificación predeterminada para mi versión de ffmpeg. La cantidad de datos transmitidos desde la cámara era simplemente demasiado para el procesador, lo que provocó el bloqueo. La cámara que estaba usando también era capaz de transmitir en formato comprimido (mjpeg). Al cambiar a este formato, ffmpegya no se colgaba y era capaz de grabar a 15 fps.

Sin embargo, hubo un paso de transcodificación, de mjpeg a mpeg-1. Pude alcanzar un recuento de fps más alto al decirle ffmpegque copiara la transmisión, eliminando el último paso de transcodificación.

información relacionada