|
@ -0,0 +1,331 @@ |
|
|
|
|
|
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. |