Read the statement by Michael Teeuw here.
[MMM-RTSPStream] - Video Streaming from Live Feeds & Security Cameras
-
Description
This module will show a live RTSP video stream and/or periodic snapshots on the Magic Mirror from any IP Security Camera which supports the RTSP protocol and/or can serve a snapshot periodically.
Features:
- Supports single or multiple camera streams/snapshots
- For multiple streams: supports rotating through streams in a single window or displaying multiple windows (with customizeable layout)
- Supports fetching snapshots from a file or url when not actively streaming
- Flexible configurations to limit resource use on Raspberry Pi –
- Stops all streams when module is hidden
- Option for AutoPlay or manual starting of stream
- Plays one or all streams (when displaying multiple)
ffmpegprocess only started when active stream window is shown and customizeable delay for shutdown after stopping.- Note: 3 simultaneous streams on a RaspberryPi 3 is about the limit for usability.
- Support for MMM-KeyBindings module for Play/Pause Remote Control and navigation of multiple streams
Screenshot:

Download:
[card:shbatm/MMM-RTSPStream]
Version 1.2.1 (Updated 15 Oct 2017)
- Now uses hardware-accelerated OMXPlayer as default player for local video
- Resolved latency issues
- Uses PM2 to control stream playback – automatically restarts streams when they close
- Fullscreen, custom window and offset options now available.
- Important - please update your configurations after updating this module. A new configuration tool is available, see the README on GitHub for info.
Version 1.0.0
- Initial Release – Please submit bugs and issues via GitHub Issues
-
@shbatm Thanks a lot for this module! Everything works fine but I have a time difference from 8 seconds between “live” and the video feed. Is there anyway to fix this?
-
Unfortunately, at the moment I don’t have an answer for how to decrease the lag time, but I’m still trying to find better ways to process the feed to the front end. My delay is only 3-4 seconds and has a lot to do with the hardware you’re using to process the stream.
-
@Niggich - There is something I found that you can try. Please let me know if this tweak helps and I’ll roll it into the module.
For any suggested
ffmpegchanges, you’ll need to edit Line 14 (or 15, depending on version) of the following file, whichever has theffmpegargument list:~/MagicMirror/modules/MMM-RTSPStream/node_modules/node-rtsp-stream-es6/src/mpeg1muxer.js- Ignore audio stream: add
"-an",after"mpeg1video",and before"-bf",
As I find more things to try, I’ll post them back on here.
- Ignore audio stream: add
-
@shbatm Hello, I found the time to try this tweak but after I changed everything the Stream doesn’t start.
-
I have some things to try when I get back in town this week. Please make sure you have
hideFfmpegOutput: falsein your stream config section and post any errors. Were you able to get it back working after reverting the changes? -
@shbatm I change back everything and its working again. I also changed my config file to the setting you said. It’s a bit better now. In the Log I doesn’t have any errors.
-
@Niggich Just letting you know that I’m testing an alternate method for displaying the video if you want to test it out. It uses
omxplayerto overlay the video stream directly onto the display, which uses hardware acceleration. It only works on the local display and is still a work in progress, but there is minimum latency since it’s a direct stream.To use, make sure you have
omxplayerinstalled and then switch to the development branch:cd ~/MagicMirror/modules/MMM-RTSPStream git checkout wipAnd update your module config to add:
player: 'omx'(outside of thestreamXconfigs).Future plans include:
- Ability to play full screen
- Show thumbnails on remote screen when playing locally with OMX
- Show ffmpeg stream on remote screen when playing locally with OMX
-
@shbatm Thanks for the different rendering process. It’s still very choppy for me, but it is noticeably better framerate.
Both techniques are maxxing my RasPi’s processor at 100% and I’m getting temperature warnings. But I’m just at the beginning of the process. Let’s see if I can’t cut that down a bit.
-
@bhepler Have you tried the omxplayer method above? This should be using hardware acceleration–on my RPi3 this is using ~10% CPU.
Note: I have updated the development branch to use omxplayer by default for the local screen. You do not need to change anything in your config, just switch to the branch using:
cd ~/MagicMirror/modules/MMM-RTSPStream git checkout wip # Update node modules npm run-script updateSee the updated README here for more details – once tested I’ll update the main branch:
https://github.com/shbatm/MMM-RTSPStream/tree/wip -
@shbatm Whoops. That’s the mistake I made. I switched to the wip branch but didn’t put the
omxflag in there.I’ll try it out tonight. Thanks for the update!
-
Success! I tried the omxplayer version of this module and it works like a charm. The video updates about half a second behind, but that’s well within acceptable limits. The RasPi also is running much cooler and isn’t giving me temperature warnings.
The only problem I have at this point is that the border around the module doesn’t line up with the video. And all things considered, not a big deal. Great work!

-
Great! I’m glad it’s working!
Still trying to find a more robust way for getting the right location for the overlay that doesn’t get messed up by margins and borders.
Starting on line 321 of
MMM-RTSPStream.jstry changing the+47at the end of each line. I’d start with making them 0 and see if that helps:box: { top: rect.top + 47, // Compensate for Margins right: rect.right + 47, // Compensate for Margins bottom: rect.bottom + 47, // Compensate for Margins left: rect.left + 47 // Compensate for Margins }ICYW: The 47 comes from a combo of the body margin, padding and borders on my setup.
-
@shbatm Again, thanks for all the hard work. Here are my findings (all taken from the development branch):
- The video was displaced from the border only on the PI, but not on Chrome nor Firefox whilst viewing the PI’s interface.
- Viewing the interface via Chrome or Firefox did show a video image, but it started up FFMPEG and started to heat the Pi up.
- Removing the 47 pixel offset made everything line up perfectly on the mirror itself.
- Removing the 47 pixel offset made no difference in border position when viewing the Magic Mirror interface via Chrome or Firefox. Everything lined up perfectly.

-
@bhepler Additionally, when I’m running this module, I cannot tell PM2 to restart the MM process. Any attempt to shut down the Magic Mirror and then start it again results in an error claiming that port 8080 is already in use. I have to reboot the Pi in order to get MM running again.
Error message:Whoops! There was an uncaught exception... 0|mm | { Error: listen EADDRINUSE ::: 8080 0|mm | at Object.exports._errnoException (util.js:1022:11) 0|mm | at exports._exceptionWithHostPort (util.js:1045:20) 0|mm | at Server._listen2 (net.js:1262:14) 0|mm | at listen (net.js:1298:10) 0|mm | at Server.listen (net.js:1376:9) 0|mm | at new Server (/home/pi/MagicMirror/js/server.js:26:9) 0|mm | at /home/pi/MagicMirror/js/app.js:219:18 0|mm | at loadNextModule (/home/pi/MagicMirror/js/app.js:168:5) 0|mm | at /home/pi/MagicMirror/js/app.js:163:6 0|mm | at Class.loaded (/home/pi/MagicMirror/modules/node_modules/node_helper/index.js:19:3) 0|mm | code: 'EADDRINUSE', 0|mm | errno: 'EADDRINUSE', 0|mm | syscall: 'listen', 0|mm | address: '::', 0|mm | port: 8080 }Which is weird, because when I shut down MM,
netstat -ldoesn’t show anything listening on port 8080. A before-and-after shows the following two processes started (8027 is the port for my IP camera):tcp 0 0 *:8027 *:* LISTEN tcp6 0 0 [::]:http-alt [::]:* LISTEN -
@bhepler Thank you so much for the feedback and the testing.
The video was displaced from the border only on the PI, but not on Chrome nor Firefox whilst viewing the PI’s interface.
Viewing the interface via Chrome or Firefox did show a video image, but it started up FFMPEG and started to heat the Pi up.
Removing the 47 pixel offset made no difference in border position when viewing the Magic Mirror interface via Chrome or Firefox. Everything lined up perfectly.– This is to be expected. OMXPlayer draws the video on top of the Pi’s screen (over the desktop & electron.js running the mirror). It can only do that on the Pi itself, so if you view it in another browser, the module defaults back to FFMPEG and software decoding.
Removing the 47 pixel offset made everything line up perfectly on the mirror itself.
Good – I will continue looking for a way to improve how the module “finds” the border box to give to OMX. For now this offset may just get moved into a config setting.
when I’m running this module, I cannot tell PM2 to restart the MM process. Any attempt to shut down the Magic Mirror and then start it again results in an error claiming that port 8080 is already in use. I have to reboot the Pi in order to get MM running again.
I noticed this on my system too, but didn’t associate it back to this module. Thanks for pointing it out. Something is not getting cleaned up properly. I am able to restart MM without restarting the whole Pi by killing the
electronprocess manually (e.g.pkill electronorps aux | grep electronand thenkill {pid}on the process number that comes up. I will work on a fix for this in the next update.Additional Development Notes:
- Still working on finding a better solution to using FFMPEG to decode and then re-transmit the stream. With Chrome/Firefox removing support for NPAPI plug-ins, it’s very restricting for RTSP. If anyone has any suggestions, I’m open to them.
-
Thanks !!! Works great with all my Dahua ip cam
but i don’t know why but i think when my motion sensor put in sleep my mirror my cam disconnect why ? -
Great module. Allows my family to see the front door as they walk to answer it.
I am trying to use multiple streams so it shows the camera on my driveway and front door side by side. The layout is setup but, it duplicates the camera feed listed under stream1.
What is the reason why it is not seeing the second stream?
I’ve validated my RSP 3 can see both rtsp streams. In fact, if I swap the ip addresses my MM still shows just the first one listed.
Here is the code I am using.
{ module: 'MMM-RTSPStream', position: 'bottom_center', config: { autoStart: true, rotateStreams: false, rotateStreamTimeout: 10, showSnapWhenPaused: false, moduleWidth: 704, moduleHeight: 240, localPlayer: 'omxplayer', stream1: { name: 'Front Door', url: 'rtsp://xxxxx:xxxxx@192.168.1.164:554/Streaming/Channels/102/', snapshotUrl: '', snapshotRefresh: 10, // Seconds frameRate: "30", port: 9999, width: "320", height: "240", }, stream2: { name: 'Front Door', url: 'rtsp://xxxxx:xxxxx@192.168.1.163:554/Streaming/Channels/102/', snapshotUrl: '', snapshotRefresh: 10, // Seconds frameRate: "30", port: 9999, width: "320", height: "240", } } },Here is the result:

-
@imdickie I’d be happy to take a look. First thing to try: change the
nameproperty of the second stream so it is different from the first one and see if that fixes it. In your config above, both arename: 'Front Door' -
@shbatm Thanks for the quick response. I changed them both to the correct names. Same result though, one stream in both windows.
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login