10.4.15

Linux Text Tools - danke CT!

Alle Wörter eines langen Textes in eine Wortliste überführen, Leerzeichen ausfiltern, Sortieren und nach Anzahl ausgeben.
Mit stopwords.txt werden bekannte Füllwörter ausgefiltert.


fmt -0 langertext.txt | tr -d [:punct:] | grep -w -i -v -f stopwords.txt | sort | uniq -c | sort -n

3.4.15

Video aufnehmen von Webcam unter Linux

Wie meistens ist dies eher ein kleiner "Reminder For ME".

Um ein Video von einer angeschlossenen Webcam aufzuzeichnen, lässt sich natürlich wieder avconv nutzen.

Unter Ubuntu habe ich nacheinander verschiedene Cams angeschlossen, u.a. die PS3 EyeToy(!) und alles funktionierte auf Anhieb.
Unter Windows die EyeToy in Betrieb zu nehmen ist ein Graus. Dort wird ein kostenpflichtiges Treiberprogramm angeboten, was bei mir aber auch nich funktionierte.

Nun denn, um ein Video aufnehmen einfach die Webcam einstecken und gucken, ob sie unter /dev/video[x] erscheint (x=Nr. der Kamera).

Danach

avconv -f video4linux2 -r 25 -i /dev/video1 -vcodec mpeg4 -y webcam1.mp4

und ein MP4 Video der angeschlossenen Kamera (hier video1) wird erstellt.

Will man etwa ein Video einer Webcam aufnehmen und dazu ein Audiosignal eines Mikrofons (vom PC), so kann man folgendermaßen vorgehen.

Mittels

arecord -l

erhält man eine Liste der Audio-Geräte, in meinem Fall sieht die Ausgabe so aus:

 **** Liste der Hardware-Geräte (CAPTURE) ****
Karte 0: MID [HDA Intel MID], Gerät 0: 92HD81B1C5 Analog [92HD81B1C5 Analog]
  Sub-Geräte: 1/1
  Sub-Gerät #0: subdevice #0

Dieses Audio-Gerät ist also Gerät 0,0 (Sub-Gerät/Subdevice).

Mit plughw kann man dieses Gerät entsprechend eintragen und somit Video von der externen Webcam und Ton vom internen Mikro aufnehmen.
Meine Zeile sieht dann z.B. so aus:

avconv -f video4linux2 -i /dev/video1 -f alsa -i plughw:0,0 -ar 22050 -ab 64k -acodec ac3_fixed -vcodec mpeg4 -vb 2000k -y test.mp4



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. ...