2015-10-31 4 views
0

У меня модель B2 Pi, в котором я модуль Pi Cam и у меня есть питон колба приложение, которое я следовал из следующего miguelgrinberg блог http://blog.miguelgrinberg.com/post/video-streaming-with-flaskПи Колба потокового видео останавливает сообщение об ошибке: [ERRNO 32] Разбитые трубы

https://github.com/miguelgrinberg/flask-video-streaming

и я добавил GEvent как веб-сервер для обслуживания нескольких потоков подключения камеры потокового и измененный сценарий выглядит следующим образом

#!/usr/bin/env python 
from flask import Flask, render_template, Response 
from gevent import monkey; monkey.patch_all() 


# Raspberry Pi camera module (requires picamera package) 
from camera_pi import Camera 

app = Flask(__name__) 


@app.route('/') 
def index(): 
    """Video streaming home page.""" 
    return render_template('index.html') 


def gen(camera): 
    """Video streaming generator function.""" 
    while True: 
     frame = camera.get_frame() 
     yield (b'--frame\r\n' 
       b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n') 


@app.route('/video_feed') 
def video_feed(): 
    """Video streaming route. Put this in the src attribute of an img tag.""" 
    return Response(gen(Camera()), 
        mimetype='multipart/x-mixed-replace; boundary=frame') 


if __name__ == '__main__': 
    monkey.patch_all() 
    from gevent.wsgi import WSGIServer 
    WSGIServer(('', 5000),app).serve_forever() 
    #app.run(host='0.0.0.0', debug=True, threaded=True) 

Каждый раз, когда я запускаю сервер и пытаюсь получить к нему доступ с помощью клиента, я получил это сообщение об ошибке

Наряду с этим сервер останавливает потоковое mjpeg через 30 минут и более после его запуска. Я также закомментировать раздел, где нет никакой связи на 10 сек

In Camera_pi.py file

# if there hasn't been any clients asking for frames in** 
      # the last 10 seconds stop the thread 
      #if time.time() - cls.last_access > 10000: 
      # break 

Сообщение об ошибке после того, как клиент подключиться к серверу, даже если это сообщение появляется еще я могу смотреть потоковое, но не более чем за 30 минут или более после того, как 30 + мин кадр в браузере замерзает и обновить также не работает я должен CTRL + C питона app.py и запустить его снова:

(streampi)[email protected] ~/svsapp/streampi $ python app.py 
Traceback (most recent call last): 
    File "/home/pi/svsapp/streampi/local/lib/python2.7/site-packages/gevent/pywsgi.py", line 508, in handle_one_response 
    self.run_application() 
    File "/home/pi/svsapp/streampi/local/lib/python2.7/site-packages/gevent/pywsgi.py", line 495, in run_application 
    self.process_result() 
    File "/home/pi/svsapp/streampi/local/lib/python2.7/site-packages/gevent/pywsgi.py", line 486, in process_result 
    self.write(data) 
    File "/home/pi/svsapp/streampi/local/lib/python2.7/site-packages/gevent/pywsgi.py", line 376, in write 
    self._write(data) 
    File "/home/pi/svsapp/streampi/local/lib/python2.7/site-packages/gevent/pywsgi.py", line 369, in _write 
    self._sendall(data) 
    File "/home/pi/svsapp/streampi/local/lib/python2.7/site-packages/gevent/pywsgi.py", line 355, in _sendall 
    self.socket.sendall(data) 
    File "/home/pi/svsapp/streampi/local/lib/python2.7/site-packages/gevent/socket.py", line 460, in sendall 
    data_sent += self.send(_get_memory(data, data_sent), flags) 
    File "/home/pi/svsapp/streampi/local/lib/python2.7/site-packages/gevent/socket.py", line 445, in send 
    return sock.send(data, flags) 
error: [Errno 32] Broken pipe 
{'GATEWAY_INTERFACE': 'CGI/1.1', 
'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 
'HTTP_ACCEPT_ENCODING': 'gzip, deflate, sdch', 
'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.8,hi;q=0.6', 
'HTTP_CONNECTION': 'keep-alive', 
'HTTP_HOST': '192.168.1.6:5000', 
'HTTP_UPGRADE_INSECURE_REQUESTS': '1', 
'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36', 
'PATH_INFO': '/video_feed', 
'QUERY_STRING': '', 
'REMOTE_ADDR': '192.168.1.4', 
'REMOTE_PORT': '55311', 
'REQUEST_METHOD': 'GET', 
'SCRIPT_NAME': '', 
'SERVER_NAME': 'niravpi', 
'SERVER_PORT': '5000', 
'SERVER_PROTOCOL': 'HTTP/1.1', 
'SERVER_SOFTWARE': 'gevent/1.0 Python/2.7', 
'werkzeug.request': None, 
'wsgi.errors': <open file '<stderr>', mode 'w' at 0x76d850d0>, 
'wsgi.input': <gevent.pywsgi.Input object at 0x763cb5d0>, 
'wsgi.multiprocess': False, 
'wsgi.multithread': False, 
'wsgi.run_once': False, 
'wsgi.url_scheme': 'http', 
'wsgi.version': (1, 0)} failed with error 

192.168.1.4 - - [2015-10-31 14:44:53] "GET /video_feed HTTP/1.1" socket 479452 5.199595 

ответ

0

разбитый ошибка трубы указывает на то, что колба пытался писать в сокет, что был закрыт с другого конца, который является стороной клиент.

Вы получите эту ошибку, если у вас есть потоковая передача и внезапное закрытие окна браузера. В этом случае ошибка безобидна, она просто заставляет поток, который обслуживал этот клиент, останавливаться, что вам нужно, когда клиент уходит.

Вы также получите эту ошибку при любых прерываниях соединения. Чтобы потоковая передача была более надежной, вам необходимо установить систему на место, чтобы проверить, что клиентское соединение является живым, а когда нет, возможно, инициирует перезагрузку изображения, чтобы потоковая передача была восстановлена.

Чтобы проверить, что клиент остается подключенным, вы можете записать временную метку, когда клиент извлек последний видеокадр. Затем вызов Ajax, посланный клиентом, может проверить, как давно был извлечен фрейм, и если он длиннее некоторого порога, вы объявляете соединение сломанным и запускаете обновление изображения с клиента.