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中的闭包用法实例详解
May 05 Python
python关键字and和or用法实例
May 28 Python
python文件操作相关知识点总结整理
Feb 22 Python
python简单图片操作:打开\显示\保存图像方法介绍
Nov 23 Python
Python实现PS图像调整颜色梯度效果示例
Jan 25 Python
解决python3爬虫无法显示中文的问题
Apr 12 Python
对python调用RPC接口的实例详解
Jan 03 Python
python3 xpath和requests应用详解
Mar 06 Python
Python生成pdf目录书签的实例方法
Oct 29 Python
python生成随机数、随机字符、随机字符串
Apr 06 Python
Python 批量下载阴阳师网站壁纸
May 19 Python
Python实现随机生成迷宫并自动寻路
Jun 13 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
PHP5权威编程阅读学习笔记 附电子书下载
2012/07/05 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
2017/06/06 PHP
PDO::inTransaction讲解
2019/01/28 PHP
浅谈Laravel中的三种中间件的作用
2019/10/13 PHP
Mozilla中显示textarea中选择的文字
2006/09/07 Javascript
javascript仿qq界面的折叠菜单实现代码
2012/12/12 Javascript
Jquery 模板数据绑定插件的使用方法详解
2013/07/08 Javascript
解决jQuery使用JSONP时产生的错误
2015/12/02 Javascript
JavaScript构建自己的对象示例
2016/11/29 Javascript
EasyUI学习之DataGird分页显示数据
2016/12/29 Javascript
vue的toast弹窗组件实例详解
2018/05/14 Javascript
element-ui组件table实现自定义筛选功能的示例代码
2019/03/15 Javascript
Vue设置长时间未操作登录自动到期返回登录页
2020/01/22 Javascript
vscode 插件开发 + vue的操作方法
2020/06/05 Javascript
Vue 简单实现前端权限控制的示例
2020/12/25 Vue.js
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
2021/03/01 Vue.js
[01:12:53]完美世界DOTA2联赛PWL S2 Forest vs SZ 第一场 11.25
2020/11/26 DOTA
在Python的Flask框架下收发电子邮件的教程
2015/04/21 Python
python简单分割文件的方法
2015/07/30 Python
Python+Selenium自动化实现分页(pagination)处理
2017/03/31 Python
python使用Matplotlib改变坐标轴的默认位置
2019/10/18 Python
Python3创建Django项目的几种方法(3种)
2020/06/03 Python
django教程如何自学
2020/07/31 Python
Django实现简单的分页功能
2021/02/22 Python
12个不为大家熟知的HTML5设计小技巧
2016/06/02 HTML / CSS
英国鹦鹉店:Parrot Essentials
2018/12/03 全球购物
莫斯科制造商的廉价皮大衣:Fursk
2020/06/09 全球购物
介绍一下XMLHttpRequest对象
2012/02/12 面试题
WSDL的操作类型主要有几种
2013/07/19 面试题
十八届三中全会个人学习材料
2014/02/13 职场文书
小学校长竞聘演讲稿
2014/05/16 职场文书
2014年德育工作总结
2014/11/20 职场文书
环境保护宣传标语大全!
2019/06/28 职场文书
2019年度开业庆典祝福语大全!
2019/07/05 职场文书
超详细教你怎么升级Mysql的版本
2021/05/19 MySQL
安装配置mysql及Navicat prenium的详细流程
2021/06/10 MySQL