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使用爬虫猜密码
Feb 19 Python
django之session与分页(实例讲解)
Nov 13 Python
python如何实现int函数的方法示例
Feb 19 Python
基于Django用户认证系统详解
Feb 21 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
Apr 22 Python
python学习开发mock接口
Apr 28 Python
Python数据类型之Number数字操作实例详解
May 08 Python
python批量读取文件名并写入txt文件中
Sep 05 Python
python爬虫 批量下载zabbix文档代码实例
Aug 21 Python
Python利用命名空间解析XML文档
Aug 10 Python
python爬虫智能翻页批量下载文件的实例详解
Feb 02 Python
学会用Python实现滑雪小游戏,再也不用去北海道啦
May 20 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
thinkphp实现图片上传功能分享
2014/03/04 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
2014/06/19 PHP
PHP设计模式之简单投诉页面实例
2016/02/24 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
2019/02/15 PHP
JavaScript列表框listbox全选和反选的实现方法
2015/03/18 Javascript
JavaScript使用push方法添加一个元素到数组末尾用法实例
2015/04/06 Javascript
在Node.js应用中读写Redis数据库的简单方法
2015/06/30 Javascript
javascript实现框架高度随内容改变的方法
2015/07/23 Javascript
JS中使用apply、bind实现为函数或者类传入动态个数的参数
2016/04/26 Javascript
JS获取随机数和时间转换的简单实例
2016/07/10 Javascript
NodeJS远程代码执行
2016/08/28 NodeJs
JS实现图文并茂的tab选项卡效果示例【附demo源码下载】
2016/09/21 Javascript
详解Javascript 中的 class、构造函数、工厂函数
2017/12/20 Javascript
babel7.x和webpack4.x配置vue项目的方法步骤
2019/05/12 Javascript
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
JavaScript实现拖拽盒子效果
2020/02/06 Javascript
vue+element使用动态加载路由方式实现三级菜单页面显示的操作
2020/08/04 Javascript
如何使用JavaScript实现无缝滚动自动播放轮播图效果
2020/08/20 Javascript
vue路由的配置和页面切换详解
2020/09/09 Javascript
vue3.0自定义指令(drectives)知识点总结
2020/12/27 Vue.js
[03:19]2016国际邀请赛中国区预选赛第四日TOP10镜头集锦
2016/07/01 DOTA
python实现哈希表
2014/02/07 Python
简单谈谈Python中的闭包
2016/11/30 Python
numpy中索引和切片详解
2017/12/15 Python
Python实现的读取电脑硬件信息功能示例
2018/05/30 Python
浅谈Series和DataFrame中的sort_index方法
2018/06/07 Python
django解决跨域请求的问题
2018/11/11 Python
Python实现的简单线性回归算法实例分析
2018/12/26 Python
基于Python fminunc 的替代方法
2020/02/29 Python
static关键字的用法
2013/10/07 面试题
我爱家乡演讲稿
2014/09/12 职场文书
职称评定个人总结
2015/03/05 职场文书
2015年学校少先队工作总结
2015/07/20 职场文书
2015国庆节放假通知范文
2015/07/30 职场文书
Python网络编程之ZeroMQ知识总结
2021/04/25 Python
SqlServer数据库远程连接案例教程
2021/07/15 SQL Server