📄 vreceive.py
字号:
#! /usr/bin/env python# Receive live video UDP packets.# Usage: Vreceive [port]import sysimport structfrom socket import * # syscalls and support functionsfrom SOCKET import * # <sys/socket.h>from IN import * # <netinet/in.h>import selectimport structimport gl, GL, DEVICEsys.path.append('/ufs/guido/src/video')import LiveVideoOutimport regsubimport getoptfrom senddefs import *# Print usage message and exit(2).def usage(msg): print msg print 'usage: Vreceive [-m mcastgrp] [-p port] [-c type]' print '-m mcastgrp: multicast group (default ' + `DEFMCAST` + ')' print '-p port : port (default ' + `DEFPORT` + ')' print '-c type : signal type: rgb8, grey or mono (default rgb8)' sys.exit(2)# Main program: parse options and main loop.def main(): sys.stdout = sys.stderr group = DEFMCAST port = DEFPORT width = DEFWIDTH height = DEFHEIGHT vtype = 'rgb8' try: opts, args = getopt.getopt(sys.argv[1:], 'm:p:c:') except getopt.error, msg: usage(msg) try: for opt, optarg in opts: if opt == '-p': port = string.atoi(optarg) if opt == '-m': group = gethostbyname(optarg) if opt == '-c': vtype = optarg except string.atoi_error, msg: usage('bad integer: ' + msg) s = opensocket(group, port) gl.foreground() gl.prefsize(width, height) wid = gl.winopen('Vreceive') gl.winconstraints() gl.qdevice(DEVICE.ESCKEY) gl.qdevice(DEVICE.WINSHUT) gl.qdevice(DEVICE.WINQUIT) lvo = LiveVideoOut.LiveVideoOut(wid, width, height, vtype) ifdlist = [gl.qgetfd(), s.fileno()] ofdlist = [] xfdlist = [] timeout = 1.0 selectargs = (ifdlist, ofdlist, xfdlist, timeout) while 1: if gl.qtest(): dev, val = gl.qread() if dev in (DEVICE.ESCKEY, \ DEVICE.WINSHUT, DEVICE.WINQUIT): break if dev == DEVICE.REDRAW: lvo.reshapewindow() elif s.avail(): data = s.recv(16*1024) pos, w, h = struct.unpack('hhh', data[:6]) if (w, h) <> (width, height): x, y = gl.getorigin() y = y + height - h gl.winposition(x, x+w-1, y, y+h-1) width, height = w, h lvo.resizevideo(width, height) lvo.putnextpacket(pos, data[6:]) else: x = select.select(selectargs) lvo.close()# Subroutine to create and properly initialize the receiving socketdef opensocket(group, port): # Create the socket s = socket(AF_INET, SOCK_DGRAM) # Allow multiple copies of this program on one machine s.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1) # (Not strictly needed) # Bind the port to it s.bind('', port) # Look up the group once group = gethostbyname(group) # Construct binary group address group_bytes = eval(regsub.gsub('\.', ',', group)) grpaddr = 0 for byte in group_bytes: grpaddr = (grpaddr << 8) | byte # Construct struct mreq from grpaddr and ifaddr ifaddr = INADDR_ANY mreq = struct.pack('ll', grpaddr, ifaddr) # Add group membership s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq) return smain()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -