2017-07-28 39 views
1

我试图从我的树莓pi使用烧瓶API在Python中流视频。这样我可以在我的工作站上处理各个帧。就数据传输而言,它工作得很好。然而,在客户端,读取帧的过程引入了滞后1-3秒,这在实时应用中是不希望的。我可以在我的网页浏览器中查看视频播放,没有任何延迟,这证明我的覆盆子pi和网络是无辜的。问题在于的方法从字节流中读取单个帧。有关消除这种应用程序中的延迟的任何想法。以下是我的客户端应用程序代码。完整的源代码的示例应用程序可以在这里找到:https://github.com/shehzi-khan/video-streaming加速使用摄像头或IP摄像头联网设备的视频播放

import cv2 
import urllib 
import numpy as np 

stream = urllib.urlopen('http://192.168.100.128:5000/video_feed') 
bytes = '' 
while True: 
    bytes += stream.read(1024) 
    a = bytes.find(b'\xff\xd8') 
    b = bytes.find(b'\xff\xd9') 
    if a != -1 and b != -1: 
     jpg = bytes[a:b+2] 
     bytes = bytes[b+2:] 
     img = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8), cv2.IMREAD_COLOR) 
     cv2.imshow('Video', img) 
     if cv2.waitKey(1) == 27: 
      exit(0) 

回答

0

主要建议:

  • 寻找结束标记,然后搜索开始标记

  • 读更多的数据(例如64KB )

  • 放下其他帧并只显示最后的

我无法测试它,但这里是通用代码:

import cv2 
import urllib 
import numpy as np 

stream = urllib.urlopen('http://192.168.100.128:5000/video_feed') 
bytes = '' 
while True: 
    buff = stream.read(64 * 1024) 
    bytes += buff 
    if buff.rfind(b'\xff\xd9') != -1: # buff is smaller than bytes 
     endmark = bytes.rfind(b'\xff\xd9') + 2 
     startmark = bytes[:endmark - 2].rfind(b'\xff\xd8') 

     jpg = bytes[startmark:endmark] # please, check indexes! I could mess up with them. 
     bytes = bytes[endmark:] 

     img = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8), cv2.IMREAD_COLOR) 
     cv2.imshow('Video', img) 
     if cv2.waitKey(1) == 27: 
      exit(0) 

我怎么找不到stream.read行为。如果他等到缓冲区已满,则需要减小缓冲区大小。如果他只读了N个字节直到流结束,它会工作。

+0

让我试试这个。 –

+0

嘿,我已经转移到项目的其他部分,现在我的对象检测和电机驱动部分完成了我回到视频流部分。那么我试图增加或减少缓冲区大小,但没有任何工作。在另一侧视频流从浏览器平稳播放。 –