Snapshot Proxy for mjpg_streamer



I wrote this script, because the usb webcam I was using with Octoprint / mjpg_streamer was inserting some garbage bytes in the mjpg video stream after some of the frames, and this was preventing Octoprint from generating proper timelapses – the snapshots with the garbage data were ignored by ffmpeg, although some other programs were able to read those jpeg files just fine.

So, I decided to write a simple proxy script in python, that reads the snapshot from mjpg_streamer, processes it via imagemagick (and thus producing healthy jpeg), and serves it back to the user.
The script itself acts as a standalone http server listening on port 8083.

How to use it:

  • Download, unzip, and save the script as /home/pi/snapshot.py
  • Edit these parameters:
    MJS_AUTH_USER = "the user for your mjpg_streamer stream"
    MJS_AUTH_PASS = "the password for your mjpg_streamer stream"
    MJS_SNAPSHOT_ADDRESS = "the mjpg_streamer snapshot url"
    AUTH_USER = "the user for accessing this snapshot"
    AUTH_PASS = "the password for accessing this snapshot" 
    PORT_NUMBER = 8083

    You don’t have to change the port number.

  • To confirm it’s working, start mjpg_streamer (if not already started), and execute this:
    python /home/pi/snapshot.py
  • Now load http://your-octoprint-address:8083
  • You should be asked for username/pass – just enter the same you used for AUTH_USER/AUTH_PASS. You should see the snapshot afterwards
  • You will want this script running always. So, just add this to your /etc/rc.local file, on the line before the “exit 0” command:
    (python /home/pi/snapshot.py)&

    You can edit the file by executing

    sudo nano /etc/rc.local

    Make your changes, and press Ctrl+O, Enter, and Ctrl+X to save & exit. And done. Reboot your Pi, and update the snapshot url in octoprint to http://AUTH_USER:AUTH_PASS@your_octoprint_address:8083

  • If you followed the steps correctly, you should be able to get healthy jpg snapshots from now on.

 

 

Leave a comment...