介绍
这篇文章将为大家详细讲解有关Python + opencv + pyaudio如何实现带声音屏幕录制,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
基于个人的爱好和现实的需求,决定用Python做一个屏幕录制的脚本。因为要看一些加密的视频,每次都要登录,特别麻烦,遂决定用自己写的脚本,将加密视频的播放过程全程录制下来,这样以后看自己的录播就好了。结合近期自己学习的内容,正好用Python来练练手,巩固自己的学习效果。
经过多番搜索,决定采用Python + opencv + pyaudio来实现屏幕录制。网上搜索到的录屏,基本都是不带声音的,而我要实现的是带声音的屏幕录制。下面就开始一步一步的实现吧。
<>强声音录制强>
import pyaudio import 波 import 系统 CHUNK =1024 if len (sys.argv), & lt;, 2: ,打印(“Plays  a wave 文件。\ n \ nUsage:, % s filename.wav", %, sys.argv [0]) ,sys.exit (1) 时间=wf wave.open (sys.argv [1],, & # 39; rb # 39;) 时间=p pyaudio.PyAudio () 时间=stream p.open(格式=p.get_format_from_width (wf.getsampwidth ()), ,,,渠道=wf.getnchannels (), ,,,速度=wf.getframerate (), ,,,输出=True) 时间=data wf.readframes(块) while data  !=, & # 39; & # 39;: ,stream.write(数据)=,,data  wf.readframes(块) stream.stop_stream () stream.close () p.terminate ()
简洁回调函数版音频录制
import pyaudio import 波 import 时间 import 系统 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, & # 39; wb # 39;) wf.setnchannels(渠道) wf.setsampwidth (p.get_sample_size(格式) wf.setframerate(率) time_count =0 def 回调(frame_count, in_data,还以为,time_info,状态): ,wf.writeframes (in_data) ,如果(& lt; time_count 10): return 才能;(in_data, pyaudio.paContinue) ,其他的: return 才能;(in_data, pyaudio.paComplete) 时间=stream p.open(格式=p.get_format_from_width (wf.getsampwidth ()), ,,,渠道=wf.getnchannels (), ,,,速度=wf.getframerate (), ,,,输入=True, ,,,stream_callback=回调) stream.start_stream () 打印(“*,recording") while stream.is_active (): ,time . sleep (1) time_count +=, 1 stream.stop_stream () stream.close () wf.close () p.terminate () 打印(“*,recording 完成了!“)
<强>视频录制(无声音)强>
得到PIL import ImageGrab import numpy  as np import cv2 时间=image ImageGrab.grab() #获得当前屏幕 时间=width image.size [0] 时间=height image.size [1] 打印(“宽度:“,宽度,,“高度:“,,高度) print (“image 模式:“,image.mode) k=np.zeros((宽度、高度),np.uint8) 时间=fourcc cv2.VideoWriter_fourcc (* & # 39; xvid # 39;) #编码格式 时间=video cv2.VideoWriter (& # 39; test.avi& # 39;,, fourcc,, 25日,(宽度,高度)) #输出文件命名为test.mp4,帧率为16,可以自己设置 while 真正的:=,,img_rgb  ImageGrab.grab () ,img_bgr=cv2.cvtColor (np.array (img_rgb), cv2.COLOR_RGB2BGR) #转为opencv的BGR格式 ,video.write (img_bgr) ,cv2.imshow (& # 39; imm # 39;,, img_bgr) ,if cv2.waitKey (1),,, 0 xff ==,奥德(& # 39;提问# 39;): ,打破 video.release () cv2.destroyAllWindows ()
<强>录制的音频与视频合成为带声音的视频强>
录制200帧,带音频的MP4视频,单线程
import 波 得到pyaudio import  PyAudio paInt16 得到PIL import  ImageGrab import numpy  as np import cv2 得到moviepy.editor import * 得到moviepy.audio.fx import import 时间 CHUNK =1024 FORMAT =pyaudio.paInt16 时间=CHANNELS 2 RATE =44100 时间=WAVE_OUTPUT_FILENAME “output.wav" 时间=p pyaudio.PyAudio () 时间=wf wave.open (WAVE_OUTPUT_FILENAME, & # 39; wb # 39;) wf.setnchannels(渠道) wf.setsampwidth (p.get_sample_size(格式) wf.setframerate(率) audio_record_flag =,真的 def 回调(frame_count, in_data,还以为,time_info,状态): ,wf.writeframes (in_data) ,if audio_record_flag: return 才能;(in_data, pyaudio.paContinue) ,其他的: return 才能;(in_data, pyaudio.paComplete) 时间=stream p.open(格式=p.get_format_from_width (wf.getsampwidth ()), ,,,渠道=wf.getnchannels (), ,,,速度=wf.getframerate (), ,,,输入=True, ,,,stream_callback=回调) 时间=image ImageGrab.grab() #获得当前屏幕 时间=width image.size [0] 时间=height image.size [1] 打印(“宽度:“,宽度,,“高度:“,,高度) print (“image 模式:“,image.mode) k=np.zeros((宽度、高度),np.uint8) 时间=fourcc cv2.VideoWriter_fourcc (* & # 39; xvid # 39;) #编码格式 null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null nullPython + opencv + pyaudio如何实现带声音屏幕录制