Updated : 2019-02-08

Removed "Developer Arrogance" portion. We're here for ideas, not my hurt feelings.

Before Reading

Please be aware this is all based on my experiences with ZoneMinder. Much of this can be seen as just an opinion. Whether it's a good one or not is up to you.

Firstly, Why does ZoneMinder matter to me?

I want to make a world class CCTV platform. One that anyone can use. I scoured the internet for months for a place to start and only finding ZoneMinder as the answer over and over. Even my own brother was suggesting it. After using it and studying the code for 2+ years I was met with frustration. Developer arrogance coupled with poorly written code.

In short I spent a lot of time and energy on something that didn't work and It frustrated me.

MJPEG streams are outdated

With MJPEG you are opening a new stream every time you create an image with an MJPEG url. Even if you remove this element it will continue to eat resources from the server and client. Only way to deal with it currently is through an iframe, popup, or hard refresh.

Shinobi addresses this with Websocket streams. As frames are captured by FFMPEG they are base64 encoded and sent to the client. Shinobi can also output HLS (m3u8), MJPEG (in an iframe), and JPEG (on a timer).

MJPEG streams are limited in many browsers. About 6-8 Streams maximum. Unless you turn off this limitation in the browsers settings, but of course mobile doesn't normally have this option exposed to users.

In Shinobi you don't have to worry about that with Bas64 or JPEG streams you can trick the browser into just letting you do it anyway. Base64 is technically using 1 pipe to the client, the Websocket. While JPEG is just refreshing an image on a timer.

JPEG Storage is awful

Saving each frame as a separate file in JPEG format can have a seriously detrimental effect on storage space and the hardware itself.

Shinobi saves to WebM and MP4 files. While MP4 takes a fair amount of space.. its level of CPU usage during encoding for H.264 streams is just amazing.

Using too many languages

The platform uses Perl, PHP, JavaScript, C++, HTML, CSS, MySQL, and probably more. This makes it difficult to modify the code for other purposes.

Shinobi uses JavaScript, HTML, CSS, and MySQL. Simple right? It should be.

Outdated methods

While connected to the dashboard it will query the database for events every few minutes, continuously getting/counting the same events over and over.

Shinobi uses Websockets to get real-time data about Videos and Events.

For every camera a new process is created every time a viewer opens a stream. 1 Stream = 1 Process. So if you had 1 Camera with 3 Streams open, you would have 3 processes active for each viewer.

Shinobi uses 1 process per camera for all viewers.

Multiple windows and pages for simple things. For example the monitor settings window. It has multiple pages. Even though each page has a fixed set of options, all inputs are present on the page. They are just hidden. If they were going to do that they may as well have made it use JavaScript to show and hide fields appropriately. Rather than send a request to the server on each page change.

Shinobi has it all in one window, which is loaded on dashboard load. The fields are populated based on the camera selection. Even then the camera details are stored in the memory of the client browser to easily load data without an additional request to the server.

As mentioned previously ZoneMinder uses Perl, PHP and C++. These languages are powerful, no doubt. The issue is in their use. C++ will require building of components, which makes updating a pain. PHP is fully synchronous, which makes client operations a pain for you and for the system it runs on.

Shinobi uses JavaScript, this allows users to simply overwrite the older Shinobi files with the new ones, restart the processes and you are updated. Since JavaScript is asynchronous and has the ability to pipe data, we are left with little overhead when it actually comes to the node application itself.

Telemetry (Remote User Tracking)

Quoted from the source code "This script collects usage information of the local system and sends it to the ZoneMinder development team. This data will be used to determine things like who and where our customers are, how big their systems are, the underlying hardware and operating system, etc." - ZoneMinder/scripts/zmtelemetry.pl.in

You can turn this feature off. Although it should have never been made in the first place or at least turned off by default. From a developer standpoint this a great idea but some people may not like their information being logged somewhere to be possibly stolen then used maliciously. Paranoid? perhaps. All that matters is there are a few who don't want it and may not realize it is there. We don't know if other parts of the code are sending other kinds of data. To even wonder is a bother. Shinobi has no such integration and it never will.

The added issue to this being a third party controls this data. The original author is not the one who stores it. Literally anyone can become a core member of the platform tomorrow and leak all the information 10 minutes after that.

Update : It has been changed to off by default on 22/06/2018.
Commit : https://github.com/ZoneMinder/zoneminder/commit/422d2d6dbac0b985dbf01f30251329719379599f

Conclusion

In less than a year Shinobi has more than half the features of ZoneMinder. I'm not special or trained in programming, I learned at home - in my mom's basement. When someone cares about something they will give their time and effort for that. I care about Shinobi, that is why it has progressed so quickly.

Protect what is precious to you as you live long and prosper.

Learn more about Shinobi on the Why page.

See a comparison of features for ZoneMinder to Shinobi.