Installationschritte des mjpg-streamers.
sudo apt-get -y update && sudo apt-get -y upgrade
sudo apt-get install build-essential libjpeg-dev imagemagick subversion libv4l-dev checkinstall
sudo modprobe bcm2835-v4l2
Sollte es hier zu Problemen kommen ist wahrscheinlich die Kamera nicht aktiviert. „sudo raspi-config“
raspistill -o /tmp/test.jpg
svn checkout svn://svn.code.sf.net/p/mjpg-streamer/code/ mjpg-streamer-code
cd mjpg-streamer-code/mjpg-streamer
Als nächstes erstellen wir einen Patch. Dieser wird benötigt damit der streamer mit motion jpg umgehen kann und wir auch eine Ausgabe im Webinterface sehen. Ohne diesen Patch bekommt man nur ein Bild als yuv Ausgabe und die Auslastung des Pi steigt enorm an. Deswegen ist der nächste Schritt sehr wichtig!
Diesen Inhalt per Drag and Drop einfügen.
--- plugins/input_uvc/input_uvc.c (revision 174)
+++ plugins/input_uvc/input_uvc.c (working copy)
@@ -405,9 +405,13 @@
if(pcontext->videoIn->formatIn == V4L2_PIX_FMT_YUYV) {
DBG("compressing frame from input: %d\n", (int)pcontext->id);
pglobal->in[pcontext->id].size = compress_yuyv_to_jpeg(pcontext->videoIn, pglobal->in[pcontext->id].buf, pcontext->videoIn->framesizeIn, gquality);
+ /* copy this frame's timestamp to user space */
+ pglobal->in[pcontext->id].timestamp = pcontext->videoIn->buf.timestamp;
} else {
DBG("copying frame from input: %d\n", (int)pcontext->id);
- pglobal->in[pcontext->id].size = memcpy_picture(pglobal->in[pcontext->id].buf, pcontext->videoIn->tmpbuffer, pcontext->videoIn->buf.bytesused);
+ pglobal->in[pcontext->id].size = memcpy_picture(pglobal->in[pcontext->id].buf, pcontext->videoIn->tmpbuffer, pcontext->videoIn->tmpbytesused);
+ /* copy this frame's timestamp to user space */
+ pglobal->in[pcontext->id].timestamp = pcontext->videoIn->tmptimestamp;
}
#if 0
@@ -418,8 +422,6 @@
prev_size = global->size;
#endif
- /* copy this frame's timestamp to user space */
- pglobal->in[pcontext->id].timestamp = pcontext->videoIn->buf.timestamp;
/* signal fresh_frame */
pthread_cond_broadcast(&pglobal->in[pcontext->id].db_update);
Index: plugins/input_uvc/v4l2uvc.c
===================================================================
--- plugins/input_uvc/v4l2uvc.c (revision 174)
+++ plugins/input_uvc/v4l2uvc.c (working copy)
@@ -450,6 +450,8 @@
*/
memcpy(vd->tmpbuffer, vd->mem[vd->buf.index], vd->buf.bytesused);
+ vd->tmpbytesused = vd->buf.bytesused;
+ vd->tmptimestamp = vd->buf.timestamp;
if(debug)
fprintf(stderr, "bytes in used %d \n", vd->buf.bytesused);
Index: plugins/input_uvc/v4l2uvc.h
===================================================================
--- plugins/input_uvc/v4l2uvc.h (revision 174)
+++ plugins/input_uvc/v4l2uvc.h (working copy)
@@ -28,6 +28,7 @@
#include <stdio.h>
+#include <stdint.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
@@ -105,6 +106,8 @@
int framecount;
int recordstart;
int recordtime;
+ uint32_t tmpbytesused;
+ struct timeval tmptimestamp;
};
/* context of each camera thread */
Alles anzeigen
Hier bitte auf die Formatierung des codes aufpassen. Es gab deswegen schon so manches Problem.
Ich habe mal den Inhalt des patches in eine .txt Datei eingefügt. hier muß nur noch die Endung .txt entfernt und auf den Raspi übertragen werden.
Wir führen anschließend diese Befehle aus damit der Patch installiert wird und verlassen danach das Verzeichnis wieder.
patch -p0 < input_uvc_patch
make USE_LIBV4L2=true clean all
sudo make DESTDIR=/usr/local install
cd
Nun geben wir folgendes ein, nur um zu schauen das auch alles richtig installiert wurde und um den neuen Treiber V4L2 zu starten.
Hier dürfen keine Fehlermeldungen erscheinen.
Jetzt kann der Streamer gestartet werden, mit folgendem Befehl:
mjpg_streamer -i "/usr/local/lib/input_uvc.so -d /dev/video0 -n -r 1024x768 -f 24 –q 80" -o "/usr/local/lib/output_http.so -n -w /usr/local/www -p 9000"
Hier wird ein kleiner Webserver gestartet der unter Deiner Adresse des raspberypi zu erreichen ist aber mit der Port Nummer 9000.
Bsp.:
192.168.178.200:9000
Man kann den Stream natürlich auch noch zusätzlich in eine Datei leiten zb. so:
mjpg_streamer -i "/usr/local/lib/input_uvc.so -d /dev/video0 -n -r 1024x768 -f 24 –q 80" -o "/usr/local/lib/output_http.so -n -w /usr/local/www -p 9000" -o "/usr/local/lib/output_file.so -f /backup/record-video -d 15000"
Hier wird der Stream in den Ordner /backup/record-video abgelegt.
Man kann auch die Parameter verändern zb. die Auflösung (Parameter -r) bzw. die Frames (Parameter -f) und die Quality (Parameter -q)
Es gibt noch mehr Parameter doch hier verweise ich auf folgende Web Seite: Dokumentation
Die Hilfe zu allen Plugins kann mit:
aufgerufen werden.
Wenn man den mjpg_streamer beim booten automatisch gestartet haben möchte der sollte folgende Datei anlegen:
Mit diesem Inhalt.
#!/bin/sh
# /etc/init.d/mjpg_streamer
### BEGIN INIT INFO
# Provides: mjpg_streamer
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: MJPG_Streamer_autostart
### END INIT INFO
start()
{
modprobe bcm2835-v4l2
sleep:2
echo "Starting mjpg-streamer..."
/usr/local/bin/mjpg_streamer -i "/usr/local/lib/input_uvc.so -d /dev/video0 -n -r 1024x768 -f 24 –q 80" -o "/usr/local/lib/output_http.so -n -w /usr/local/www -p 9000" >/dev/null 2>&1 &
}
stop()
{
echo "Stopping mjpg-streamer..."
kill -9 $(pidof mjpg_streamer) >/dev/null 2>&1
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo "Usage: $0 {start|stop|restart}"
;;
esac
exit 0
Alles anzeigen
Hiermit das script ausführbar machen.
Mit diesem Befehl wird die eben erstellte Autostart-Datei in den Autostart eingetragen:
Danach kannst Du es bequem per:
starten.
Beenden kannst Du es mit:
Sollten Fragen oder Anregungen sein dann stellt diese einfach, ich versuche diese zu beantworten.
............................................................................................................................................................................................................................................................................
Neue Einstellungsmöglichkeiten der PiCam oder der USB-Cam
Mittlerweile habe ich eine Möglichkeit gefunden um zusätzliche Einstellungen für die Picam oder USB-Cam zu setzen diese ist zwar etwas umständlich aber ich habe es bis jetzt nicht anders hinbekommen.
Wir installieren ein tool hiermit:
Anschliesend wollen wir wissen welche Einstellungen sich verändern lassen:
Die Meldung sieht dann folgendermassen aus:
pi@DoorPi:~ $ uvcdynctrl -cv
[libwebcam] Invalid V4L2 control type encountered: ctrl_id = 0x00980001, name = 'User Controls', type = 6
[libwebcam] Invalid or unsupported V4L2 control encountered: ctrl_id = 0x00980001, name = 'User Controls'
[libwebcam] Unknown V4L2 user control ID encountered: 0x0098090E (V4L2_CID_USER_BASE + 14)
[libwebcam] Unknown V4L2 user control ID encountered: 0x0098090F (V4L2_CID_USER_BASE + 15)
[libwebcam] Unknown V4L2 user control ID encountered: 0x00980914 (V4L2_CID_USER_BASE + 20)
[libwebcam] Unknown V4L2 user control ID encountered: 0x00980915 (V4L2_CID_USER_BASE + 21)
[libwebcam] Unknown V4L2 user control ID encountered: 0x0098091F (V4L2_CID_USER_BASE + 31)
[libwebcam] Unknown V4L2 user control ID encountered: 0x00980922 (V4L2_CID_USER_BASE + 34)
[libwebcam] Unknown V4L2 user control ID encountered: 0x0098092A (V4L2_CID_USER_BASE + 42)
[libwebcam] Invalid V4L2 control type encountered: ctrl_id = 0x00990001, name = 'Codec Controls', type = 6
[libwebcam] Invalid or unsupported V4L2 control encountered: ctrl_id = 0x00990001, name = 'Codec Controls'
[libwebcam] Unknown V4L2 MPEG control ID encountered: 0x009909CE (V4L2_CID_MPEG_BASE + 206)
[libwebcam] Unknown V4L2 MPEG control ID encountered: 0x009909CF (V4L2_CID_MPEG_BASE + 207)
[libwebcam] Unknown V4L2 MPEG control ID encountered: 0x009909E2 (V4L2_CID_MPEG_BASE + 226)
[libwebcam] Unknown V4L2 MPEG control ID encountered: 0x00990A66 (V4L2_CID_MPEG_BASE + 358)
[libwebcam] Unknown V4L2 MPEG control ID encountered: 0x00990A67 (V4L2_CID_MPEG_BASE + 359)
[libwebcam] Unknown V4L2 MPEG control ID encountered: 0x00990A6B (V4L2_CID_MPEG_BASE + 363)
[libwebcam] Invalid V4L2 control type encountered: ctrl_id = 0x009A0001, name = 'Camera Controls', type = 6
[libwebcam] Invalid or unsupported V4L2 control encountered: ctrl_id = 0x009A0001, name = 'Camera Controls'
[libwebcam] Invalid V4L2 control type encountered: ctrl_id = 0x009A0913, name = 'Auto Exposure, Bias', type = 9
[libwebcam] Invalid or unsupported V4L2 control encountered: ctrl_id = 0x009A0913, name = 'Auto Exposure, Bias'
[libwebcam] Unknown V4L2 camera class (UVC) control ID encountered: 0x009A0914 (V4L2_CID_CAMERA_CLASS_BASE + 20)
[libwebcam] Unknown V4L2 camera class (UVC) control ID encountered: 0x009A0916 (V4L2_CID_CAMERA_CLASS_BASE + 22)
[libwebcam] Invalid V4L2 control type encountered: ctrl_id = 0x009A0917, name = 'ISO Sensitivity', type = 9
[libwebcam] Invalid or unsupported V4L2 control encountered: ctrl_id = 0x009A0917, name = 'ISO Sensitivity'
[libwebcam] Unknown V4L2 camera class (UVC) control ID encountered: 0x009A0918 (V4L2_CID_CAMERA_CLASS_BASE + 24)
[libwebcam] Unknown V4L2 camera class (UVC) control ID encountered: 0x009A0919 (V4L2_CID_CAMERA_CLASS_BASE + 25)
[libwebcam] Unknown V4L2 camera class (UVC) control ID encountered: 0x009A091A (V4L2_CID_CAMERA_CLASS_BASE + 26)
[libwebcam] Invalid V4L2 control type encountered: ctrl_id = 0x009D0001, name = 'JPEG Compression Controls', type = 6
[libwebcam] Invalid or unsupported V4L2 control encountered: ctrl_id = 0x009D0001, name = 'JPEG Compression Controls'
[libwebcam] Unknown V4L2 control ID encountered: 0x009D0903
[libwebcam] Invalid or unsupported V4L2 control encountered: ctrl_id = 0x009D0903, name = 'Compression Quality'
Listing available controls for device video0:
Brightness
ID : 0x00000001,
Type : Dword,
Flags : { CAN_READ, CAN_WRITE },
Values : [ 0 .. 100, step size: 1 ],
Default : 50
Contrast
ID : 0x00000002,
Type : Dword,
Flags : { CAN_READ, CAN_WRITE },
Values : [ -100 .. 100, step size: 1 ],
Default : 0
Saturation
ID : 0x00000004,
Type : Dword,
Flags : { CAN_READ, CAN_WRITE },
Values : [ -100 .. 100, step size: 1 ],
Default : 0
Red Balance
ID : 0x0000100e,
Type : Dword,
Flags : { CAN_READ, CAN_WRITE },
Values : [ 1 .. 7999, step size: 1 ],
Default : 1000
Blue Balance
ID : 0x0000100f,
Type : Dword,
Flags : { CAN_READ, CAN_WRITE },
Values : [ 1 .. 7999, step size: 1 ],
Default : 1000
Horizontal Flip
ID : 0x00001014,
Type : Boolean,
Flags : { CAN_READ, CAN_WRITE },
Values : [ 0 .. 1, step size: 1 ],
Default : 0
Vertical Flip
ID : 0x00001015,
Type : Boolean,
Flags : { CAN_READ, CAN_WRITE },
Values : [ 0 .. 1, step size: 1 ],
Default : 0
Power Line Frequency
ID : 0x0000000d,
Type : Choice,
Flags : { CAN_READ, CAN_WRITE },
Values : { 'Disabled'[0], '50 Hz'[1], '60 Hz'[2], 'Auto'[3] },
Default : 1
Sharpness
ID : 0x00000007,
Type : Dword,
Flags : { CAN_READ, CAN_WRITE },
Values : [ -100 .. 100, step size: 1 ],
Default : 0
Color Effects
ID : 0x0000101f,
Type : Choice,
Flags : { CAN_READ, CAN_WRITE },
Values : { 'None'[0], 'Black & White'[1], 'Sepia'[2], 'Negative'[3], 'Emboss'[4], 'Sketch'[5], 'Sky Blue'[6], 'Grass Green'[7], 'Skin Whiten'[8], 'Vivid'[9], 'Aqua'[10], 'Art Freeze'[11], 'Silhouette'[12], 'Solarization'[13], 'Antique'[14], 'Set Cb/Cr'[15] },
Default : 0
Rotate
ID : 0x00001022,
Type : Dword,
Flags : { CAN_READ, CAN_WRITE },
Values : [ 0 .. 360, step size: 90 ],
Default : 0
Color Effects, CbCr
ID : 0x0000102a,
Type : Dword,
Flags : { CAN_READ, CAN_WRITE },
Values : [ 0 .. 65535, step size: 1 ],
Default : 32896
Video Bitrate Mode
ID : 0x000030ce,
Type : Choice,
Flags : { CAN_READ, CAN_WRITE },
Values : { 'Variable Bitrate'[0], 'Constant Bitrate'[1] },
Default : 0
Video Bitrate
ID : 0x000030cf,
Type : Dword,
Flags : { CAN_READ, CAN_WRITE },
Values : [ 25000 .. 25000000, step size: 25000 ],
Default : 10000000
Repeat Sequence Header
ID : 0x000030e2,
Type : Boolean,
Flags : { CAN_READ, CAN_WRITE },
Values : [ 0 .. 1, step size: 1 ],
Default : 0
H264 I-Frame Period
ID : 0x00003166,
Type : Dword,
Flags : { CAN_READ, CAN_WRITE },
Values : [ 0 .. 2147483647, step size: 1 ],
Default : 60
H264 Level
ID : 0x00003167,
Type : Choice,
Flags : { CAN_READ, CAN_WRITE },
Values : { '1'[0], '1b'[1], '1.1'[2], '1.2'[3], '1.3'[4], '2'[5], '2.1'[6], '2.2'[7], '3'[8], '3.1'[9], '3.2'[10], '4'[11] },
Default : 11
H264 Profile
ID : 0x0000316b,
Type : Choice,
Flags : { CAN_READ, CAN_WRITE },
Values : { 'Baseline'[0], 'Constrained Baseline'[1], 'Main'[2], 'High'[4] },
Default : 4
Auto Exposure
ID : 0x0000000f,
Type : Choice,
Flags : { CAN_READ, CAN_WRITE },
Values : { 'Auto Mode'[0], 'Manual Mode'[1] },
Default : 0
Exposure Time, Absolute
ID : 0x00000011,
Type : Dword,
Flags : { CAN_READ, CAN_WRITE },
Values : [ 1 .. 10000, step size: 1 ],
Default : 1000
Exposure, Dynamic Framerate
ID : 0x00000010,
Type : Boolean,
Flags : { CAN_READ, CAN_WRITE },
Values : [ 0 .. 1, step size: 1 ],
Default : 0
White Balance, Auto & Preset
ID : 0x00004014,
Type : Choice,
Flags : { CAN_READ, CAN_WRITE },
Values : { 'Manual'[0], 'Auto'[1], 'Incandescent'[2], 'Fluorescent'[3], 'Fluorescent H'[4], 'Horizon'[5], 'Daylight'[6], 'Flash'[7], 'Cloudy'[8], 'Shade'[9] },
Default : 1
Image Stabilization
ID : 0x00004016,
Type : Boolean,
Flags : { CAN_READ, CAN_WRITE },
Values : [ 0 .. 1, step size: 1 ],
Default : 0
ISO Sensitivity, Auto
ID : 0x00004018,
Type : Choice,
Flags : { CAN_READ, CAN_WRITE },
Values : { 'Manual'[0], 'Auto'[1] },
Default : 1
Exposure, Metering Mode
ID : 0x00004019,
Type : Choice,
Flags : { CAN_READ, CAN_WRITE },
Values : { 'Average'[0], 'Center Weighted'[1], 'Spot'[2] },
Default : 0
Scene Mode
ID : 0x0000401a,
Type : Choice,
Flags : { CAN_READ, CAN_WRITE },
Values : { 'None'[0], 'Night'[8], 'Sports'[11] },
Default : 0
Alles anzeigen
Lasst Euch nicht iritieren von den Fehlermeldungen.
Man kann erkennen das man die Rotation sowie Horizontaler bzw. Vertikaler Flip und auch viele andere Einstellungen angepasst werden können.
Aber konzentrieren wir uns auf die Funktion Rotation:
Wir geben nun folgendes ein:
Et voila, das Bild hat sich um 90° gegen den Uhrzeigersinn gedreht.
Ich hoffe ich konnte Euch/Dir damit helfen.