estrarre un singolo frame da uno stream mjpeg

Se avete una webcam che restituisce in output uno stream mjpeg e avete la necessità di estrarre un solo frame e convertirlo in jpeg questo post vi può essere d’aiuto.

La sola cosa che dovete fare è lanciare questo comando che usa curl e mplayer.

curl -s <stream url> | mplayer  -demuxer +rawvideo -vc +ffmjpeg -fps 2  -rawvideo fps=2:w=640:h=480 -noextbased -vo jpeg -frames 1 -

Verrà creato nella directory corrente un file, “00000001.jpg”, con il frame catturato dalla streaming camera.
Praticamente dico a mplayer di fare il play di stdin (il nome del file è “-“), che viene fornito da curl tramite la pipe “|”, forzandogli la tipologia di codec e demuxer, altrimenti per default lui tenta di capirla dal file di ingresso facendo delle seek.
Gli dico inoltre di produrre file jpeg piuttosto che fare play su video ( -vo jpeg ) e di prendere un solo frame (-frames 1)
Dato che stdin non prevede seek, se non specificassi i parametri con cui è codificato lo stream otterrei questo errore:

Cannot seek backward in linear streams!
Seek failed

Prerequisiti sono curl e mplayer

sudo apt-get install mplayer curl

Riferimenti