Después de configurar una cámara con zoneminder, y montar un servidor de vigilancia propio, surgen algunos inconvenientes en su uso, los cuales coloco aquí su resolución.

Zoneminder se acaba el espacio libre de mi disco duro.


Una vez que comienzas a grabar, te vas dando que el espacio libre se va a agotando, y es que zoneminder se instala en raiz ( / ), y no hay una configuración donde puedas indicar que se guarden los eventos en otra ruta.

La documentación oficial sugiere que se detenga zoneminder, se mueva la carpeta a la partición donde quieras que radique, y crees un enlace simbólico… pero muchas veces, zoneminder ya no puede grabar debido a un error.

can’t symlink ‘1’ to ‘monitor-1’ permission denied

Por más que se compongan los permisos, la grabación se detiene debido a ese error que puede apreciarse en el log.

¿Para que mover y crear un enlace simbólico, si puedes montar y desmontar cuando quieras?

Tan simple como eso. Puedes montar la carpeta de eventos a una carpeta en otra partición, y desmontarla cuando lo necesites.

Suponiendo que tu carpeta de eventos está en la ruta normal.
/usr/share/zoneminder/events

Y colocando como ejemplo la ruta a donde quieres que resida.
/home/angelos/zoneminder/events

Entonces ejecutarías el siguiente comando:
# mount –bind /home/angelos/zoneminder/events /usr/share/zoneminder/events/

Con ello indicas que la carpeta events que está en una partición con mucho mas espacio, se monte en la carpeta de zoneminder dentro de raiz, con lo cual dejarás de tener problemas con los permisos.

Y si quieres que en cada reinicio lo haga en automático, entonces agrega a tu archivo fstab
/home/angelos/zoneminder/events         /usr/share/zoneminder/events    none    bind    0       0



No puedo exportar todos los eventos a video


Éste si que es un gran problema, si quieres tener una videoteca de todo lo grabado por tus cámaras, es desesperante tener que revisar evento por evento y generar un video del mismo, además de descargarlo y tener hasta cientos de videos de un sólo día. El filtro de generación automático de video por búsqueda de determindo día, sólo nos muestra la lista de eventos y nosotros debemos generar los videos.

Para resolver dicho incoveniente, escribí un script que nos hace todo este trabajo y aún mas.

Dicho script se ejecuta indicando como parámetro el nombre de la cámara, y la fecha que quieres generar el video.

Entonces el script genera los videos de todos los eventos de tal día, y después los une en un solo video, por lo cual si tienes cientos de eventos en un sólo día, al final, obtienes un sólo video con el nombre de la cámara y la fecha, con el formato avi.

#!/bin/bash

CAMARA=$1
DIA=$2
DIAN=$( echo “$DIA” | sed -r ‘s/[/]+/_/g’)

DIRZM=”/usr/share/zoneminder/events” #RUTA DE LOS EVENTOS DE ZONEMINDER
DIRVD=”/home/angelos/Downloads” #RUTA A DONDE VAS A GUARDAR EL VIDEO

DI=”$DIRZM/$CAMARA/$DIA”

cd $DI

find . -maxdepth 3 -mindepth 1 -type d -exec sh -c ‘(
cd {} && 
SD=$(echo ‘{}’ | sed -r ‘s/[/.]+/_/g’) && 
mkdir -p ‘$DIRVD’/’$CAMARA’/’$DIAN’ &&
avconv -r 20 -f image2 -i %03d-capture.jpg ‘$DIRVD’/’$CAMARA’/’$DIAN’/’$CAMARA’-‘$DIAN’-$SD-TMP.avi)’ {} ; | sort

cd $DIRVD/$CAMARA/$DIAN
mencoder -oac copy -ovc copy -idx -o ../”$CAMARA”-“$DIAN”.avi *.avi
rm *-TMP.avi
cd ..
rm -r $DIAN

Se ejecuta, como ya mencioné, indicando la cámara y la fecha, por ejemplo:
sh video.sh AngelosGames 2014/01/19
Y después de un rato, tendrás en la carpeta donde quieras guardar los videos, en éste ejemplo /home/angelos/Donwloads; dentro, la carpeta de la cámara, en el ejemplo “AngelosGames”; un video con todo lo grabado en ese día.
Con esto ya puedes eliminar cuando gustes, los eventos de dicho día en zoneminder, recuperar espacio de disco, y grabar a CD o DVD tus videos y tener tu videoteca con todo lo que ocurre en tu cas o negocio.

angelinux

Desarrollador de páginas web desde el año 2000 y con experiencia en programación de sistemas para empresas desde el 2008; cofundador de CONSoluciones; autor del blog de software libre “Angelinux-slack”; docente en maestría en UPAV y fundador de la distribución Linux Falco que está en desarrollo para la Universidad Veracruzana. Además, ponente, organizador de congreso, laborista social, impartidor de cursos de programación y servidores Linux, webmaster, y ex invitado en programa de televisión.

59 Comments

Maria · 23 febrero, 2015 a las 00:23

Me ha resultado muy útil esta entrada en tu blog, te felicito por el buen trabajo que has hecho.

Para ejecutar el script, tengo que instalar algún paquete para ejecutar mencoder, avconv u otro paquete adicional? el servidor esta bajo la plataforma de fedora.

Muchas gracias..

angelinux · 23 febrero, 2015 a las 00:56

Buen día.

Muchas gracias.
Para ejecutar el script necesitas mencoder y ffmpeg.

Saludos.

Oscar Garcia · 8 junio, 2015 a las 16:38

Hola angelinux soy nuevo en esto y quiero aplicar lo de tu script, pero no se donde se guarda el script y como lo corro, lo guarde en bin y lo nombre camara.sh y lo corro desde consola con ./camara.sh pero me da error

    angelinux · 8 junio, 2015 a las 19:38

    Buen día.

    No deberías tener problema para ejecutar el script desde el lugar que quieras, siempre y cuando tengas las aplicaciones instaladas, los permisos para ejecutarlo y los parámetros correctos.
    Las aplicaciones son las que se marcan en el post. Los permisos, si es desde tu /home entonces no necesitas permisos especiales, mas que sea ejecutable ($ chmod +x ./camara.sh) y si está fuera de /home entonces ejecutarlo con sudo.

    ¿Que error te marca? De ahí podemos partir para ver por qué no funciona.

    Saludos.

      Oscar Garcia · 9 junio, 2015 a las 10:23

      lo corro desde “/bin con este comando #sh camara.sh SOPORTE 15/06/08
      y da este error

      [email protected]:/home# sh camara.sh SOPORTE 15/06/08
      sed: -e expresión #1, carácter 1: orden desconocida: `’
      camara.sh: 16: cd: can’t cd to /usr/share/zoneminder/events/SOPORTE/15/06/08
      camara.sh: 18: camara.sh: Syntax error: “(” unexpected
      [email protected]:/home#

      si lo corros con #su camara.sh SOPORTE 15/06/08
      da este error

      [email protected]:/home# su camara.sh SOPORTE 15/06/08
      No passwd entry for user ‘camara.sh’
      [email protected]:/home#

        angelinux · 9 junio, 2015 a las 17:05

        Por el error, al parecer tienes instalado zoneminder en otra ruta ¿puedes indicarme la ruta de instalación? Si ese fuera el caso, solo debes colocar la ruta correcta en el script.

        Con lo segundo, no puedes correrlo como su camara.sh, porque instas indicando que quieres cambiarte de usuario al usuario camara.sh, lo correcto sería
        $ sudo camara.sh SOPORTE 15/06/08

        Saludos.

          angelinux · 9 junio, 2015 a las 17:53

          ¿Y tu carpeta de eventos está en /var/cache/zoneminder/events como lo acabas de poner?
          Ya que el error marca que no encuentra la carpeta
          /usr/share/zoneminder/events/

          Saludos

        angelinux · 9 junio, 2015 a las 17:10

        Espera, acabo de ver que estás enviando la fecha con formato incorrecto.
        Zoneminde lo maneja como AAAA/MM/DD y lo estás mandando como AA/MM/DD

        En lugar de
        sh camara.sh SOPORTE 15/06/08

        ejecuta
        sh camara.sh SOPORTE 2015/06/08

        Saludos.

          Oscar Garcia · 9 junio, 2015 a las 17:48

          el zoneminder esta en usr/share/zoneminder en esa ruta apare todo, los css, js y otros, con respecto a la fecha si le doy el formato de año AAAA no me encuentra nada porque en events donde estan las camaras agregadas lo pone como 15.
          Ej.
          /var/cache/zoneminder/events/2/15, donde el 2 es el enlace simbolico de SOPORTE y el 15 el año, dentro de 15 estan los meses y luego los dias, /15/06/08 que fue ayer.

          con respecto a lo de su camara.sh, solo fue una prueba que hice pero al darle sh camara.sh y lo demas me da el error que te puse arriba.

          tengo zoneminder 1.25.0, no se cual sera el error.

          tengo un servidor de respaldos con debian wheezy y corro los script con ./respaldo.sh por decir algo, pero si lo hago asi s}con las camaras me da el mismo error. pero seguire intentando gracias por tu ayuda, esperare talvez encuentras algo que me pueda ayudar.

          Una consulta mas tengo agregadas 15 camaras y al darle camara multiple solo me muestra 5 las demas me las muestra en blanco, no se que sera. algun skin para zoneminder1.25.0 en debian wheezy.

Diego · 10 junio, 2015 a las 00:17

hola: soy Diego, mira a mi me tira este error después del tipiar el comando

# sh creacion.sh Monitor-1 2015/06/10
————————————————————————————————————

built on Mar 16 2015 13:37:34 with gcc 4.8 (Ubuntu/Linaro 4.8.2-19ubuntu1)
%03d-capture.jpg: No such file or directory

MEncoder 1.1-4.8 (C) 2000-2012 MPlayer Team
File not found: ‘*.avi’
Failed to open *.avi.
Cannot open file/device.

Exiting…
rm: cannot remove â*-TMP.aviâ: No such file or directory

—————————————————————————————————————-

¿que podrá ser?

    angelinux · 10 junio, 2015 a las 09:50

    Buen día Diego.

    ¿Puedes verificar que exista la carpeta /usr/share/zoneminder/events/

    Y que dentro exista la carpeta Monitor-1
    Y dentro la carpeta 15, dentro 06 y dentro 10?

    Los parámetros para el script son la ruta formada por el nombre de la cámara, y por la fecha que se desea generar el video.

    Saludos.

DiegoRojas · 10 junio, 2015 a las 11:48

buen día,

Si entiendo, si existe!!, te mostrare le script, pero antes, quiero preguntarte sobre ¿Qué parte del script no edita aparte de las direcciones?

se edita los parámetros de CAMARA =$1???

___________________________________
#!/bin/bash

CAMARA=$1 <— ese de allí y todos los demás?
DIA=$2
DIAN=$( echo “$DIA” | sed -r ‘s/[/]+/_/g’)
____________________________________

ahora te dejo mi script… un poco cambiado…

mi cámara de zoneminder se llama ahora "PORTON"

________________________________________
________________________________________

#!/bin/bash

PORTON=$1
DIA=$2
DIAN=$( echo "$DIA" | sed -r 's/[/]+/_/g')

DIRZM="/usr/share/zoneminder/events/PORTON" #RUTA DE LOS EVENTOS DE ZONEMINDER
DIRVD="/var/www/html/owncloud/data/videos-casarojas/files" #RUTA A DONDE VAS A GUARDAR EL VIDEO

DI="$DIRZM/$PORTON/$DIA"

cd $DI

find . -maxdepth 3 -mindepth 1 -type d -exec sh -c '(
cd {} &&
SD=$(echo '{}' | sed -r 's/[/.]+/_/g') &&
mkdir -p '$DIRVD'/'PORTON'/'$DIAN' &&
avconv -r 20 -f image2 -i %03d-capture.jpg '$DIRVD'/'$PORTON'/'$DIAN'/'$PORTON'-'$DIAN'-$SD-TMP.avi)' {} \; | sort

cd $DIRVD/$PORTON/$DIAN
mencoder -oac copy -ovc copy -idx -o ../"$PORTON"-"$DIAN".avi *.avi
rm *-TMP.avi
cd ..
rm -r $DIAN
_____________________________________________________
_____________________________________________________

bueno en este caso el comando para ejec… seria "sh creacion.sh PORTON 2015/06/10"

gracias desde ante mano =)

    Diego Rojas · 10 junio, 2015 a las 12:43

    espera mira ahora me funciono!!! pero especificando las carpetas que crea zm , “/usr/share/zoneminder/events/PORTON/15/06/10/”

    pero mm yo crep que esas carpetas varian según la fecha el mes y el año 😛

      angelinux · 10 junio, 2015 a las 14:40

      ¿Qué versión de zoneminder tienes?

      Al parecer tu versión utiliza el año en dos dígitos, mientras que en la que tenía yo era de 4.
      Entonces con colocar los parámetros del año en dos dígitos, debería correr bien el script.

      Saludos.

    angelinux · 10 junio, 2015 a las 14:43

    En esta parte
    mkdir -p ‘$DIRVD’/’PORTON’/’$DIAN’ &&

    No utilizas la variable de la cámara ($PORTON), sino la cadena “PORTON”, lo que genenaría problemas.

    Saludos.

      diego · 10 junio, 2015 a las 23:21

      tienes toda la razón, lo arregle funciona ! thanx man, una pregunta mas, usted cree que pueda podrá programar ese script para que se ejecute siempre a ciertas horas automáticamente?

        angelinux · 11 junio, 2015 a las 07:20

        En lugar de
        DIA = $2
        Coloca
        DIA = date +”%y-%m-%d”

        Con ello, en lugar de recibir un segundo parámetro en el script, obtendrá la fecha del sistema.

        Sólo bastaría agregar la entrada a CRON para que se ejecute todas las noches a las 11:59:59.

        Me comentas si tienes algún problema.

        Saludos.

          Diego · 11 junio, 2015 a las 22:19

          hola de nuevo:

          oye te habla diego otra vez, y muchas gracias compadre, tu ¿sabes que podrías dominar el mundo con esto? jejeje
          tengo otra question!

          se cambian los parámetros que le siguen en el script hablando de LA VARIABLE “DIA” ? por ejemplo:
          __________

          DIAN=$( echo “$DIA” | sed -r ‘s/[/]+/_/g’) =====> el carácter “$DIA” se deja tal cual o se cambia el “$”

          ____________

          Diego · 12 junio, 2015 a las 00:17

          bueno ya lo hice!! me funciona re bien, tira el video automáticamente a la hora que deseo, pero tengo una duda pequeñita en cuanto al nombre del video final, me aparece así: -.avi

          ¿De que forma puedo hacer para que salga automáticamente con el nombre de la fecha en que fue creado? o ya es mucho pedir? jejee

          así tengo el scripts
          ———————————

          #!/bin/bash

          PORTON=$1
          DIA=date +”%y-%m-%d”
          DIAN=$( echo “$DIA” | sed -r ‘s/[/]+/_/g’)

          DIRZM=”/usr/share/zoneminder/events” #RUTA DE LOS EVENTOS DE ZONEMINDER
          DIRVD=”/var/www/html/owncloud/data/videos-casarojas/files/PORTON/” #RUTA A DONDE VAS A GUARDAR EL VIDEO

          DI=”$DIRZM/$PORTON/$DIA”

          cd $DI

          find . -maxdepth 3 -mindepth 1 -type d -exec sh -c ‘(
          cd {} &&
          SD=$(echo ‘{}’ | sed -r ‘s/[/.]+/_/g’) &&
          mkdir -p ‘$DIRVD’/’$PORTON’/’$DIAN’ &&
          avconv -r 20 -f image2 -i %03d-capture.jpg ‘$DIRVD’/’$PORTON’/’$DIAN’/’$PORTON’-‘$DIAN’-$SD-TMP.avi)’ {} \; | sort

          cd $DIRVD/$PORTON/$DIAN
          mencoder -oac copy -ovc copy -idx -o ../”$PORTON”-“$DIAN”.avi *.avi
          rm *-TMP.avi
          cd ..
          rm -r $DIAN
          __________________________________________________

          saludos cordiales….

        angelinux · 12 junio, 2015 a las 14:59

        Que tal. Claro, hay que buscar dominar el mundo XD.

        No entendí la parte que comentas de
        se cambian los parámetros que le siguen en el script hablando de LA VARIABLE “DIA” ?

        Ayer no te puse correctamente el comento para el día automático.
        Debe ser
        DIA=$(date +”%y/%m/%d”)

        Ya que el que te dí, ya lleva guiones, en lugar de diagonales

        Así, la siguiente línea quita las diagonlaes, y las sustituye por guiones bajo ( _ ), para generar la ruta del archivo
        DIAN=$( echo “$DIA” | sed -r ‘s/[/]+/_/g’)

        Con eso te debería ya aparecer el nombre del archivo con la fecha correcta.

        Me comentas si no queda bien.

        Saludos.

          diego · 12 junio, 2015 a las 19:05

          mira, lo cambie como me dices , pero no general video, si tiro el comando si genero yo el comando salen errores que no encuentra los directorios… así lo tengo el script-…(.la config de antes lo generaba bien pero no salía el nombre )

          ________________________________-

          #!/bin/bash

          PORTON=$1
          DIA=$(date +”%y/%m/%d”)
          DIAN=$( echo “$DIA” | sed -r ‘s/[/]+/_/g’)

          DIRZM=”/usr/share/zoneminder/events” #RUTA DE LOS EVENTOS DE ZONEMINDER
          DIRVD=”/var/www/html/owncloud/data/videos-casarojas/files/PORTON” #RUTA A DONDE VAS A GUARDAR EL VIDEO

          DI=”$DIRZM/$PORTON/$DIA”

          cd $DI

          find . -maxdepth 3 -mindepth 1 -type d -exec sh -c ‘(
          cd {} &&
          SD=$(echo ‘{}’ | sed -r ‘s/[/.]+/_/g’) &&
          mkdir -p ‘$DIRVD’/’$PORTON’/’$DIAN’ &&
          avconv -r 20 -f image2 -i %03d-capture.jpg ‘$DIRVD’/’$PORTON’/’$DIAN’/’$PORTON’-‘$DIAN’-$SD-TMP.avi)’ {} \; | sort

          cd $DIRVD/$PORTON/$DIAN
          mencoder -oac copy -ovc copy -idx -o ../”$PORTON”-“$DIAN”.avi *.avi

          __________________________________________

          angelinux · 12 junio, 2015 a las 19:16

          ¿Que error te marca?

diego · 12 junio, 2015 a las 19:35

mira este error marca si ejecuto yo el scripts sin cron, con el comando “sh creación.sh”

______________________________________

built on Mar 16 2015 13:37:34 with gcc 4.8 (Ubuntu/Linaro 4.8.2-19ubuntu1)
%03d-capture.jpg: No such file or directory
avconv version 9.18-6:9.18-0ubuntu0.14.04.1, Copyright (c) 2000-2014 the Libav developers
built on Mar 16 2015 13:37:34 with gcc 4.8 (Ubuntu/Linaro 4.8.2-19ubuntu1)
%03d-capture.jpg: No such file or directory
MEncoder 1.1-4.8 (C) 2000-2012 MPlayer Team
File not found: ‘*.avi’
Failed to open *.avi.
Cannot open file/device.

Exiting…
rm: cannot remove â*-TMP.aviâ: No such file or directory

[email protected]:/usr/share/zoneminder#

________________________________________________

    angelinux · 12 junio, 2015 a las 19:38

    ¿Le estás pasando el parámetro de la cámara?

diego · 12 junio, 2015 a las 19:42

dentro del scripts o al ejecutar el comando manual?

    angelinux · 12 junio, 2015 a las 19:46

    comando manual.

    Después de que te salga el error, imprime las variables para ver que marcan

    echo $DÍA
    echo $DIAN

Diego :) · 12 junio, 2015 a las 19:53

no sale nada, :O

%03d-capture.jpg: No such file or directory
avconv version 9.18-6:9.18-0ubuntu0.14.04.1, Copyright (c) 2000-2014 the Libav developers
built on Mar 16 2015 13:37:34 with gcc 4.8 (Ubuntu/Linaro 4.8.2-19ubuntu1)

%03d-capture.jpg: No such file or directory
avconv version 9.18-6:9.18-0ubuntu0.14.04.1, Copyright (c) 2000-2014 the Libav developers
built on Mar 16 2015 13:37:34 with gcc 4.8 (Ubuntu/Linaro 4.8.2-19ubuntu1)

%03d-capture.jpg: No such file or directory
MEncoder 1.1-4.8 (C) 2000-2012 MPlayer Team

File not found: ‘*.avi’
Failed to open *.avi.
Cannot open file/device.

[email protected]:/usr/share/zoneminder# echo $DIA

[email protected]:/usr/share/zoneminder# echo $DIAN

[email protected]:/usr/share/zoneminder#

_______________________________________________

    angelinux · 14 junio, 2015 a las 08:48

    Está muy raro.

    Exactamente como ejecutas el script y con qué parámetros.

    Saludos.

Diego · 14 junio, 2015 a las 19:43

no mira yo estoy ejecutándolo en cron el script y ejecutaba bien el comando antes ,pero no salía con el nombre!!!, así lo tenia antes : DIA=date +”%y-%m-%d”

ahora le cambie el parámetro así: DIA=$(date +”%y/%m/%d”)

pero nu lo genera..

    diego · 16 junio, 2015 a las 11:47

    a ti te lo genera bien con esa config?

      angelinux · 16 junio, 2015 a las 16:51

      Yo ya no tengo zoneminder, ahora uso una aplicación de paga para la gestión de los videos.
      No puedo hacer pruebas en este momento, pero puedo hacer el intento para que quede el script perfecto acorde a tus necesidades.

    angelinux · 16 junio, 2015 a las 16:47

    Que tal, disculpa la tardanza para contestar.

    Si colocas en consola esto
    echo $(date +”%y/%m/%d”)
    ¿Que te muestra?

    Si sí muestra información, pero cuando imprimes echo $DIA, sale vacío, al parecer lo estás perdiendo en algún punto del script.

    ¿Puedes colcocar tu script tal y como está con tus cambios?

Diego · 16 junio, 2015 a las 21:00

así esta el scripts!

——————————————-
#!/bin/bash

PORTON=$1
DIA=$(date +”%y/%m/%d”)
DIAN=$( echo “$DIA” | sed -r ‘s/[/]+/_/g’)

DIRZM=”/usr/share/zoneminder/events”
DIRVD=”/var/www/html/owncloud/data/videos-casarojas/files/PORTON”

DI=”$DIRZM/$PORTON/$DIA”

cd $DI

find . -maxdepth 3 -mindepth 1 -type d -exec sh -c ‘(
cd {} &&
SD=$(echo ‘{}’ | sed -r ‘s/[/.]+/_/g’) &&
mkdir -p ‘$DIRVD’/’$PORTON’/’$DIAN’ &&
avconv -r 20 -f image2 -i %03d-capture.jpg ‘$DIRVD’/’$PORTON’/’$DIAN’/’$PORTON’-‘$DIAN’-$SD-TMP.avi)’ {} \; | sort

cd $DIRVD/$PORTON/$DIAN

    angelinux · 19 junio, 2015 a las 15:20

    Qué tal.

    Hice unas pruebas y me generó correctamente el video final como
    $PORTON-FECHA.avi

    Por ejemplo, me acaba de generar el siguiente archivo
    prueba-15_06-19.avi

    Te dejo el código con el cual lo conseguí

    #!/bin/bash

    PORTON=$1
    DIA=$(date +%y/%m/%d)
    DIAN=$( echo $DIA | sed -r ‘s/[/]+/_/g’)

    DIRZM=’/home/angelos’
    DIRVD=’/home/angelos/tmp’

    DI=”$DIRZM/$PORTON/$DIA”

    cd “$DI”

    find . -maxdepth 3 -mindepth 1 -type d -exec sh -c ‘(
    echo “SI”
    cd {} &&
    SD=$(echo ‘{}’ | sed -r ‘s/[/.]+/_/g’) &&
    mkdir -p ‘$DIRVD’/’$PORTON’/’$DIAN’ &&
    avconv -r 20 -f image2 -i %03d-capture.jpg ‘$DIRVD’/’$PORTON’/’$DIAN’/’$PORTON’-‘$DIAN’-$SD-TMP.avi)’ {} \; | sort

    cd $DIRVD/$PORTON/$DIAN

    mencoder -oac copy -ovc copy -idx -o ../$PORTON-$DIAN.avi *.avi
    rm *-TMP.avi
    cd ..
    rm -r $DIAN

      Diego · 20 junio, 2015 a las 00:02

      Me funciona! merci!!! thanks u, te debo una ronda de cervezas para honrar a los dioses como se debe, ajjajaajajaja

        angelinux · 21 junio, 2015 a las 16:58

        Quedan pendientes, porque no bebo =D

          Diego · 23 junio, 2015 a las 21:17

          hola angelinux

          sabes, se me presento otro problema, es que cuando crea el video, los separa en muchos videos y no los recopila todos 😛

          angelinux · 23 junio, 2015 a las 22:49

          ¿No te genera un vídeo por cada día?

          Diego · 25 junio, 2015 a las 07:03

          genera normal los videos por día, solo que no los almacena en 1 video , sino en muchos videos

          angelinux · 29 junio, 2015 a las 19:14

          Qué tal.

          ¿En que ruta te crea los videos?

          Diego · 25 junio, 2015 a las 11:38

          me genero 119 videos distintos de 1 día :O… mira asi tengo ahora el scripts

          ——————

          #!/bin/bash

          PORTON=$1
          DIA=$(date +%y/%m/%d)
          DIAN=$( echo $DIA | sed -r ‘s/[/]+/_/g’)

          DIRZM=”/usr/share/zoneminder/events/PORTON”
          DIRVD=”/var/www/html/owncloud/data/videos-casarojas/files/PORTON”

          DI=”$DIRZM/$PORTON/$DIA”

          cd $DI

          find . -maxdepth 3 -mindepth 1 -type d -exec sh -c ‘(
          cd {} &&
          SD=$(echo ‘{}’ | sed -r ‘s/[/.]+/_/g’) &&
          mkdir -p ‘$DIRVD’/’$PORTON’/’$DIAN’ &&
          avconv -r 20 -f image2 -i %03d-capture.jpg ‘$DIRVD’/’$PORTON’/’$DIAN’/’$PORTON’-‘$DIAN’-$SD-TMP.avi)’ {} \; | sort

          cd $DIRVD/$PORTON/$DIAN

          mencoder -oac copy -ovc copy -idx -o ../”$PORTON”-“$DIAN”.avi *.avi
          rm *-TMP.avi
          cd ..
          rm -r $DIAN
          ————————————

          angelinux · 29 junio, 2015 a las 19:18

          Primero toma cada carpeta que se genera en un día, y eso lo convierte en video y lo coloca en $DIRVD/$PORTON/$DIAN
          Una vez que termine de generar un video por cada carpeta de un día, entonces empieza a generar un único video para todo un día y lo guarda en $DIRVD/$PORTON y entonces borra todos los videos chicos y borra $DIAN.

          ¿Puedes verificar si no arroja algún error durante la ejecución? tal vez no puede ejecutar alguna acción por permisos.

          Saludos.

          DIego · 30 junio, 2015 a las 16:56

          si tira errores, te los envio!! wait me!

          Diego · 30 junio, 2015 a las 17:42

          este erro me tira al final!!!

          _________________________-

          built on Mar 16 2015 13:37:34 with gcc 4.8 (Ubuntu/Linaro 4.8.2-19ubuntu1)
          %03d-capture.jpg: No such file or directory
          avconv version 9.18-6:9.18-0ubuntu0.14.04.1, Copyright (c) 2000-2014 the Libav developers
          built on Mar 16 2015 13:37:34 with gcc 4.8 (Ubuntu/Linaro 4.8.2-19ubuntu1)
          Input #0, image2, from ‘%03d-capture.jpg’:
          Duration: 00:00:00.30, start: 0.000000, bitrate: N/A
          Stream #0.0: Video: mjpeg, yuvj420p, 880×640 [PAR 1:1 DAR 11:8], 20 fps, 20 tbr, 20 tbn
          Output #0, avi, to ‘/var/www/html/owncloud/data/videos-casarojas/files/PORTON//15_06_30/-15_06_30-_20_00_00-TMP.avi’:
          Metadata:
          ISFT : Lavf54.20.4
          Stream #0.0: Video: mpeg4, yuv420p, 880×640 [PAR 1:1 DAR 11:8], q=2-31, 200 kb/s, 20 tbn, 20 tbc
          Stream mapping:
          Stream #0:0 -> #0:0 (mjpeg -> mpeg4)
          Press ctrl-c to stop encoding
          frame= 6 fps= 0 q=6.9 Lsize= 241kB time=0.30 bitrate=6568.7kbits/s
          video:235kB audio:0kB global headers:0kB muxing overhead 2.455682%
          MEncoder 1.1-4.8 (C) 2000-2012 MPlayer Team
          -15_06_30-_16_54_52-TMP.avi is not an MEncoder option

          Exiting… (error parsing command line)
          rm: invalid option — ‘1’
          Try ‘rm ./-15_06_30-_16_54_52-TMP.avi’ to remove the file â-15_06_30-_16_54_52-TMP.aviâ.
          Try ‘rm –help’ for more information.

Diego · 18 junio, 2015 a las 10:07

Que dices? tendrá algo mal?

    angelinux · 3 julio, 2015 a las 21:01

    Qué tal Diego.

    ¿puedes comentarme el comando exacto con el que ejecutaste el script por favor?

    Try ‘rm ./-15_06_30-_16_54_52-TMP.avi’ to remove the file â-15_06_30-_16_54_52-TMP.aviâ.
    Éste error indica que al parecer no se está enviando el parámetro del portón.

    Saludos.

      Diego · 7 julio, 2015 a las 18:41

      En el crontab lo tengo así!!!!

      59 23 * * * /home/zmgenerador

      😛

      Diego · 14 julio, 2015 a las 15:14

      En el crontab lo tengo así el comando para generalo todos los a x hora

      59 23 * * * /home/zmgenerador PORTON

        angelinux · 30 julio, 2015 a las 11:04

        Qué tal Diego.
        Por lo que veo en el error que te marca, es cuando intenta eliminar los videos generados por eventos, al parecer si te genera el video único por día.

        Además, de lo que me doy cuenta es que en los archivos que se están creando, no llevan el nombre de la camara. Aquí puedes verificar si estás enviando correctamente el parámetro de la cámara, o si tienes una sola, ponsela estática en el código.

        Otro cambio que te sugiero es:
        /’$CAMARA’-‘$DIAN’
        por
        /’$CAMARA’_‘$DIAN’

        Ya que como no estás enviando la cámara entonces el nombre del archivo queda como
        15-07-30, por ejemplo

        Y cuando se intenta eliminar el archivo, el guion lo toma como un parámetro, y por eso marca parámetro -1 desconocido.

        Cambiándolo a guion bajo, se resuelve, y solo queda pendiente que verifiques lo del nombre de la cámara.

        Saludos.

          Diego · 17 agosto, 2015 a las 14:16

          hola, sabes cambie el parámetro
          /’$CAMARA’-‘$DIAN’
          por
          /’$CAMARA’_‘$DIAN’

          pero aun me general todos los eventos por separado, 😛

Diego · 24 junio, 2015 a las 20:40

general normal los videos por día, solo que no los almacena en 1 video , sino en muchos videos

Ladis Pascual · 3 julio, 2015 a las 11:55

Hola:
Un artículo genial que me ha ayudado mucho.
Me encantaría hacer funcionar el script pero no lo consigo. Mi distribución no vien con avconv así que lo he descargado, compilado e instaldo, el problema es que al ejecutar el script tal cual, cambiando las rutas, me pone:
avconv version 11.4, Copyright (c) 2000-2014 the Libav developers
built on Jul 3 2015 17:54:31 with gcc 4.9.2 (GCC)
%03d-capture.jpg: No such file or directory
estoy bastante flojo en script pero si cambio :
avconv -r 20 -f image2 -i %03d-capture.jpg ‘$DIRVD’/’$CAMARA’/’$DIAN’/’$CAMARA’-‘$DIAN’-$SD-TMP.avi)’ {} \; | sort
por
avconv -r 20 -f image2 -i *-capture.jpg ‘$DIRVD’/’$CAMARA’/’$DIAN’/’$CAMARA’-‘$DIAN’-$SD-TMP.avi)’ {} \; | sort
si sesaparece ese error y me crea un archivo de video vacio saliendo el siguiente error:
[image2 @ 0x3264240] Could not open file : 00002-capture.jpg
av_interleaved_write_frame(): Input/output error
agradecería mucho si pudieras ayudarmen con eso, o explicarme que es el %03d-capture.
Gracias y un saludo

    angelinux · 3 julio, 2015 a las 21:11

    Qué tal.

    Zoneminder genera una carpeta para el año. En mi versión la genera con cuatro dígitos, aunque me han comentado que en versiones más recientes lo está generando con dos dígitos.
    Puedes verificar esto en la carpeta donde tengas tus eventos de zoneminder.

    Si lo genera con dos dígitos, entonces debes cambiar el llamado al script de
    sh video.sh AngelosGames 2014/01/19
    A
    sh video.sh AngelosGames 14/01/19

    Ahora bien, dentro de la carpeta del año, genera otra carpeta para el mes, y después otra para el día.
    En la carpeta del día genera una subcarpeta por cada evento que graba, significa que en un día normal, puede estar generando cientos de carpetas. Y los archivos (fotogramas) de lo que graba, lo hace con el formato de número de 3 dígitos, seguido del texto “-capture.jpg”. por ejemplo 001-capture.jpg, 002-capture.jpg.

    Por ello, en el script. el parámetro interno -i %03d-capture.jpg significa, que los archivos de imágenes que convertirá a video, será aquellos que tenga el formato de 3 digitos (%03d) seguido de la cadena “-capture.jpg”.

    En tu caso necesitaría primero la confirmación si tu zoneminder utiliza el año de dos dígitos o cuatro, y que me pases el comando con los parámetros exactos para que pueda determinar cual es el problema y ayudarte a que el script lo puedas ejecutar sin problemas.

    Saludos.

Ladis Pascual · 4 julio, 2015 a las 02:18

Muchas gracias por contestar tan pronto.
Utilizo la versión 1.28 y genera eventos con el formato 00001-capture.jpg. Ok, cambio -i %03d por -i%05d. Parece que ahora si encuentra los archivos y todo funciona perfectamente.
Gracias otra vez.

José Alberto Corona Méndez · 26 enero, 2016 a las 14:15

Hola, antes que nada felicidades por tu excelente blog y tu canal de Telegram, sabes tengo un problema con este scipt, al ejecutarlo me aparece el siguiente error:

sed: -e expresión #1, carácter 1: orden desconocida: <>
video.sh: 14: video.sh: Syntax error: “(” unexpected

y de ahí no pasa, ya estuve modificando algunas cosas pero no eh conseguido echarlo a andar, mi equipo es un Pentium 4 con 1G en ram, con Xubuntu 14.04 y la versión del Zm es 1.28.1, tengo configuradas 4 cámaras en el zoneminder y este es el script, que es un vulgar copy/page del que pusiste mas arriba solo cambiando algunos detalles de mis cámaras:

#!/bin/bash

Anexo_A=$1
DIA=$(date +%y/%m/%d)
DIAN=$(echo $DIA | sed -r ‘s/[/]+/_/g’)

DIRZM=”/var/cache/zoneminder/events”
DIRVD=”/home/sistemas/tmp”

DI=”$DIRZM/$Anexo_A/$DIA”

cd “$DI”

find . -maxdepth 3 -mindepth 1 -type d -exec sh -c ‘(
echo “SI”
cd {} &&
SD=$(echo ‘{}’ | sed -r ‘s/[/.]+/_/g’) &&
mkdir -p ‘$DIRVD’/’$Anexo_A’/’$DIAN’ &&
avconv -r 20 -f image2 -i %05d-capture.jpg ‘$DIRVD’/’$Anexo_A’/’$DIAN’/’$Anexo_A’_‘$DIAN’-$SD-TMP.avi)’ {} \; | sort

cd $DIRVD/$Anexo_A/$DIAN

mencoder -oac copy -ovc copy -idx -o ../$Anexo_A-$DIAN.avi *.avi
rm *-TMP.avi
cd ..
rm -r $DIAN

Segun yo el error de sintaxis esta en esta linea:

find . -maxdepth 3 -mindepth 1 -type d -exec sh -c ‘(

Espero que puedas apoyarme.

Saludos

    angelinux · 26 enero, 2016 a las 14:34

    Qué tal José.

    A veces al poner un post en blogger o wordpress cambia la comilla simple por apóstrofe, y eso puede ocasionar que el script no se ejecute correctamente.
    ¿Has verificado que en tu script contenga la comilla simple?

    Intenta verificar que en todo el script contenga comilla simple y vuelve a ejecutarlo.

    Yo espero modificar mi post para colocarlo como fragmento de código en lugar de texto formateado.

    Cualquier detalle me comentas y vemos su posible solución.

    ¡Gracias por las felicitaciones y por la suscripción al canal!

    Saludos.

      José Alberto Corona Méndez · 4 abril, 2016 a las 13:20

      Hola amigo, antes que nada una disculpa por la tardanza para responder, pero después de actualizar a la versión 1.29 de zoneminder ya no pude ingresar al mismo y no podía correr pruebas, asta ahora que reinstale todo de cero y ya esta en operación nuevamente.

      Tenias razón en cuanto a las comillas, corregí el script y ya opera correctamente, ahora solo tengo un par de dudas, como te comentaba tengo cuatro cámaras configuradas sobre zoneminder,

      1. ¿para realizar la conversión a vídeo y programarlo con Crontab tengo que generar un script por cada cámara?

      2. O ¿puedo simplemente en el mismo script añadir cada una de estas y así programar el Crontab?

      3. Por otra parte una de las cámaras me interesa grabar sonido, es posible al hacer la conversión ¿que esta se guarde con dicho sonido?

      De antemano mil gracias por tu apoyo.

      Saludos

        angelinux · 8 abril, 2016 a las 17:52

        ¿Qué tal?
        Con respecto a CRON, puedes hacer un script que recorra un arreglo con el nombre de cada una de tus caámaras y las recorra para generar el video.
        Con respecto al audio, lamento no poder ayudarte, nunca hice pruebas de utilizar zoneminder con captación de audio y por consiguiente tomarlo en cuenta en la generación de dicho video.

        Saludos.

Deja un comentario