python实现录制全屏和选择区域录屏功能
最近给客户演示程序运行结果,我就想到用Python写一个录屏程序,在网上能找到现成的源码,但是它的录屏是录制整个屏幕的。但是在屏幕桌面下方的任务栏工具栏里有些东西,不希望被录制到视频里,因此需要实现一个选择区域录屏,就像qq截图那样的。我编写的程序如下,在主函数的输入参数里有一个选项控制是全屏录制还是选择区域录制。在编写这个程序时,我有一个疑问,在初始化写视频VideoWriter函数的第4个参数,它表示视频帧的高和宽,全屏录制方式的参数是(height,width),选择区域录制的参数是(width,height)。我曾尝试过把这个参数统一写成(height,width)或者(width,height)。但是运行程序后,总有一种录屏方式保存的视频文件是无法打开的,文件大小是1kb,不知这是为何?
importcv2 fromPILimportImageGrab importnumpyasnp importargparse importtime globalimg globalpoint1,point2 defon_mouse(event,x,y,flags,param): globalimg,point1,point2 img2=img.copy() ifevent==cv2.EVENT_LBUTTONDOWN:#左键点击 point1=(x,y) cv2.circle(img2,point1,10,(0,255,0),thickness=2) cv2.imshow('image',img2) elifevent==cv2.EVENT_MOUSEMOVEand(flags&cv2.EVENT_FLAG_LBUTTON):#按住左键拖曳 cv2.rectangle(img2,point1,(x,y),(255,0,0),thickness=2) cv2.imshow('image',img2) elifevent==cv2.EVENT_LBUTTONUP:#左键释放 point2=(x,y) cv2.rectangle(img2,point1,point2,(0,0,255),thickness=2) cv2.imshow('image',img2) defselect_roi(frame): globalimg,point1,point2 img=cv2.cvtColor(np.array(frame),cv2.COLOR_RGB2BGR) winname='image' cv2.namedWindow(winname,cv2.WINDOW_NORMAL) cv2.setWindowProperty(winname,cv2.WND_PROP_FULLSCREEN,cv2.WINDOW_FULLSCREEN) cv2.setMouseCallback(winname,on_mouse) cv2.imshow(winname,img) cv2.waitKey(0) cv2.destroyAllWindows() returnpoint1,point2 if__name__=='__main__': parser=argparse.ArgumentParser() parser.add_argument('--fps',type=int,default=10,help='framepersecond') parser.add_argument('--total_time',type=int,default=15,help='videototaltime') parser.add_argument('--savename',type=str,default='video.mp4',help='savefilename') parser.add_argument('--screen_type',default=1,type=int,choices=[0,1],help='1:fullscreen,0:regionscreen') args=parser.parse_args() print('等到3秒,请切换到录屏的页面') ifargs.screen_type==0: print('PressEsctoclosewindow') time.sleep(3) curScreen=ImageGrab.grab()#获取屏幕对象 ifargs.screen_type: height,width=curScreen.size min_x,min_y,max_x,max_y=0,0,width,height fourcc=cv2.VideoWriter_fourcc(*'mp4v') video=cv2.VideoWriter(args.savename,fourcc,args.fps,(height,width)) else: point1,point2=select_roi(curScreen) min_x=min(point1[0],point2[0]) min_y=min(point1[1],point2[1]) max_x=max(point1[0],point2[0]) max_y=max(point1[1],point2[1]) height,width=max_y-min_y,max_x-min_x fourcc=cv2.VideoWriter_fourcc(*'mp4v') video=cv2.VideoWriter(args.savename,fourcc,args.fps,(width,height)) imageNum=0 whileTrue: imageNum+=1 captureImage=ImageGrab.grab()#抓取屏幕 frame=cv2.cvtColor(np.array(captureImage),cv2.COLOR_RGB2BGR) ifargs.screen_type==0: frame=frame[min_y:max_y,min_x:max_x,:] ifimageNumargs.fps*args.total_time: break video.release() cv2.destroyAllWindows()
到此这篇关于python实现录制全屏和选择区域录屏功能的文章就介绍到这了,更多相关python录屏内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!