
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 ffmpeg
se 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 strace
puedo ver que una ioctl
llamada al dispositivo sigue regresando -EINVAL
y ioctl
las 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 ffmpeg
la versión 2.8.7, construida hasta busybox
la 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, ffmpeg
ya 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 ffmpeg
que copiara la transmisión, eliminando el último paso de transcodificación.