• Benvenuti su RaspberryItaly!
Benvenuto ospite! Login Login con Facebook Registrati Login with Facebook


Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5

[-]
Tags
durata script mp4 file per

Script per durata file MP4
#1
Il seguente file di configurazione camera1.conf è installato nella cartella /etc/motion di un raspberry e viene attivato ogniqualvolta il software motion percepisce un movimento e, in conseguenza di questo, registra un breve spezzone video MP4. In un tempo successivo questo file viene trasferito in un spazio web con l'istruzione wput.

Codice:
camera_id 9
netcam_url http://admin:pswabcde@XXX.XXX.XXX.XXX/video/mjpg.cgi
input -1
camera_name VIDEO_UNO
target_dir /mnt/ramdisk
movie_filename VID9_%Y%m%d_%H%M
stream_port XXXX
width 640
height 480
stream_localhost off
on_movie_end wput -B -R --disable-tls %f ftp://username:password@YYYY.YYY.YYY.YYY/nomesito/video

Tutto funziona perfettamente ma adesso desidererei anche registrare, oltre al file (esempio) VID9_20240212_1154.MP4 anche un corrispondente file DUR9_20240212_1154.TXT che contiene semplicemente la durata del file MP4 stesso in secondi (esempio 130 che corrisponde a 2' e 10").
So che si deve usare ffmpg più o meno in questo modo
/usr/bin/ffmpeg -i /nomefilemp4 2>&1
ma non so andare oltre.
Come riuscire in questo mio intento ?
Grazie anticipatamente
Risposta
#2
Due spunti 'al volo' senza aver provato se funzionano:

1) sulla riga on _movie_end aggiungere anche il comando che vorresti eseguire, concatenando i due comandi con un ;
quindi qualcosa che assomiglia a questo:
Codice:
on_movie_end  /usr/bin/ffmpeg -i /nomefilemp4 2>&1 ; wput -B -R --disable-tls %f ftp://username:password@YYYY.YYY.YYY.YYY/nomesito/video 


2) sulla riga on _movie_end indicare uno script (con il percorso completo) che contiene entrambi i comandi:
Codice:
on_movie_end  /percorso/completo/script.sh 
 e nello script ( a cui bisogna ovviamente dare i permessi di esecuzione):
Codice:
#/bin/bash
/usr/bin/ffmpeg -i /nomefilemp4 2>&1
wput -B -R --disable-tls %f ftp://username:password@YYYY.YYY.YYY.YYY/nomesito/video 
credo che nello script dovrai indicare esplicitamente il nome del video, perche sospetto che nel passaggio da motion allo script si perda il contenuto delle variabili di motion ( tipo %f)


pero' per quanto riguarda la durata del video credo che il comando per misurare la durata del video (espressa in secondi) sia :
Codice:
/usr/bin/ffprobe -v quiet -of csv=p=0 -show_entries format=duration video.mp4>/percorso/completo/durata.txt
Risposta
#3

Grazie delle info. Per mio conto sono riuscito a creare un file txt che contiene la durata del file mp4 in secondi.

Tale file soddisfa le mie esigenze. Lanciandolo manualmente tutto è OK.

Ecco lo script duratavideo.sh

Codice:
#!/bin/bash

# /home/pi/duckdns/duratavideo.sh

cartella="/mnt/ramdisk/"

#cartella=""

x="$1"

video_file=$cartella$x

# video_file="$1"

# Verifica che il file video esista

#if [ ! -f "$video_file" ]; then

#    echo "Il file $video_file non esiste."

#    exit 1

#fi

# echo "esamino $video_file"

dur="DUR"

txt="txt"

inizio=3

lunghezza=16

# f="${video_file:$inizio:$lunghezza}"

f="${x:$inizio:$lunghezza}"

filetxt=$cartella$dur$f$txt

duration=$(ffmpeg -i "$video_file" -hide_banner 2>&1 | grep Duration | awk '{print $2}' | tr -d ',' | cut -d '.' -f1 | awk -F ':' '{print ($1 * 3600) + ($2 * 60) + $3}')



# if duration> 100  (un certo valore)

   echo "$duration" > "$filetxt"

   wput -B -R --disable-tls "$video_file" ftp://xxx:xxx@xxx/nomesito.it/cartella/video/

   wput -B -R --disable-tls "$filetxt" ftp://xxx:xxx@xxx/nomesito.it/cartella/video/

# else

   # cancello il file mp4 (il file txt non è neanche stato creato)

#fi




Tuttavia non sono certo che tale script venga eseguito automaticamente nell'evento on_movie_end.

Nel camera1.conf ho scritto


on_movie_end sh /home/pi/duckdns/duratavideo.sh %f

invece di

on_movie_end wput -B -R --disable-tls %f ftp://xxx:xxx@xxx/nomesito.it/cartella/video/
Ho il sospetto di qualche impappinamento nell'indicare il nome e/o il percorso di qualche file.
Risposta
#4
Wink 
Purtroppo non posso fare prove con motion, dato che il rasp e' attualmente dedicato al controllo remoto di una stufa...
ma hai provato a guardare il log di motion?
Lì si dovrebbe vedere se lo script ha dei problemi: var/log/motion/motion.log
Risposta
#5
L'idea di esaminare il file log di motion sarebbe ottima, ma purtroppo non sembra che nel file ci siano riferimenti all'effettuazione dell'evento on_movie_end.
Quando nel file "camera1.conf" c'è l'istruzione
Codice:
on_movie_end wput -B -R --disable-tls %f ftp://xxx:xxx@xxx/nomesito.it/cartella/
la parte finale del file di log è
Citazione:[2:ml2:CAM1] [NTC] [ALL] [feb 14 10:30:23] motion_detected: Movimento rilevato: evento di avvio 1
[2:ml2:CAM1] [NTC] [ALL] [feb 14 10:31:45] mlp_actions: Fine dell'evento 1
[2:ml2:CAM1] [NTC] [EVT] [feb 14 10:32:40] event_newfile: File di tipo 8 salvato in: /mnt/ramdisk/CAM1_20240214_1032.mp4
[2:ml2:CAM1] [NTC] [ALL] [feb 14 10:32:40] motion_detected: Movimento rilevato: evento di avvio 2
[1:ml1:CAM2] [NTC] [ALL] [feb 14 10:32:45] mlp_actions: Fine dell'evento 1
[2:ml2:CAM1] [NTC] [ALL] [feb 14 10:32:45] mlp_actions: Fine dell'evento 2
[1:ml1:CAM2] [NTC] [ALL] [feb 14 10:32:45] motion_loop: Discussione in uscita
[2:ml2:CAM1] [NTC] [ALL] [feb 14 10:32:45] motion_loop: Discussione in uscita
[2:nc3:CAM1] [NTC] [NET] [feb 14 10:32:45] netcam_handler_loop: gestore videocamera Netcam: fine impostato, uscita
[1:ml1:CAM2] [NTC] [NET] [feb 14 10:32:46] netcam_rtsp_cleanup: Risoluzione normale: spegnimento completo.
[0:motion] [NTC] [ALL] [feb 14 10:32:46] main: Discussioni finite
[0:motion] [NTC] [ALL] [feb 14 10:32:46] main: Terminazione del movimento
[0:motion] [NTC] [ALL] [feb 14 10:32:46] motion_remove_pid: File di registro di chiusura ( /tmp/motion/motion.log).
N.B. Bisogna considerare solo la CAM1 (camera 1). Poi ho fatto un "sudo service motion stop".
Fino a qui è tutto OK: il file viene correttamente uploadato nel sito web e successivamente cancellato (opzione -R)
------
Ma se modifico l'istruzione "on_movie_end" in
Codice:
on_movie_end  /home/pi/duckdns/duratavideo.sh %f
non riesco a capire se lo script duratavideo.sh viene eseguito perchè l'evento on_movie_end non viene mai considerato nel file di log. Forse che debbo attivare (come ?) un "verbose" della procedura di log ?
Nemmeno scrivendo on_movie_end  sh /home/pi/duck .... o on_movie_end  /bin/sh /home/pi/duck ...
In ogni caso è sicuro che nel sito web non viene trasferito il file mp4 ne viene creato il file DUR1_ ..... txt
-----
Ti chiederei solamente di dare una controllatina allo script duratavideo.sh se esso è sintetticamente corretto (virgolette, parentesi, ecc.).
Grazie anticipatamente.
Risposta
#6
Ecco l'ultima versione dello script duratavideo.sh.
Se questo script viene lanciato manualmente esso fa tutto quando da me desiderato (tranne - ed è un mistero - cancellare il file mp4 e il file txt DOPO che è stato fatto l'upload; malgrado l'opzione -R; ma a questo ci penserò dopo). Viene eseguito correttamente partendo da qualsiasi cartella del rasperry (comando : ./home/pi/duckdns/duratavideo.sh CAM1_20240214_12:34.mp4)
Se vien menzionato nel file di configurazione "camera1.conf" all'istruzione "on_movie_end" viceversa lo script NON viene assolutamente eseguito.
Non so perchè.
Codice:
#!/bin/bash

cartella="/mnt/ramdisk/"
#cartella=""
x="$1"
video_file=$cartella$x
# video_file="$1"
# Verifica che il file video esista
#if [ ! -f "$video_file" ]; then
#    echo "Il file $video_file non esiste."
#    exit 1
#fi
# echo "esamino $video_file"
dur="DUR"
txt="txt"
inizio=3
lunghezza=16
f="${x:$inizio:$lunghezza}"
filetxt=$cartella$dur$f$txt
# echo "questo è il file txt $filetxt"
d=10

duration=$(ffmpeg -i "$video_file" -hide_banner 2>&1 | grep Duration | awk '{print $2}' | tr -d ',' | cut -d '.' -f1 | awk -F ':' '{print ($1 * 3600) + ($2 * 60) + $3}')

if  [ $duration -gt 90 ];  then
  echo "$duration" > "$filetxt"
  echo "adesso faccio l'ftp di $video_file e di &filetxt"
  wput -B -R --disable-tls "$video_file" ftp://xxx:xxx@xxx/miosito.it/cartella/video/
  wput -B -R --disable-tls "$filetxt" ftp://xxx:xxx@xxx/miosito.it/cartella/video/
else
  echo "cancello $video_file"
  sudo rm -rfv "$video_file"
fi
Risposta
#7
Quindi sappiamo per certo che l'opzione on_movie_end di per se' funziona, dato che il comando wput viene eseguito....
Il problema si evidenzia quando tenti invece di eseguire lo script.
Spesso questi problemi 'strani' li ho incontrati a a causa di permessi insufficienti.
Quando tu esegui lo script da terminale usi (immagino) l'account  pi, motion usa l'account motion, quindi non e' scontato che quello che e' consentito a te da terminale sia consentito al demone motion
I permessi di esecuzione dello script sono impostati per tutti?
i files e le cartelle che lo script deve leggere e scrivere hanno i permessi di lettura e scrittura per tutti?

per quanto riguarda la verbosita del log la documentazione di motion dice:
Citazione:log_level
  • Type: Integer
  • Range / Valid values: 1 - 9
  • Default: 6
This option specifies the level of verbosity of the messages sent from Motion. At a level of 8(DBG), there are a LOT of messages. At a level of 1(EMR) virtually no messages will be output.

The various levels are [1..9] (EMR, ALR, CRT, ERR, WRN, NTC, INF, DBG, ALL).

When reporting any issues or errors associated with the Motion application, use the INF level.

stasera provo ad eseguire il tuo script e vediamo se scopro qualcosa.
Risposta
#8
Confermo: Cool 
molto probabilmente hai problemi di permessi!
Ho provato l'accoppiata motion + tuo script su un pc  su cui gira archlinux ( quindi non su un raspberry, ma in questo caso fa poca differenza)
e motion ha eseguito correttamente lo script leggermente modificato:
Codice:
#!/bin/bash
echo "eseguo script duratavideo"
#cartella="/dati/motion-test/"
cartella=""
x="$1"
#video_file=$cartella$x
video_file="$1"
# Verifica che il file video esista
if [ ! -f "$video_file" ]; then
    echo "Il file $video_file non esiste."
    exit 1
fi
echo "esamino $video_file"
dur="DUR"
txt="txt"
inizio=3
lunghezza=16
f="${x:$inizio:$lunghezza}"
filetxt=$cartella$dur$f$txt
# echo "questo è il file txt $filetxt"
d=10

duration=$(ffmpeg -i "$video_file" -hide_banner 2>&1 | grep Duration | awk '{print $2}' | tr -d ',' | cut -d '.' -f1 | awk -F ':' '{print ($1 * 3600) + ($2 * 60) + $3}')

if  [ $duration -gt 90 ];  then
  echo "$duration" > "$filetxt"
  echo "adesso faccio l'ftp di $video_file e di &filetxt"
  wput -B -R --disable-tls "$video_file" ftp://xxx:xxx@xxx/miosito.it/cartella/video/
  wput -B -R --disable-tls "$filetxt" ftp://xxx:xxx@xxx/miosito.it/cartella/video/
else
  echo "cancello $video_file"
  sudo rm -rfv "$video_file"
fi

e questo e' il log di sistema (le istruzioni echo vengono inviate al log di sistema, non al log di motion):

Codice:
Feb 14 21:57:45 archlinux motion[68634]: eseguo script duratavideo
Feb 14 21:57:45 archlinux motion[68634]: esamino /dati/motion-test/2024_02_14-21:57:32.mp4
Feb 14 21:57:45 archlinux motion[68634]: cancello /dati/motion-test/2024_02_14-21:57:32.mp4
Feb 14 21:57:45 archlinux sudo[68642]: pam_unix(sudo:auth): conversation failed
Feb 14 21:57:45 archlinux sudo[68642]: pam_unix(sudo:auth): auth could not identify password for [motion]
Feb 14 21:57:47 archlinux sudo[68642]: PAM Attempted to close sd-bus after fork, this should not happen.
Feb 14 21:57:47 archlinux sudo[68642]:  motion : user NOT in sudoers ; PWD=/ ; USER=root ; COMMAND=/usr/bin/rm -rfv /dati/motion-test/2024_02_14-21:57:32.mp4


Osservazione: dato che motion non e' autorizzato ad eseguire sudo il comando di cancellazione fallisce, ma questo non dovrebbe essere un problema.

quindi controlla bene i permessi di esecuzione dello script e specialmente delle cartelle, e' estremamente probabile che il problema sia lì
Risposta
#9
Risolto !

Non è un problema di permessi ma di errata definizione dei percorsi.

Il file sh postato precedentemente funzionava perfettamente se lo lanciavo manualmente; da qualsiasi posizione.

Per non funzionava se inserito nell'istruzione "on_movie_end"

Quello qui sotto viceversa funziona perfettamente.





Codice:
#!/bin/bash
video_file="$1"
cartella="/mnt/ramdisk/"
dur="DUR"
txt="txt"
parte=$(echo "$video_file" | cut -c17-32)
filetxt=$cartella$dur$parte$txt
duration=$(ffmpeg -i "$video_file" -hide_banner 2>&1 | grep Duration | awk '{print $2}' | tr -d ',' | cut -d '.' -f1 | awk -F ':' '{print ($1 * 3600) + ($2 * 60) + $3}')
echo "$duration" > "$filetxt"
echo "adesso faccio l'ftp di $video_file e di &filetxt"
wput -B -R --disable-tls "$video_file" ftp://xxx:xxx@xxx/miosito.it/cartella/video/
wput -B -R --disable-tls "$filetxt" ftp://xxx:xxx@xxx/miosito.it/cartella/video/
Risposta
  


Vai al forum:


Navigazione: 9 Ospite(i)
Forum con nuovi Post
Forum senza nuovi post
Forum bloccato
Forum Redirect