Show HN: MaryJane – Mjpeg server in 30 lines of async Python
github.com
github.com
Here is a demo: http://18.116.60.15:8080/maryjane/
Here's the 30 lines of Python: https://raw.githubusercontent.com/bootrino/maryjane/master/m...
Here is the github: https://github.com/bootrino/maryjane
Browsers are able to display images such as PNG, JPG and GIF.
A less known capability of browsers is to display a stream of JPG images. This is called MJPEG (motion JPEG).
All you need to do is specify the MPJEG server address in an image tag and it just works.
It's written in less than 30 lines of async Python.
This project is MIT licensed.
Also, streaming protocols tend to have a number of seconds latency, which for certain types of applications isn't acceptable. That's when mjpeg might do the job because it just instantly starts blasting frames down the tubes.
In this case you might run into issues there. This demo is all on TCP which means head of line blocking. That's why you typically see MJPEG wrapped in rtp rather than http.
Even still though, latency can't be that bad for video formats with actual temporal compression in low latency mode. I'm not an expert in this area, but WebRTC is widely supported, uses vp9. When i do video conferencing with people the latency is pretty low, so this must be a solved problem.
I wrote this in Tornado a bunch of years ago. Where do you go next? What else could you do?
To do this you'd have a bunch of video files at the back end, specify which one you want in the URL, then get Python to run ffmpeg, extracting jpeg frames from the specified video and writing the frames to the ramdrive /dev/shm. As the user rolls the mouse over, some JavaScript changes the img tag to point to the mjpeg server and the video plays.
It should be possible to do this in only four or five extra lines I think.
See the github readme for the correct ffmpeg command line to do this.
I do wonder if there's a way to stream audio in sync.
https://github.com/LeipeLeon/destaat
sadly (but understandable) ffserver has been removed from ffmpeg on 2018-01-06.
i've made it public, no need to keep it a secret :P
Would you mind please helping me understand what this means, in detail?
I'm pretty sure there's no clock synchronisation anywhere.
That's my tired understanding, anyway.
It might be a good idea to insert a inotify immediately before the file read. You'd still need the timing code though.
f_rate = frame rate = 30 fps (for example)
f_period = 1/f_rate = 1/30 = 33ms
imagine the server serves every f_period, and the image gets updated on the ramdisk every f_period + delta where delta = f_period/16 because the clock from the image updater is not synchronized with the server and is a little slower (by some idealized fixed amount).
in this case, every 16 frames, the image updater would advance past the server, and the server would serve a duplicate frame.
in practice, delta is often not fixed, and can be positive or negative and instead is described with a distribution called jitter. both the server and the image updater have jitter, so duplicate/dropped frames will occur as they leap ahead and behind each other with the +/- jitters for each unsynchronized clock getting added to their respective periods for each frame. (this is, of course, assuming they're running at the same rate, which they often do not- which is why ultimately you want one to be the primary clock and the other to be driven by it)
In this case, for my personal needs, I'm OK with this happening - my requirement is not for highly accurate frame timing.
Other people might however, in which case your advice should be taken into accoujnt.
(I did a version of this in bash with netcat, and here-documents for the mime parts, which is where I ran into the problem. https://underjord.io/live-server-push-without-js.html was the inspiration for the display-screen case...)
What are the curly braces around the URL in <a>'s href attribute? Is there a spec for it?