由于需要對我開發(fā)別的軟件進行使用培訓,想到需要個錄屏工具恬汁,于是用下面簡單的幾行代碼便實現(xiàn)了屏幕錄制。
需要安裝的幾個包是:
pip install numpy Matplotlib
pip install opencv-python
pip install Pillow(python3.x 這樣安裝; python2.x pip install PIL)
from PIL import ImageGrab
import numpy as np
import cv2
p = ImageGrab.grab()#獲得當前屏幕
k=np.zeros((200,200),np.uint8)
a,b=p.size#獲得當前屏幕的大小
fourcc = cv2.VideoWriter_fourcc(*'XVID')#編碼格式
video = cv2.VideoWriter('test.avi', fourcc, 16, (a, b))#輸出文件命名為test.mp4,幀率為16溢十,可以自己設置
while True:
????im = ImageGrab.grab()
????imm=cv2.cvtColor(np.array(im), cv2.COLOR_RGB2BGR)#轉為opencv的BGR格式 ????video.write(imm)
????cv2.imshow('imm', k)
????if cv2.waitKey(1) & 0xFF == ord('q'):
????????break
video.release()
cv2.destroyAllWindows()
這個demo是輸入q退出懊缺。
但是總是不能正確的錄制出視頻文件巨税,顯示大小為0KB蟋定。最后發(fā)現(xiàn)是電腦上沒有響應的視頻解碼庫導致的。
將fourcc = cv2.VideoWriter_fourcc(*'XVID')#編碼格式
改為?fourcc = cv2.VideoWriter_fourcc(*'MJPG')
FourCC 就是一個4 字節(jié)碼草添,用來確定視頻的編碼格式驶兜。可用的編碼列表
可以從fourcc.org查到远寸。這是平臺依賴的抄淑。下面這些編碼器對我來說是有用個。
? In Fedora: DIVX, XVID, MJPG, X264, WMV1, WMV2. (XVID is
more preferable. MJPG results in high size video. X264 gives
very small size video)
? In Windows: DIVX (More to be tested and added)
? In OSX : (I don’t have access to OSX. Can some one fill this?)
FourCC 碼以下面的格式傳給程序驰后,以MJPG 為例:
cv2.cv.FOURCC('M','J','P','G') 或者cv2.cv.FOURCC(*'MJPG')肆资。
錄屏加錄音的簡單實現(xiàn)demo
import wave
from pyaudioimport PyAudio,paInt16
from PILimport ImageGrab
import numpyas np
import cv2
from moviepy.editorimport *
from moviepy.audio.fximport all
framerate=8000
NUM_SAMPLES=2000
channels=1
sampwidth=2
TIME=2
def save_wave_file(filename,data):
'''save the date to the wavfile'''
? ? wf=wave.open(filename,'wb')
wf.setnchannels(channels)
wf.setsampwidth(sampwidth)
wf.setframerate(framerate)
wf.writeframes(b"".join(data))
wf.close()
def my_record():
pa=PyAudio()
stream=pa.open(format = paInt16,channels=1,
? ? ? ? ? ? ? ? ? rate=framerate,input=True,
? ? ? ? ? ? ? ? ? frames_per_buffer=NUM_SAMPLES)
my_buf=[]
p = ImageGrab.grab()# 獲得當前屏幕
? ? k = np.zeros((200, 200), np.uint8)
a, b = p.size# 獲得當前屏幕的大小
# fourcc = cv2.VideoWriter_fourcc(*'XVID')#編碼格式
# fourcc = cv2.VideoWriter_fourcc(*'MJPG')
? ? fourcc = cv2.VideoWriter_fourcc(*'DIVX')# 編碼格式
? ? video = cv2.VideoWriter('test.avi', fourcc,3, (a, b))# 輸出文件命名為test.mp4,幀率為16,可以自己設置
? ? while True:
string_audio_data = stream.read(NUM_SAMPLES)
my_buf.append(string_audio_data)
im = ImageGrab.grab()
imm = cv2.cvtColor(np.array(im), cv2.COLOR_RGB2BGR)# 轉為opencv的BGR格式
? ? ? ? video.write(imm)
cv2.imshow('wb', k)
# string_audio_data = stream.read(NUM_SAMPLES)
# my_buf.append(string_audio_data)
? ? ? ? print('.')
if cv2.waitKey(1) &0xFF ==ord('q'):
break
? ? # video.release()
# cv2.destroyAllWindows()
? ? save_wave_file('01.wav',my_buf)
stream.close()
video.release()
cv2.destroyAllWindows()
if __name__ =='__main__':
my_record()
print('Over!')
audioclip = AudioFileClip("01.wav")
videoclip = VideoFileClip("test.avi")
videoclip2 = videoclip.set_audio(audioclip)
video = CompositeVideoClip([videoclip2])
video.write_videofile("test2.mp4",codec='mpeg4')