
Estou tentando gravar alguns vídeos usando uma câmera USB, mas estou tendo alguns problemas ao usar o ffmpeg
.
Se eu executar ffmpeg -f video4linux2 -t 00:00:10 -i /dev/video0 out.mpg
, o programa tenta gravar na resolução 640x480 e ffmpeg
trava.
No entanto, se eu adicionar -s
e ffmpeg
gravar em resoluções inferiores a 640x480 (por exemplo, 320x240), o vídeo será gravado com sucesso.
Depois de um travamento, se eu acertar CTRL+C
, o ffmpeg será retomado, gerando um arquivo de 0 kB de tamanho. Usando strace
posso ver que uma ioctl
chamada para o dispositivo mantém retornos -EINVAL
e ioctl
retornos subsequentes -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)
Alguma idéia de por que isso acontece?
Estou usando ffmpeg
a versão 2.8.7, construída até busybox
1.25. A arquitetura host é um processador ARM executando o kernel 3.2.
Também tentei compilar a versão mais recente do código-fonte e o problema persiste...
Responder1
Descobri o motivo: transcodificação e volume de dados brutos.
Usando a linha de comando mencionada na minha pergunta, eu estava lendo um formato bruto (yuv422) e transcodificando-o para mpeg-1, que era a codificação padrão para minha versão do ffmpeg
. A quantidade de dados transmitida da câmera era simplesmente demais para o processador, causando travamento. A câmera que eu estava usando também era capaz de transmitir em formato compactado (mjpeg). Ao mudar para este formato, ffmpeg
não travou mais e foi capaz de gravar a 15 fps.
Porém, houve uma etapa de transcodificação, de mjpeg para mpeg-1. Consegui atingir uma contagem de fps mais alta dizendo ffmpeg
para copiar o stream, removendo a última etapa de transcodificação.