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

原文链接:https://blog.csdn.net/zhaoyun_zzz/article/details/84341801

Python+opencv+pyaudio实现带声音屏幕录制
原创luke-skyworker 发布于2018-11-28 23:05:23 阅读数 3463 收藏
展开
文章目录
声音录制
视频录制(无声音)
录制的音频与视频合成为带声音的视频

基于个人的爱好和现实的需求,决定用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()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
简洁回调函数版音频录制

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!")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
视频录制(无声音)
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()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
录制的音频与视频合成为带声音的视频
录制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‘)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
看来要提高帧率必须使用队列加多线程了,这一步等到以后来添加吧。不过总是觉得用OpenCV来实现视频录制,有点怪异,毕竟opencv是用来做图像与视频分析的,还是走正道认真捣鼓opencv该做的事情吧。
————————————————
版权声明:本文为CSDN博主「luke-skyworker」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文地址:https://www.cnblogs.com/shuimuqingyang/p/12130285.html

时间: 2024-08-09 10:21:49

Python+opencv+pyaudio实现带声音屏幕录制的相关文章

屏幕录制

[录教程必备]推荐几款屏幕录制工具(可录制GIF) 我们经常会遇到一些场景,需要你向别人展示一些操作或是效果--例如告诉别人某某软件的配置步骤啊.刚设计出来网站的动画效果怎么样啊.某某电影里面的一个镜头多么经典啊.打得大快人心的NBA绝杀瞬间是怎么回事啊,等等.... 这些场合,如果单纯截成图片有时难以说清楚,但录成视频又不方便在社交软件上传播,这时就需要一个能够生成动态图的软件了,本文就将介绍几款轻便实用的动态图截取工具 阅读导览 1.FScapture 2.LICEcap 3.ScreenT

【录教程必备】推荐几款屏幕录制工具(可录制GIF)

我们经常会遇到一些场景,需要你向别人展示一些操作或是效果——例如告诉别人某某软件的配置步骤啊.刚设计出来网站的动画效果怎么样啊.某某电影里面的一个镜头多么经典啊.打得大快人心的NBA绝杀瞬间是怎么回事啊,等等.... 这些场合,如果单纯截成图片有时难以说清楚,但录成视频又不方便在社交软件上传播,这时就需要一个能够生成动态图的软件了,本文就将介绍几款轻便实用的动态图截取工具 阅读导览 1.FScapture 2.LICEcap 3.ScreenToGif 总结 相关链接及文件下载 1.FScapt

推荐几款屏幕录制工具(可录制GIF)

我们经常会遇到一些场景,需要你向别人展示一些操作或是效果--例如告诉别人某某软件的配置步骤啊.刚设计出来网站的动画效果怎么样啊.某某电影里面的一个镜头多么经典啊.打得大快人心的NBA绝杀瞬间是怎么回事啊,等等.... 这些场合,如果单纯截成图片有时难以说清楚,但录成视频又不方便在社交软件上传播,这时就需要一个能够生成动态图的软件了,本文就将介绍几款轻便实用的动态图截取工具 阅读导览 1.FScapture 2.LICEcap 3.ScreenToGif 总结 相关链接及文件下载 1.FScapt

如何用 QuickTime 对 Mac 屏幕录制,而且录上声音?

参考地址:https://www.zhihu.com/question/26032781 亲测有效 和Soundflower搭配使用 SoundFlower的下载地址: https://soundflower.en.softonic.com/mac 下载安装Soundflower 在Launchpad中打开音频MIDI设置(Audio MIDI Setup),mac快捷键是comand+空格,然后输入MIDI 新建多输出设备(Create Multi-output Device),这一步是为了在

[python] 2、python使用pyaudio进行录音,及其在python虚拟环境virtualenv中安装遇到的问题

1.pyaudio安装大背景 最近在做智能音箱,需要编写声音拾取代码,我先是百度两篇比较常见的用python进行录音的操作的文章: python写一个录音小程序:http://blog.csdn.net/yexiaohhjk/article/details/73132562 利用百度语言识别API实现语音识别python:http://blog.csdn.net/yexiaohhjk/article/details/73134815 发现需要用到pyaudio,然后在其官网找到如何安装:http

在MAC系统上进行屏幕录制

最近打算将一些软件操作过程进行屏幕录制进行视频分享,所以寻思着找一块能在MAC上使用的屏幕录制软件.google了一番,没想到MAC系统自带的QuickTime Player已经内置屏幕录像功能,而且简单好用! 启动QuickTime Player 新建屏幕录制 如果想要在录制的过程中对鼠标点击的位置突出的话,可以勾选控制界面右边的倒三角,勾选“在录制中显示鼠标点按”,当然你还可以在这里设置麦克风输入,比如录制教程的时候,一边讲解一边录制,那么就可以把“内建输入:外置麦克风”勾上,还可以设置视频

oCam Pre v416.0 体积小的屏幕录制工具绿色破解版

鸡哥这两天再考虑要不要垂直发展网站,想象还是算了,本来内容就不太多,再专一一个内容的话更没东西更新了.这不早上闲逛了逛发现了个屏幕录像神器,oCam是款免费屏幕录像利器!这款免费屏幕录制捕捉工具,编码功能强大,支持游戏录像,可录制任何区域,可选全屏模式或自定义区域截图:还可捕捉到正在播放的声音:非常简单易用,而且完全免费.操作步骤只需三步:1.设置屏3幕录制范围:2.点击录制按钮:3.停止录制并保存:即可完成录像!  鸡哥还分享过一个韩国的录屏软件Bandicam破解版,有专门的游戏录制功能,鸡

Mac 屏幕录制Gif 制作 By-胡罗

一.视频录制 1)使用Mac系统自带的QuickTime进行屏幕录像 手动打开(如下图) 详细 Mac 基础教程:如何使用 Mac 系统原生的屏幕录制功能 相关快捷键 option+command+n           打开录像功能ctrl+option+command+n    录音功能ctrl+command+n               录制屏幕功能 二.视频转Gif图片 GIFBrewery使用介绍 软件下载 http://www.maczapp.com/gif-brewery GI

团队交流合作简单解决方案:TeamViewer远程控制&amp;会议演示 + HyperCam屏幕录制(免费)

一. 教程摘要 做开发,团队合作是少不了的.而在合作中,有一部分是花在交流讨论上,其中包括初期的任务分配,成员的进度汇报,以及资源和心得分享等.该教程介绍了两个免费的软件,搭配起来,适合人数不超过25人的团队成员之间演示交流用.其中功能包括:会议演示(一对多,包括屏幕分享.文件传输.聊天.语音.视频),远程控制(通过一个ID号进行远程协助,适合各平台),屏幕录制(单功能小巧软件,录制功能能满足大部分人需求,录制视频清晰)等... 如果你满足上面提到的大部分需求,请继续往下看. 二. 软件介绍及下