Eu mesmo encontrei uma solução possível, embora não seja a melhor, porque no Raspberry Pi onde eu quero implementar isso reduz o FPS à metade do valor que a câmera suporta (e menor FPS = mais atraso possível até o próximo vídeo quadro que pode ser extraído como imagem).
Eu uso o ffmpeg para copiar os dados de vídeo do dispositivo de hardware em / dev / video0 para um dispositivo v4l2-loopback em / dev / video1. Desta forma, a câmera permanece ativa porque o ffmpeg está lendo a partir dela em / dev / video0, enquanto eu posso usar outra instância do ffmpeg para extrair imagens de / dev / video1.
Para instalar o v4l2-loopback no Raspbian GNU / Linux 9 (extensão):
- Instale os cabeçalhos do kernel:
apt-get install raspberrypi-kernel-headers
( Re: Como instalar cabeçalhos de kernel )
- Instale o v4l2-loopback:
apt-get install v4l2loopback-dkms
( distribuições do v4l2-loopback )
- Adicionar dispositivo de loopback:
modprobe v4l2loopback
ou com mais dispositivos modprobe v4l2loopback devices=2
( execução de loopback v4l2 )
Para copiar o vídeo de / dev / video0 para / dev / video1:
ffmpeg -f video4linux2 -video_size 1920x1080 -input_format yuyv422 -i /dev/video0 -codec copy -f video4linux2 /dev/video1
Minha câmera suporta os formatos mjpeg e yuyv422, mas somente um formato "raw" pode ser copiado para o dispositivo de loopback, portanto, devo usar o yuyv422. A câmera suporta até 6 qps com yuyv422 e 1920x1080, mas o Raspberry Pi 2 Modelo B só consegue copiar cerca de 3 qps para o dispositivo de loopback.
Agora posso usar o comando que já mencionei na pergunta para extrair as imagens, como JPEG:
ffmpeg -f video4linux2 -video_size 1920x1080 -input_format yuyv422 -i /dev/video1 -f image2 -frames:v 1 -qscale:v 2 pipe:1
Ou como bitmap:
ffmpeg -f video4linux2 -video_size 1920x1080 -input_format yuyv422 -i /dev/video1 -c:v bmp -f image2 -pix_fmt bgr24 -frames:v 1 pipe:1
Com estes comandos a partir do dispositivo de loopback, as imagens não são escuras e demora cerca de 1,3 segundos (JPEG) ou 1,1 segundos (bitmap) para as enviar para a stdout.