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实现一个简单的项目监控
Mar 31 Python
深入Python解释器理解Python中的字节码
Apr 01 Python
Python常用小技巧总结
Jun 01 Python
python实现微信自动回复功能
Apr 11 Python
将TensorFlow的模型网络导出为单个文件的方法
Apr 23 Python
flask session组件的使用示例
Dec 25 Python
python版DDOS攻击脚本
Jun 12 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
Aug 06 Python
解析Python3中的Import
Oct 13 Python
Python爬取爱奇艺电影信息代码实例
Nov 26 Python
Python面向对象封装操作案例详解 II
Jan 02 Python
基于python3实现倒叙字符串
Feb 18 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
PHP开发大型项目的一点经验
2006/10/09 PHP
php搜索文件程序分享
2015/10/30 PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
2016/08/19 PHP
php实现文章置顶功能的方法
2016/10/20 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
2017/02/15 PHP
PHP数组式访问接口ArrayAccess用法分析
2017/12/28 PHP
JavaScript 无符号右移运算符
2009/04/17 Javascript
jQuery 标题的自动翻转实现代码
2009/10/14 Javascript
Js 中debug方式
2010/02/07 Javascript
jQuery Select(单选) 模拟插件 V1.3.62 改进版
2010/07/17 Javascript
Json序列化和反序列化方法解析
2013/12/19 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
2015/03/19 Javascript
Underscore.js 1.3.3 中文注释翻译说明
2015/06/25 Javascript
JavaScript类型系统之基本数据类型与包装类型
2016/01/06 Javascript
IE8利用自带的setCapture和releaseCapture解决iframe的拖拽事件方法
2016/10/25 Javascript
javascript设计模式之策略模式学习笔记
2017/02/15 Javascript
vue仿element实现分页器效果
2018/09/13 Javascript
Vue发布项目实例讲解
2019/07/17 Javascript
vue中的v-if和v-show的区别详解
2019/09/01 Javascript
小程序组件传值和引入sass的方法(使用vant Weapp组件库)
2020/11/24 Javascript
一个月入门Python爬虫学习,轻松爬取大规模数据
2018/01/03 Python
python编写微信远程控制电脑的程序
2018/01/05 Python
Python爬虫使用代理IP的实现
2019/10/27 Python
python飞机大战 pygame游戏创建快速入门详解
2019/12/17 Python
python中time.ctime()实例用法
2021/02/03 Python
纯css3实现走马灯效果
2014/12/26 HTML / CSS
Sunglasses Shop荷兰站:英国最大的太阳镜独立在线零售商和供应商
2017/01/08 全球购物
Smallable英国家庭概念店:设计师童装及家居装饰
2017/07/05 全球购物
房产公证书范本
2014/04/10 职场文书
企业法人代表任命书
2014/06/06 职场文书
反腐倡廉剖析材料
2014/09/30 职场文书
新教师教学工作总结
2015/08/12 职场文书
小学一年级班主任工作经验交流材料
2015/11/02 职场文书
小程序教您怎样你零成本推广获取数万用户的方法
2019/07/30 职场文书
python爬取豆瓣电影TOP250数据
2021/05/23 Python
win11电脑关机鼠标灯还亮怎么解决? win11关机后鼠标灯还亮解决方法
2023/01/09 数码科技