IP-camera maakt snapshots via RTSP

IP cameraMijn nieuwe mini IP-camera geeft een prima 1080p beeld, maar kan niet simpel even een snapshot maken als je dat wilt. Gelukkig is er een oplossing, die dit probleem verhelpt en de camera meteen een stukje veiliger maakt.

Waarom snapshots?

Het opvragen van een snapshot kost veel minder dataverkeer dan een videostream en dat is belangrijk als je de snapshot opvraagt via 3G of 4G vanaf je mobiele telefoon. Ik heb nog even geprobeerd of je misschien door het faken van beweging de camera een snapshot kunt laten wegschrijven met bewegings­detectie, maar als dat uiteindelijk zou lukken, dan gebeurt dat altijd op PAL resolutie, in plaats van HD.

Behalve dat, realiseer ik me ook steeds beter, dat vanwege de veiligheid het eigenlijk onverantwoord risicovol is om een IP-camera zonder externe beveiliging met het internet te verbinden. Kan je deze twee problemen in één keer oplossen?

Unix script

Gelukkig kwam ik op internet een oplossing voor het eerste probleem tegen: Tweaker „thinkpad” beschrijft in zijn blog een doeltreffende methode om een snapshot uit een camera te krijgen, deze oplossing werkt in de bash shell onder Linux. Zoals dat gaat in de Unix-wereld, is het normaal dat je kunt voortborduren op het werk van anderen. Ik combineerde de oplossing van thinkpad met een oplossing van Paul Buchheit (een naam die ik niet kende, maar die wel een WikiPedia pagina blijkt te hebben), die op zijn blog een manier beschrijft om, ook in bash, een simpele webserver te maken met de Unix tool netcat.

Zo maakte ik het onderstaande bash script; een zelfgemaakte videoserver. De buitenwereld heeft geen contact met de IP-camera, maar alleen met dit script op de Linux machine. Dit script kan je bijvoorbeeld draaien op de homeserver.

Als je een snapshot van de camera wilt zien, kijk je op poort 8080 van de homeserver. Als de homeserver dezelfde minuut nog een snapshot gemaakt heeft, dan krijg je dat te zien, anders zoekt hij verbinding met de camera en probeert een nieuwe snapshot te maken en krijg je die te zien. Alle snapshots blijven op de homeserver bewaard in de folder Pictures.

#!/bin/bash
# This script serves snapshot of an H.264 streaming IP-camera
IP=’192.168.1.10′ # My IP-camera
snappath=’/home/x11/Pictures/snapshot_’ # Path to store snapshots
port=’8080′ # Port for webserver
# Uses: nc, avconv

# Webserver based on:
# http://paulbuchheit.blogspot.nl/2007/04/webserver-in-bash.html

# Snapshots IP-camera based on:
# http://thinkpad.tweakblogs.net/blog/12055/ip-camera-zonder-snapshot-mogelijkheid-m-punt-bv-script-toch-een-snapshot-verkrijgen-uit-rtsp-stream!

# ToDo: clean up old snapshot files
# ToDo: security / access control

# Switches the IP-camera on for 1 second, to make a HD snapshot and save it as a jpeg file
# Parameter: filename of the new snapshot
function makeSnapshot {
echo “Creating snapshot of IP camera $IP in file $1”
#ffmpeg
avconv -rtsp_transport tcp -i “rtsp://$IP:554/user=admin&password=&channel=1&stream=0.sdp?real_stream–rtp-caching=100” -f image2 -vframes 1 -pix_fmt yuvj420p “$1”
}

# Send a snapshot
# Parameter: filename of the existing snapshot
function sendSnapshot {
echo -e ‘HTTP/1.0 200 OK\nContent-type: image/jpeg\n’ | cat – $1 >$RESP
}

# Send errormessage when no new snapshot could be made
function sendError {
message=$1
cat >$RESP <<EOF
HTTP/1.0 200 OK
Cache-Control: private
Content-Type: text/plain
Server: bash/2.0
Connection: Close
Content-Length: ${#message}

$message
EOF
}

#############################################

# Create named pipe
RESP=/tmp/webresp
[ -p $RESP ] || mkfifo $RESP

# Main loop
while true ; do
( cat $RESP ) | nc -l -p $port | (
# Read and log the request
REQ=`while read L && [ " " "<" "$L" ] ; do echo "$L" ; done`
echo "[`date '+%Y-%m-%d %H:%M:%S'`] $REQ" | head -1

# Determine the filename of the current snapshot
currentSnapshot=$snappath`/bin/date '+%Y-%m-%d_%H.%M.%S'`".jpeg"

# If this snapshot doesn't exist yet, then try to create it
if [ ! -e $currentSnapshot ] ; then
makeSnapshot $currentSnapshot
fi

# Send the snapshot if it now exists, else send an errormessage
if [ ! -e $currentSnapshot ] ; then
sendError 'Error creating snapshot'
else
sendSnapshot $currentSnapshot
fi
)
done

Standaardsoftware

Deze oplossing ziet er heel ingewikkeld uit en kan heel erg weinig, er is bijvoorbeeld geen enkele vorm van toegangsbeveiliging ingebouwd. Wat je ook zou kunnen gebruiken, is kant-en-klare videoserver software, voorzien van veel opties, bijvoorbeeld:

Overigens: sommige van deze software ondersteunt het ook om camera’s die via USB zijn aangesloten op de computer te gebruiken als bewakingscamera. En misschien is het wel gemakkelijker om een goede USB camera te vinden, dan om een goede IP camera te vinden.

Een gedachte over “IP-camera maakt snapshots via RTSP

Vertel jouw mening

Vul je gegevens in of klik op een icoon om in te loggen.

WordPress.com logo

Je reageert onder je WordPress.com account. Log uit / Bijwerken )

Twitter-afbeelding

Je reageert onder je Twitter account. Log uit / Bijwerken )

Facebook foto

Je reageert onder je Facebook account. Log uit / Bijwerken )

Google+ photo

Je reageert onder je Google+ account. Log uit / Bijwerken )

Verbinden met %s