Ich hatte auch erst das Problem, nach gefühlten 1000... Anleitungen hab ich die für mich ausreichende Lösung gefunden.
Delay im Webbrowser = nicht erkennbar
Pi verbunden via Ethernet (LAN) = läuft
Pi verbunden via Ethernet (Wlan) = geht auch aber nur so 800x600 sonst ruckelts, aber kein direktes Delay wie bei anderen Lösungen
Eckdaten:
RaspberryPi B (1.000 MHz und aktivem 40x40 Lüfter)
CPU-Last währen mjpeg Stream: ca. 45% bei 720p + 20% ksoftirq/d
Das Streaming löse ich mit mjpg-streamer, Anleitung + benötigte Dateien gabs hier http://www.cam-in-box.de/?p=184.
Aus dieser Anleitung hab ich mir aber nur den Streaming Part übernommen, und wie folgt angepasst:
start_stream.sh
#!/bin/bash
if pgrep mjpg_streamer > /dev/null
then
echo "mjpg_streamer already running"
else
# Fluessige Darstellung
#LD_LIBRARY_PATH=/home/pi/cam/ /home/pi/cam/mjpg_streamer -i "input_raspicam.so -fps 30 -q 25 -x 800 -y 600" -o "output_http.so -p 9000 -w /home/pi/cam/www"
#LD_LIBRARY_PATH=/home/pi/cam/ /home/pi/cam/mjpg_streamer -i "input_raspicam.so -fps 30 -q 25 -x 1280 -y 720" -o "output_http.so -p 9000 -w /home/pi/cam/www"
# Aktive Settings
LD_LIBRARY_PATH=/home/pi/cam/ /home/pi/cam/mjpg_streamer -i "input_raspicam.so -fps 30 -q 25 -x 1280 -y 720" -o "output_http.so -p 9000 -w /home/pi/cam/www" > /dev/null 2>&1&
echo "mjpg_streamer started"
fi
Alles anzeigen
Als Webserver hab ich mir dann noch Apache + PHP installiert und folgende HTML erzeugt:
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>PiCam</title>
</head>
<body>
<img src="http://192.168.249.112:9000/?action=stream" height="720px" width="1280px" alt="...">
</body>
</html>
Wenn man den Stream nun auch noch in einem Python 3 Programm haben möchte, stößt man auf ähnliche Schwierigkeiten wie beim Streaming,
daher hier noch ein Ansatz für Python 3, als Basis diente eine Umsetzung in Python 2.7.
py3_viewer.py
import urllib.request
import io
from tkinter import *
from PIL import ImageTk, Image
class StreamViewer(Frame):
def __init__(self, root):
root.title("Test Application")
self.addFrame(root)
def addFrame(self,root):
frame = Frame(root, background="#FF0000")
self.addCanvas(frame)
frame.pack(fill=BOTH, expand=YES)
def addCanvas(self, frame):
self.canvas = Canvas(frame, background='#ffffff')
self.canvas.pack(fill=BOTH, expand=YES)
self.canvas.pack()
def addImage(self, photoimage):
self.canvas.create_image(0, 0, image=photoimage,anchor=NW)
def get(url):
req = urllib.request.Request(url)
f = urllib.request.urlopen(req)
return f.read()
def streamfile(tbk, root):
f = get('http://192.168.249.112:9000/?action=snapshot')
img=Image.open(io.BytesIO(f))
imagetk = ImageTk.PhotoImage(img)
tbk.addImage(imagetk)
root.update()
root = Tk()
tbk = StreamViewer(root)
root.geometry("%dx%d+0+0" % (1280, 720))
root.resizable(False,False)
while(1):
streamfile(tbk,root)
Alles anzeigen