Python+opencv+pyaudio如何实现带声音屏幕录制
这篇文章将为大家详细讲解有关Python+opencv+pyaudio如何实现带声音屏幕录制,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
基于个人的爱好和现实的需求,决定用Python做一个屏幕录制的脚本。因为要看一些加密的视频,每次都要登录,特别麻烦,遂决定用自己写的脚本,将加密视频的播放过程全程录制下来,这样以后看自己的录播就好了。结合近期自己学习的内容,正好用Python来练练手,巩固自己的学习效果。
经过多番搜索,决定采用Python+opencv+pyaudio来实现屏幕录制。网上搜索到的录屏,基本都是不带声音的,而我要实现的是带声音的屏幕录制。下面就开始一步一步的实现吧。
声音录制
importpyaudio importwave importsys CHUNK=1024 iflen(sys.argv)<2: print("Playsawavefile.\n\nUsage:%sfilename.wav"%sys.argv[0]) sys.exit(-1) wf=wave.open(sys.argv[1],'rb') p=pyaudio.PyAudio() stream=p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate(), output=True) data=wf.readframes(CHUNK) whiledata!='': stream.write(data) data=wf.readframes(CHUNK) stream.stop_stream() stream.close() p.terminate()
简洁回调函数版音频录制
importpyaudio importwave importtime importsys CHUNK=1024 FORMAT=pyaudio.paInt16 CHANNELS=2 RATE=44100 RECORD_SECONDS=10 WAVE_OUTPUT_FILENAME="output.wav" p=pyaudio.PyAudio() wf=wave.open(WAVE_OUTPUT_FILENAME,'wb') wf.setnchannels(CHANNELS) wf.setsampwidth(p.get_sample_size(FORMAT)) wf.setframerate(RATE) time_count=0 defcallback(in_data,frame_count,time_info,status): wf.writeframes(in_data) if(time_count<10): return(in_data,pyaudio.paContinue) else: return(in_data,pyaudio.paComplete) stream=p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate(), input=True, stream_callback=callback) stream.start_stream() print("*recording") whilestream.is_active(): time.sleep(1) time_count+=1 stream.stop_stream() stream.close() wf.close() p.terminate() print("*recordingdone!")
视频录制(无声音)
fromPILimportImageGrab importnumpyasnp importcv2 image=ImageGrab.grab()#获得当前屏幕 width=image.size[0] height=image.size[1] print("width:",width,"height:",height) print("imagemode:",image.mode) k=np.zeros((width,height),np.uint8) fourcc=cv2.VideoWriter_fourcc(*'XVID')#编码格式 video=cv2.VideoWriter('test.avi',fourcc,25,(width,height)) #输出文件命名为test.mp4,帧率为16,可以自己设置 whileTrue: img_rgb=ImageGrab.grab() img_bgr=cv2.cvtColor(np.array(img_rgb),cv2.COLOR_RGB2BGR)#转为opencv的BGR格式 video.write(img_bgr) cv2.imshow('imm',img_bgr) ifcv2.waitKey(1)&0xFF==ord('q'): break video.release() cv2.destroyAllWindows()
录制的音频与视频合成为带声音的视频
录制200帧,带音频的MP4视频,单线程
importwave frompyaudioimportPyAudio,paInt16 fromPILimportImageGrab importnumpyasnp importcv2 frommoviepy.editorimport* frommoviepy.audio.fximportall importtime CHUNK=1024 FORMAT=pyaudio.paInt16 CHANNELS=2 RATE=44100 WAVE_OUTPUT_FILENAME="output.wav" p=pyaudio.PyAudio() wf=wave.open(WAVE_OUTPUT_FILENAME,'wb') wf.setnchannels(CHANNELS) wf.setsampwidth(p.get_sample_size(FORMAT)) wf.setframerate(RATE) audio_record_flag=True defcallback(in_data,frame_count,time_info,status): wf.writeframes(in_data) ifaudio_record_flag: return(in_data,pyaudio.paContinue) else: return(in_data,pyaudio.paComplete) stream=p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate(), input=True, stream_callback=callback) image=ImageGrab.grab()#获得当前屏幕 width=image.size[0] height=image.size[1] print("width:",width,"height:",height) print("imagemode:",image.mode) k=np.zeros((width,height),np.uint8) fourcc=cv2.VideoWriter_fourcc(*'XVID')#编码格式 video=cv2.VideoWriter('test.mp4',fourcc,9.5,(width,height)) #经实际测试,单线程下最高帧率为10帧/秒,且会变动,因此选择9.5帧/秒 #若设置帧率与实际帧率不一致,会导致视频时间与音频时间不一致 print("videorecording!!!!!") stream.start_stream() print("audiorecording!!!!!") record_count=0 whileTrue: img_rgb=ImageGrab.grab() img_bgr=cv2.cvtColor(np.array(img_rgb),cv2.COLOR_RGB2BGR)#转为opencv的BGR格式 video.write(img_bgr) record_count+=1 if(record_count>200): break print(record_count,time.time()) audio_record_flag=False whilestream.is_active(): time.sleep(1) stream.stop_stream() stream.close() wf.close() p.terminate() print("audiorecordingdone!!!!!") video.release() cv2.destroyAllWindows() print("videorecordingdone!!!!!") print("videoaudiomerge!!!!!") audioclip=AudioFileClip("output.wav") videoclip=VideoFileClip("test.mp4") videoclip2=videoclip.set_audio(audioclip) video=CompositeVideoClip([videoclip2]) video.write_videofile("test2.mp4",codec='mpeg4')
看来要提高帧率必须使用队列加多线程了,这一步等到以后来添加吧。不过总是觉得用OpenCV来实现视频录制,有点怪异,毕竟opencv是用来做图像与视频分析的,还是走正道认真捣鼓opencv该做的事情吧。
关于“Python+opencv+pyaudio如何实现带声音屏幕录制”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
推荐阅读
-
Python中怎么动态声明变量赋值
这篇文章将为大家详细讲解有关Python中怎么动态声明变量赋值,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文...
-
python中变量的存储原理是什么
-
Python中怎么引用传递变量赋值
这篇文章将为大家详细讲解有关Python中怎么引用传递变量赋值,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文...
-
python中怎么获取程序执行文件路径
python中怎么获取程序执行文件路径,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的...
-
Python中如何获取文件系统的使用率
Python中如何获取文件系统的使用率,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴...
-
Python中怎么获取文件的创建和修改时间
这篇文章将为大家详细讲解有关Python中怎么获取文件的创建和修改时间,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读...
-
python中怎么获取依赖包
今天就跟大家聊聊有关python中怎么获取依赖包,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据...
-
python怎么实现批量文件加密功能
-
python中怎么实现threading线程同步
小编给大家分享一下python中怎么实现threading线程同步,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!...
-
python下thread模块创建线程的方法
本篇内容介绍了“python下thread模块创建线程的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来...