24.3.15

Videos umwandeln und per HTML5 wiedergeben

Ausgangslage:

Ich hatte einige Videos mit meinem neuen Quadrocopter erstellt und wollte dieses "mal eben" für andere bereit stellen.
HTML5 unterstützt das Streamen von mp4 Videos, nicht aber von avi´s.
Das die Videos im avi-Format und einer Auflösung von 1280*720 vorliegen, sollen diese zunächst umgewandelt werden.

Das ist sehr einfach unter Linux (hier Ubuntu 12) möglich, wenn avconv installiert ist.

apt-get install libav-tools

Da der benötigte Codec vermutlich auch noch nicht vorhanden ist, sollte auch ein

apt-get install libavcodec-extra-53

hinterher geschoben werden.

Danach lässt sich ein Video sehr einfach konvertieren mit

avconv -i MOVI0000.avi -s 640x360 -vcodec libx264 MOVIE0000.mp4

 Ein solches Video lässt sich sehr einfach einbetten in HTML-Code mit

 <video width="640" height="360" controls autoplay >..
    <source src="MOVIE0000.mp4" type="video/mp4">..
    Sorry, dein Browser unterstützt kein HTML5 Video...
    </video>


Um die spätere Anzeige grafisch etwas aufzupeppen, bietet es sich an, Thumbnails der Videos zu erstellen. Möchte man von jedem mp4 Video ein Screenshot erstellen und als jpg speichern, lässt sich folgender Einzeiler verwenden:

for i in *.mp4; do avconv -i "$i" -ss 00:00:05 -s 320x180 -vsync 1 -qscale 1 -vframes 1 "${i%.mp4}.jpg"; done

Damit wird das aktuelle Verzeichnis gescannt, alle mp4 Dateien mit avconv bearbeitet und nach 5 Sekunden Laufzeit ein jpg-Bild im Format 320*180 Pixel gespeichert. Die Auflösung müsste je nach Ausgangsmaterial angepasst werden, um unschöne Ergebnisse zu vermeiden.


Wenn das soweit läuft, lässt sich auch schnell etwas scripten. Mit diesem kleinen Beispiel werden alle mp4 Dateien im Ordner "videos" gescannt und per Link aufgeführt. Wenn unter dem gleichen Dateinamen - mit der Endung jpg - eine Datei existiert, wird diese als Vorschaubild angezeigt und bei Klick auf den Link wird das entsprechende Video angezeigt.

// Verzeichnis, in dem die Videos und Vorschaubilder abgelegt sind
//
$dir="videos";
$directory=scandir($dir);
// Wenn Aktion gewählt, erstelle HTML-Gerüst für die selektiert Videodatei
//
if($_GET['action']=="show")
{
    $datei=$dir . "/" . strip_tags($_GET['file']);
    echo "<video width=\"1280\" height=\"720\" controls autoplay >";
    echo "<source src=\"$datei\" type=\"video/mp4\">";
    echo "Sorry, your browser doesn't support HTML5 video...";
    echo "</video><hr>";
}
// Gehe alle Dateien des Verzeichnisses durch
//
foreach($directory as $file)
{
    // Endung mp4?
    if(preg_match("/mp4$/", $file))
    {
        $datei = $dir . "/" . $file;
        $size=filesize($datei); // Dateigröße holen
        $creationdate=date("Y-m-d" ,filectime($datei)); // Erstellungsdatum der Datei
        // Gibt es eine Vorschaudatei?
        $thumbnail=$dir . "/" . str_replace("mp4","jpg",$file);
        $description="";
        if(file_exists($thumbnail))
        {
                 $description ="<img src=\"$thumbnail\" width=\"300\"> <br>";
         }
       $description.=$file . " " . human_filesize($size) . "  [$creationdate]";
       echo "<a href=\"" . $_SERVER['PHP_SELF'] . "?action=show&    file=$file\">$description</a><br>";
    }
}
function human_filesize($bytes, $decimals = 2) {
  $sz = 'BKMGTP';
  $factor = floor((strlen($bytes) - 1) / 3);
  return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor];
}

22.3.15

Screenshot vom laufenden Webcam Video erstellen

Ich besitze eine Wansview Cam, prinzipiell sollte es auch mit anderen Cams funktionieren, die eine Live-Video streamen.
Bei mir wird über Port 554 gestreamt und der Stream ist pw-geschützt.

avconv -y -i rtsp://[Benutzer]:[Passwort]@192.168.1.202:554 -vcodec mjpeg -vframes 1 -an -f rawvideo screenshot.jpg


Mit der Intek Tenvis geht es so:

avconv -y -i "rtsp://[user]:[password]@192.168.178.143:554/11" -vcodec mjpeg -vframes 1 -an -f rawvideo screenshot.jpg



DB Power:

avconv -y -i "rtsp://[user]:[pwd]@192.168.178.221:554/live/ch1" -vcodec mjpeg -vframes 1 -an -f rawvideo screenshot.jpg


Update (09/2017):
Viele Kamera besitzen eine eigene Snapshot-Url, die man nutzen kann. Damit wird verhindert, dass die Screenshots bei schlechter Netzwerkverbindung "unschön" werden.

Beispiele mit curl

Foscam FI9900
curl -k "https://192.168.178.223/cgi-bin/CGIProxy.fcgi?cmd=snapPicture2&usr=[BENUTZER]&pwd=[PASSWORT]" -o screenshot.jpg
Befehle der Foscam Kameras


VideoStreamType einstellen (MainStream auf HD):
curl -k "https://192.168.178.227/cgi-bin/CGIProxy.fcgi?cmd=setMainVideoStreamType&streamType=0&usr=BENUTZER&pwd=PASSWORT"

Status abrufen:
curl -k "https://192.168.178.227/cgi-bin/CGIProxy.fcgi?cmd=getMainVideoStreamType&usr=BENUTZER&pwd=PASSWORT"

DBPower h.264
 curl --digest -u "BENUTZER:PASSWORT" 192.168.178.225/mjpeg/snap.cgi?chn=0 -o screenshot.jpg

Wansview und andere Webcams ansteuern mit PHP und einfügen in FHEM

Seit neuestem bin ich Besitzer einer Wansview NC M620W.


Steuerung über PHP-Scripte

Kamera nach rechts drehen

$url="http://192.168.1.202";
$getstring="/web/cgi-bin/hi3510/param.cgi?cmd=ptzctrl&-step=1&-act=right&-speed=13";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url . $getstring);
//curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
//curl_setopt($ch, CURLOPT_USERPWD, 'admin:123456');

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
          'Content-Type: application/xml',
          'Connection: Keep-Alive',
          'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
          'Authorization: Basic [BASE64HASH]'
         
                                            ));
$data = curl_exec($ch);
echo $data;
curl_close($ch);


Einbindung in FHEM:

Dank dieser Anleitung hat es geklappt!


1. FHEM HTTPSRV aktiviert (in fhem.cfg):
define myCamWeb HTTPSRV cam /usr/share/web CAM

2. In /usr/share/web Datei index.html erstellt mit folgendem Inhalt:
<embed type="application/x-vlc-plugin" width= "1024" height= "768" name="player" autoplay="yes" loop="yes" target="rtsp://[Benutzer]:[Passwort]@192.168.1.202:554" />
3.  FHEM aktualisieren
4. Weblink erstellen (in Kommandozeile von FHEM):
define weblink_test weblink iframe https://<ip von fhem>/fhem/cam/index.html



Update:

Kamera fittek Tenvis

Steuerung
curl -H "Authorization: Basic YWRtaW46cmfdaHRub3c5OQ==" "http://192.168.178.221/web/cgi-bin/hi3510/ptzctrl.cgi?-step=1&-act=up&-speed=45"

Geht nicht: (?)
curl --digest -u "admin:2222" "http://192.168.178.223"



15.3.15

Cronjobs mit Zyxel NSA325

"Just a reminder" für mich.
Hardware Zyxel NSA325 mit ffp.

Damit Cronjobs auch nach einem Reboot ausgeführt werden, erstelle ich in

/ffp/start/

das Script cron.sh mit folgendem Inhalt:

#! /ffp/bin/sh

Background()
{
   while ! crontab -l | grep zyfw_downloader >/dev/null
   do
      sleep 10
   done
   sleep 10 # just to be sure
   cat /ffp/var/spool/cron.tab | crontab -
}

case $1 in
   start)
      if [ -f /ffp/var/spool/cron.tab ]
      then
         Background &
      fi
      ;;
   sto*)
      mkdir -p /ffp/var/spool/
      crontab -l >/ffp/var/spool/cron.tab
      ;;
esac

Das Ganze ausführbar machen und dann kann man mit

crontab -e Cronjobs bearbeiten, die nach einem Reboot bestehen bleiben, wenn man nach dem Editieren

/ffp/start/cron.sh store


eingibt.

Bilder nach Datum in Tagesordner verschieben

Nach einiger Suche habe ich den für mich ultimativen Einzeiler gefunden, um per Linux Bash Bilder in Unterordner, nach Tagen erstellt, zu verschieben.

find -iname '*.jpg' -printf 'mkdir -p %TY-%Tm-%Td; cp %p %TY-%Tm-%Td\n' | bash

Openhab und Ecoflow Max - API Anbindung

 Ich wollte die neu erworbene Powerstation in Openhab einbinden, um den aktuellen Status (Ladestand etc.) über Openhab auswerten zu können. ...