Objective: To install ZM on an rpi3 with mmal support and verify it's using mmal. Evaluate.
|
|
|
|
|
|
Preface:
|
|
|
|
I tried before to install Devuan directly from IMG provided, and then build ffmpeg with mmal included.
|
|
I don't think was necessary as we are not compiling ffmpeg, but instead using libavcodec (I know this now, but
|
|
didn't at the time).
|
|
|
|
In any case, if you want ZM to have mmal working you must have the libavcodec development headers that include mmal
|
|
and you can confirm it by switching debug logging on zmc_m1 (if 1 is your test camera)
|
|
But let's cover install steps.
|
|
|
|
The goal is to:
|
|
install raspbian stretch lite
|
|
update
|
|
install ffmpeg, verify mmal is included
|
|
|
|
if it does, then install git of zm
|
|
|
|
compile zm, from a more recent branch that includes the Hardware peripheral calls (HWACCEL)
|
|
|
|
migrate to devuan (this ended up being required for my setup, as the docker entrypoint.sh doesn't run with zmsystemctl)
|
|
|
|
|
|
it's important to migrate to devuan after installing ffmpeg, as i think the raspbian mirrors are supposed
|
|
to have support for mmal in ffmpeg but the devuan mirrors may not. Devuan pulls from debian, not Raspbian.
|
|
|
|
Don't bother trying to custom compile ffmpeg, as I mentioned before, you need libavcodec, not ffmpeg.
|
|
|
|
|
|
OK, now to install ZM from git...
|
|
|
|
git clone https://github.com/zoneminder/zoneminder.git
|
|
|
|
also this dockerfile has instructions for building a
|
|
ubuntu
|
|
img. That might work...
|
|
https://github.com/ZoneMinder/zmdockerfiles/blob/master/development/ubuntu/xenial/Dockerfile
|
|
|
|
the only changes we will make is:
|
|
remove libjpeg-turbo8
|
|
remove libjpeg-turbo8-dev
|
|
remove libmysqlclient-dev
|
|
remove libmime-perl
|
|
from list
|
|
|
|
as they are named differently. We'll add them back in later.
|
|
|
|
also removing the no depends...
|
|
so
|
|
|
|
|
|
|
|
apt-get update
|
|
apt-get dist-upgrade
|
|
then
|
|
|
|
the command I'll run (similar to docker file)
|
|
is
|
|
|
|
apt-get install -y \
|
|
apache2 \
|
|
build-essential \
|
|
cmake \
|
|
dh-autoreconf \
|
|
dpatch \
|
|
git \
|
|
libapache2-mod-php \
|
|
libarchive-zip-perl \
|
|
libavcodec-dev \
|
|
libavdevice-dev \
|
|
libavfilter-dev \
|
|
libavformat-dev \
|
|
libavresample-dev \
|
|
libav-tools \
|
|
libavutil-dev \
|
|
libbz2-dev \
|
|
libcurl4-gnutls-dev \
|
|
libdate-manip-perl \
|
|
libdbd-mysql-perl \
|
|
libdbi-perl \
|
|
libdevice-serialport-perl \
|
|
libgcrypt-dev \
|
|
libgnutls-openssl-dev \
|
|
libmime-lite-perl \
|
|
libmp4v2-dev \
|
|
libnet-sftp-foreign-perl \
|
|
libnetpbm10-dev \
|
|
libpcre3 \
|
|
libpcre3-dev \
|
|
libpolkit-gobject-1-dev \
|
|
libpostproc-dev \
|
|
libssl-dev \
|
|
libswscale-dev \
|
|
libsys-cpu-perl \
|
|
libsys-meminfo-perl \
|
|
libsys-mmap-perl \
|
|
libtheora-dev \
|
|
libtool \
|
|
libv4l-dev \
|
|
libvlc5 \
|
|
libvlccore8 \
|
|
libvlccore-dev \
|
|
libvlc-dev \
|
|
libvorbis-dev \
|
|
libvpx-dev \
|
|
libwww-perl \
|
|
libx264-dev \
|
|
mysql-client \
|
|
mysql-server \
|
|
php \
|
|
php-cli \
|
|
php-gd \
|
|
php-mysql \
|
|
ssmtp \
|
|
software-properties-common \
|
|
vlc-data \
|
|
yasm \
|
|
zip
|
|
|
|
|
|
|
|
hopefully that finishes without any errors.
|
|
I had dpkg stall halfway through, but that was because I forgot to resize the fs when originally using the Devuan img.
|
|
With the raspbian img, I think it might auto resize the FS.
|
|
I reinstalled at that point. easy enough.
|
|
and it went through without error.
|
|
|
|
The four libraries we had to remove
|
|
we will now add back in
|
|
|
|
libturbojpeg0 - TurboJPEG runtime library - SIMD optimized
|
|
libturbojpeg0-dev - Development files for the TurboJPEG library
|
|
default-libmysqlclient-dev - MySQL database development files (metapackage)
|
|
libmariadbclient-dev-compat - MariaDB database development files (libmysqlclient compatibility)
|
|
|
|
libmime-base32-perl - Base32 encoder/decoder
|
|
libmime-base64-urlsafe-perl - Perl version of Python's URL-safe base64 codec
|
|
libmime-charset-perl - module for MIME character set information
|
|
libmime-encwords-perl - Perl interface to deal with RFC 2047 encoded words
|
|
libmime-explode-perl - Perl extension to explode MIME messages
|
|
libmime-lite-html-perl - Transform HTML page into MIME email
|
|
libmime-lite-perl - module for convenient MIME message creation
|
|
libmime-lite-tt-html-perl - module to create HTML mail with MIME::Lite and T
|
|
T
|
|
libmime-lite-tt-perl - module to generate MIME messages from Template Toolki
|
|
t templates
|
|
libmime-tools-perl - Perl5 modules for MIME-compliant messages
|
|
libmime-types-perl - Perl extension for determining MIME types and Transfer
|
|
Encoding
|
|
libemail-mime-perl
|
|
|
|
|
|
probably a few extra here we don't need, but regardless...
|
|
|
|
so
|
|
|
|
apt-get install libturbojpeg0 libturbojpeg0-dev default-libmysqlclient-dev \
|
|
libmariadbclient-dev-compat libmime-base32-perl libmime-base64-urlsafe-perl \
|
|
libmime-charset-perl libmime-encwords-perl libmime-explode-perl libmime-lite-html-perl \
|
|
libmime-lite-perl libmime-lite-tt-html-perl libmime-lite-tt-perl libmime-tools-perl \
|
|
libmime-types-perl libemail-mime-perl
|
|
|
|
|
|
then follow the docker guide:
|
|
git clone --recursive https://github.com/ZoneMinder/ZoneMinder
|
|
cd ZoneMinder
|
|
|
|
If you want a certain tagged or commit of ZM now's the time to git checkout
|
|
e.g. I am doing
|
|
git checkout f07b1105d33c088cce4130970ee2f776867f67d0
|
|
just so I'm always using the same commit.
|
|
|
|
then
|
|
|
|
cmake .
|
|
|
|
this comes up with a jpeg error...
|
|
|
|
that is explained here:
|
|
in CMakeLists.txt
|
|
//
|
|
# jpeg
|
|
find_package(JPEG)
|
|
if(JPEG_FOUND)
|
|
set(HAVE_LIBJPEG 1)
|
|
list(APPEND ZM_BIN_LIBS "${JPEG_LIBRARIES}")
|
|
#link_directories(${JPEG_LIBRARY})
|
|
include_directories("${JPEG_INCLUDE_DIR}")
|
|
set(CMAKE_REQUIRED_INCLUDES "${JPEG_INCLUDE_DIR}")
|
|
check_include_files("stdio.h;jpeglib.h" HAVE_JPEGLIB_H)
|
|
if(NOT HAVE_JPEGLIB_H)
|
|
message(FATAL_ERROR
|
|
"ZoneMinder requires libjpeg headers - check that libjpeg development
|
|
packages are installed")
|
|
endif(NOT HAVE_JPEGLIB_H)
|
|
else(JPEG_FOUND)
|
|
message(FATAL_ERROR
|
|
"ZoneMinder requires jpeg but it was not found on your system")
|
|
endif(JPEG_FOUND)
|
|
|
|
//
|
|
/usr/lib/aarch64-linux-gnu/
|
|
|
|
|
|
|
|
|
|
|
|
so do this.
|
|
|
|
apt-get install libjpeg-dev libjpeg62-turbo-dev libjpeg62-turbo libjpeg-turbo-progs
|
|
|
|
|
|
one of those will handle jpeg
|
|
|
|
NOTE: we might be losing turbo jpeg support, with libjpeg, so beware this is not
|
|
optimized for MJPEG... I only plan to use this for RTSP H264 streams, (whole point of this)
|
|
so your needs may vary.
|
|
|
|
# Configure ZoneMinder
|
|
RUN cmake .
|
|
|
|
# Build & install ZoneMinder
|
|
RUN make && make install
|
|
|
|
# ensure writable folders
|
|
RUN ./zmlinkcontent.sh
|
|
|
|
this all worked, no problem. Devuan ascii.
|
|
|
|
I skipped the volumes part, as we are not using docker.
|
|
|
|
service mysql stop && service apache2 stop
|
|
|
|
|
|
# Configure Apache
|
|
cp misc/apache.conf /etc/apache2/sites-available/000-default.conf
|
|
echo "ServerName localhost" > /etc/apache2/conf-available/servername.conf && a2enconf -q
|
|
servername
|
|
a2enmod -q cgi && a2enmod -q rewrite
|
|
|
|
|
|
This came up with an error for rewite..
|
|
//
|
|
AH00526: Syntax error on line 62 of /etc/apache2/sites-enabled/000-default.conf:
|
|
Invalid command 'RewriteEngine', perhaps misspelled or defined by a module not included in
|
|
the server configuration
|
|
//
|
|
|
|
It can be ignored, as we hadn't enabled module rewrite when that loaded.
|
|
|
|
echo "sql_mode=NO_ENGINE_SUBSTITUTION" >> /etc/mysql/mysql.conf.d/mysqld.cnf
|
|
|
|
|
|
this fails, but you can change /etc/mysql/mysql.conf.d/mysqld.cnf
|
|
to
|
|
/etc/mysql/my.cnf
|
|
|
|
|
|
We have ZM, but not init scripts.
|
|
Since we are testing, here. Let's just use the dockerfile's entrypoint.sh
|
|
That works just as well, as an init script.
|
|
wget https://raw.githubusercontent.com/ZoneMinder/zmdockerfiles/master/utils/entrypoint.sh
|
|
|
|
root@devuan:~# mv entrypoint.sh /usr/local/bin/.
|
|
root@devuan:~# chmod 755 /usr/local/bin/entrypoint.sh
|
|
root@devuan:~#
|
|
|
|
|
|
|
|
now run
|
|
/usr/local/bin/entrypoint.sh
|
|
I sometimes run it in a screen session
|
|
apt-get install screen
|
|
# screen
|
|
type
|
|
ctrl-a :sessionname entrypoint
|
|
ctrl-d to disconnect
|
|
|
|
|
|
root@devuan:~# /usr/local/bin/entrypoint.sh
|
|
|
|
mysql: unknown variable 'sql_mode=NO_ENGINE_SUBSTITUTION'
|
|
* Removing stale lock file
|
|
* Starting MySQL database server service ...done.
|
|
* Warning: Mysql startup timer expired!
|
|
mysql: unknown variable 'sql_mode=NO_ENGINE_SUBSTITUTION'
|
|
* First run of mysql in the container, creating ZoneMinder dB.
|
|
mysql: unknown variable 'sql_mode=NO_ENGINE_SUBSTITUTION'
|
|
* Starting Apache http web server service ...done.
|
|
* Starting ZoneMinder video surveillance recorder ...failed!
|
|
|
|
|
|
//
|
|
|
|
this fails, but we are close.
|
|
|
|
The error I had made before was accidentally following the docker exactly.
|
|
It added the 'sql_mode=NO_ENGINE_SUBSTITUTION' to my.cnf
|
|
and my.cnf didn't understand it.
|
|
|
|
So simply comment that out, if you added that by accident.
|
|
|
|
when you run entrypoint you should see
|
|
|
|
root@devuan:~# /usr/local/bin/entrypoint.sh
|
|
|
|
* Removing stale lock file
|
|
* MySQL database server already running.
|
|
* First run of mysql in the container, creating ZoneMinder dB.
|
|
* Starting Apache http web server service ...done.
|
|
* Starting ZoneMinder video surveillance recorder ...done.
|
|
|
|
And that tells us everything is working.
|
|
If you go to ZM at the IP address, you should see it "Running". If you see it stopped, and you still have
|
|
raspbian... read below.
|
|
|
|
|
|
NOW, one problem I had is that when I was testing this is raspbian, it tried to call zmsystemctl
|
|
which failed to actually run ZM.
|
|
|
|
At this point I migrated to Devuan, following the dev1fanboy ascii migration guide (this is what I did)
|
|
* add devuan repos to apt/sources
|
|
* apt-get install sysvinit-core
|
|
* make sure /etc/inittab is there and has init data
|
|
* reboot
|
|
|
|
And then running the entrypoint.sh didn't try to call zmsystemctl, and it worked.
|
|
|
|
Now follow the next guide for details about my testing with mmal and a camera.
|