Поток Python MJPEG не работает вне VLC

Я создаю потоковый mjpeg с некоторых IP-камер, потоковая передача с VLC работает отлично, просто не работают внутри веб-страницы и других корпоративных устройств, где отлично работают другие потоки MJPEG, взятые из Интернета

вот мой код:

class Streamer(Thread):
    def __init__(self, *args, **kwargs):
        self.container = kwargs.pop("container", None)
        # self.q = kwargs.pop("queue", None)
        # self.stream = kwargs.pop("stream", None)
        super(Streamer, self).__init__(*args, **kwargs)



    def run(self):
        try:
            print("dichiarazione handler")
            server = ThreadedHTTPServer(('192.168.1.182', 8080), HandlerArguments(self.container))

            print('started httpserver...')
            server.serve_forever()
        except KeyboardInterrupt:
            print('^C received, shutting down server')
            server.socket.close()

def HandlerArguments(init_args):
    class MyHandler(BaseHTTPRequestHandler):
        def __init__(self, *args, **kwargs):
            self.container = init_args
            super(MyHandler, self).__init__(*args, **kwargs)

        def do_GET(self):
            print("GET")
            if self.path.endswith('.mjpeg'):
                self.container.stream = True
                self.send_response(200)
                self.send_header('Pragma:', 'no-cache')
                self.send_header('Cache-Control:', 'no-cache')
                self.send_header('Content-type:', 'multipart/x-mixed-replace;boundary=--myboundary')
                self.end_headers()
                try:
                    while self.container.stream == True:
                        # print(self.queue.qsize())
                        print("ciclo")
                        img = self.container.finalq.get()
                        ret, img_jpg = cv2.imencode(".jpeg", img, (cv2.IMWRITE_JPEG_QUALITY, 90))
                        self.wfile.write('--myboundary'.encode('utf-8'))
                        self.send_header('Content-type:','image/jpeg')
                        # self.send_header('Content-length:', str(len(img_jpg)))
                        self.end_headers()
                        img_str = img_jpg.tostring()
                        self.wfile.write(img_str)
                        # self.wfile.write('--myboundary\r\n'.encode('utf-8'))
                        # self.send_response(200)
                        # time.sleep(0.05)
                except:
                    self.container.stream = False
                    while not self.container.finalq.empty():
                        self.container.finalq.get()
            elif self.path.endswith('.jpg'):
                self.send_response(200)
                self.send_header('Pragma:', 'no-cache')
                self.send_header('Cache-Control:', 'no-cache')
                self.send_header('Content-type:','image/jpeg')
                self.end_headers()
                img = self.container.finalq.get()
                ret, img_jpg = cv2.imencode(".jpeg", img, (cv2.IMWRITE_JPEG_QUALITY, 90))
                # self.send_header('Content-length:', str(len(img_jpg)))
                img_str = img_jpg.tostring()
                self.wfile.write(img_str)


    return MyHandler

class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
#class ThreadedHTTPServer(HTTPServer):
    """Handle requests in a separate thread."""

Я думаю, что проблема в заголовке запроса, в частности, это поток, взятый из Интернета, по сравнению с моим потоком

curl -I http://85.90.40.19/mjpg/video.mjpg
HTTP/1.0 200 OK
Cache-Control: no-cache
Pragma: no-cache
Expires: Thu, 01 Dec 1994 16:00:00 GMT
Connection: close
Content-Type: multipart/x-mixed-replace; boundary=--myboundary
///////
curl -I http://192.168.1.182:8080/stream.mjpeg
HTTP/1.0 501 Unsupported method ('HEAD')
Server: BaseHTTP/0.6 Python/3.4.0
Date: Mon, 20 Jul 2015 10:00:54 GMT
Content-Type: text/html;charset=utf-8
Connection: close
Content-Length: 474

Особенно в моей просьбе я вижу:

Content-Type: text/html;charset=utf-8

в то время как в моем коде я бегу

self.send_header('Content-type:','image/jpeg')

Заранее спасибо, ребята:)

1 ответ

curl -I отправляет запрос HTTP HEAD.

В вашем коде вы обрабатываете только HTTP- запросы GET:

def do_GET(self):

Смотрите сообщение об ошибке: HTTP/1.0 501 Unsupported method ('HEAD')

Обрабатывать HEAD- запросы тоже:

def do_HEAD(self):

и вывести ожидаемые заголовки, так как клиенты могут выдавать HEAD перед GET.

Другие вопросы по тегам