Python+opencv+pyaudio实现带声音屏幕录制


Posted in Python onDecember 23, 2019

基于个人的爱好和现实的需求,决定用Python做一个屏幕录制的脚本。因为要看一些加密的视频,每次都要登录,特别麻烦,遂决定用自己写的脚本,将加密视频的播放过程全程录制下来,这样以后看自己的录播就好了。结合近期自己学习的内容,正好用Python来练练手,巩固自己的学习效果。

经过多番搜索,决定采用Python+opencv+pyaudio来实现屏幕录制。网上搜索到的录屏,基本都是不带声音的,而我要实现的是带声音的屏幕录制。下面就开始一步一步的实现吧。

声音录制

import pyaudio
import wave
import sys

CHUNK = 1024
if len(sys.argv) < 2:
 print("Plays a wave file.\n\nUsage: %s filename.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)
while data != '':
 stream.write(data)
 data = wf.readframes(CHUNK)

stream.stop_stream()
stream.close()
p.terminate()

简洁回调函数版音频录制

import pyaudio
import wave
import time
import sys

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
def callback(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")
while stream.is_active():
 time.sleep(1)
 time_count += 1

stream.stop_stream()
stream.close()
wf.close()
p.terminate()
print("* recording done!")

视频录制(无声音)

from PIL import ImageGrab
import numpy as np
import cv2

image = ImageGrab.grab()#获得当前屏幕
width = image.size[0]
height = image.size[1]
print("width:", width, "height:", height)
print("image mode:",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,可以自己设置
while True:
 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)
 if cv2.waitKey(1) & 0xFF == ord('q'):
  break
video.release()
cv2.destroyAllWindows()

录制的音频与视频合成为带声音的视频

录制200帧,带音频的MP4视频,单线程

import wave
from pyaudio import PyAudio,paInt16
from PIL import ImageGrab
import numpy as np
import cv2
from moviepy.editor import *
from moviepy.audio.fx import all
import time

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
def callback(in_data, frame_count, time_info, status):
 wf.writeframes(in_data)
 if audio_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("image mode:",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("video recording!!!!!")
stream.start_stream()
print("audio recording!!!!!")
record_count = 0
while True:
 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
while stream.is_active():
 time.sleep(1)

stream.stop_stream()
stream.close()
wf.close()
p.terminate()
print("audio recording done!!!!!")

video.release()
cv2.destroyAllWindows()
print("video recording done!!!!!")

print("video audio merge!!!!!")
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中的函数编程
Apr 13 Python
python实现数组插入新元素的方法
May 22 Python
Python对数据库操作
Mar 28 Python
python中numpy.zeros(np.zeros)的使用方法
Nov 07 Python
python实现文件的分割与合并
Aug 29 Python
numpy创建单位矩阵和对角矩阵的实例
Nov 29 Python
python数据库开发之MongoDB安装及Python3操作MongoDB数据库详细方法与实例
Mar 18 Python
python适合做数据挖掘吗
Jun 16 Python
python中rb含义理解
Jun 18 Python
关于tensorflow softmax函数用法解析
Jun 30 Python
Python 字典一个键对应多个值的方法
Sep 29 Python
python 实现ping测试延迟的两种方法
Dec 10 Python
python 实现屏幕录制示例
Dec 23 #Python
关于ZeroMQ 三种模式python3实现方式
Dec 23 #Python
Python 内置函数globals()和locals()对比详解
Dec 23 #Python
Python 项目转化为so文件实例
Dec 23 #Python
python 解决cv2绘制中文乱码问题
Dec 23 #Python
python 实现查询Neo4j多节点的多层关系
Dec 23 #Python
python 多进程队列数据处理详解
Dec 23 #Python
You might like
搜索和替换文件或目录的一个好类--很实用
2006/10/09 PHP
PHP 字符截取 解决中文的截取问题,不用mb系列
2009/09/29 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
浅析php中抽象类和接口的概念以及区别
2013/06/27 PHP
php版微信公众平台接口开发之智能回复开发教程
2016/09/22 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2021/03/09 PHP
JavaScript DOM 学习第二章 编辑文本
2010/02/19 Javascript
javascript中的toFixed固定小数位数 简单实例分享
2013/07/12 Javascript
js中的getAttribute方法使用示例
2014/08/01 Javascript
jQuery+css实现的时钟效果(兼容各浏览器)
2016/01/27 Javascript
jquery分隔Url的param方法(推荐)
2016/05/25 Javascript
jQuery基本选择器和层次选择器学习使用
2017/02/27 Javascript
JavaScript数据结构之二叉查找树的定义与表示方法
2017/04/12 Javascript
vue-cli中的babel配置文件.babelrc实例详解
2018/02/22 Javascript
浅谈Angularjs中不同类型的双向数据绑定
2018/07/16 Javascript
NodeJS 实现多语言的示例代码
2018/09/11 NodeJs
element-ui多文件上传的实现示例
2019/04/10 Javascript
vue如何实现自定义底部菜单栏
2019/07/01 Javascript
Nodejs实现WebSocket代码实例
2020/05/19 NodeJs
小程序实现tab标签页
2020/11/16 Javascript
在Python中测试访问同一数据的竞争条件的方法
2015/04/23 Python
Python实现基于KNN算法的笔迹识别功能详解
2018/07/09 Python
PyQt5实现从主窗口打开子窗口的方法
2019/06/19 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
2019/12/13 Python
Python scrapy爬取小说代码案例详解
2020/07/09 Python
python之pygame模块实现飞机大战完整代码
2020/11/29 Python
python 爬取百度文库并下载(免费文章限定)
2020/12/04 Python
Python lxml库的简单介绍及基本使用讲解
2020/12/22 Python
诺心蛋糕官网:LE CAKE
2018/08/25 全球购物
俄罗斯品牌服装在线商店:VIPAVENUE
2020/08/10 全球购物
为什么如下的代码int a=100,b=100;long int c=a * b;不能工作
2013/11/29 面试题
小学生暑假感言
2014/02/06 职场文书
机械工程学院大学生求职信
2014/05/25 职场文书
不同意离婚上诉状
2015/05/23 职场文书
长江七号观后感
2015/06/11 职场文书
详解Mysql和Oracle之间的误区
2021/05/18 MySQL