今天要说的是一个高速视频流的采集和传输的问题,我不是研究这一块的,没有使用什么算法,仅仅是兴趣导致我很想搞懂这个问题。
,,,1,首先是视频数据(摄像头图像]的采集,通常可以使用vfw在vc或者vb下实现,这个库我用的不好,所以一直不怎么会用。现在我们用到的是python的videocapture库,这个库用起来很简单,如下:
从VideoCapture进口设备 凸轮=设备() cam.setResolution(320240) #设置显示分辨率 cam.saveSnapshot (demo.jpg) #抓取并保存图片
,这样,你就得到了一张图片。
,,,当然,要实现比较高速的采集,每次都要保存图片是不大可能的,这样弄下来每次采集一张图片已经接近1秒钟,这个速度我们是无法忍受的。
更好的解决方式是直接这样:<代码> im=cam.getImage() 代码>返回的是一个图像对象,是一个内存块,对它操作就快速多了。
,,,2、如何传输图片& # 63;我不知道网络电视这种视频是怎么传输的,我的想法很简单,每次传送一幅图片。
在本程序中,每次传送的RGB图像的大小为160 * 120。这样,需要的数据量为:
,,,,, <代码>,d=160 * 120 * 3=56.25 kB 代码>
,,,我选择80000 b .
,,,下面是发送端代码:
进口套接字 导入图片 从VideoCapture进口设备 凸轮=设备() cam.setResolution (320240) clisocket=socket.socket(插座。AF_INET socket.SOCK_DGRAM) 而1: 我=cam.getImage () 我=im.resize ((160120)) da=im.tostring () clisocket。sendto (da (127.0.0.1, 1234)) s.close ()
,,
,,,我使用了pygame作为实时图像显示界面,因为pygame是经过优化的高速图形库,不知道有没有使用directshow的,我想应该用了吧. .
,,,关于pygame请参考www.pygame.org
,,,下面是接收端代码:,,,
进口套接字 导入图片 pygame导入系统,系统 pygame。当地进口* pygame.init () 屏幕=pygame.display.set_mode ((160120)) pygame.display。set_caption(网络摄像头) pygame.display.flip () svrsocket=socket.socket(插座。AF_INET socket.SOCK_DGRAM) svrsocket.bind ((127.0.0.1, 1234)) 时钟=pygame.time.Clock() #计算帧速 而1: 数据、地址=svrsocket.recvfrom (80000) camshot=pygame.image.frombuffer(数据,(160120),“RGB”) 在pygame.event.get事件(): 如果事件。==pygame类型。戒烟:sys.exit () 屏幕上。位块传输(camshot (0, 0)) pygame.display.update () 打印clock.get_fps() #在终端打印帧速 clock.tick ()
,,,程序终于完成了,测试一下效果怎么样把,为了方便,我把客户端和服务端都设成了本机,端口为1234 .
,,,运行程序,哇,简直不可思议,最高竟然达到230 fps !(右边的终端)
以上所述是小编给大家介绍的基于python实现高速视频传输程序,希望对大家有所帮助,如果大家有任何疑问请给我留的言,小编会及时回复大家的。在此也非常感谢大家对网站的支持。
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!