ffmpeg trava ao tentar gravar vídeo em resoluções mais altas

ffmpeg trava ao tentar gravar vídeo em resoluções mais altas

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 ffmpegtrava.

No entanto, se eu adicionar -se ffmpeggravar 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 straceposso ver que uma ioctlchamada para o dispositivo mantém retornos -EINVALe ioctlretornos 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 ffmpega versão 2.8.7, construída até busybox1.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, ffmpegnã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 ffmpegpara copiar o stream, removendo a última etapa de transcodificação.

informação relacionada