2015-07-20 54 views
0

我從一些IP攝像機創建流mjpeg,與VLC流完美工作,只是不工作的網頁和其他企業設備內的其他MJPEG流從其中採取互聯網工作完美Python的MJPEG流不工作以外的VLC

這裏是我的代碼:

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') 

謝謝:)

回答

0

curl -I發送HTTP HEAD請求。

在你的代碼正在處理只有HTTP GET請求

def do_GET(self):

看到錯誤消息:HTTP/1.0 501 Unsupported method ('HEAD')

手柄HEAD請求太:

def do_HEAD(self):

並輸出預期的標題,因爲客戶端可能在GET之前發出HEAD。