Python使用PyAudio制作录音工具的实现代码
作者:宿者朽命 发布时间:2023-09-07 22:36:46
最近有在使用屏幕录制软件录制桌面,在用的过程中突发奇想,使用python能不能做屏幕录制工具,也锻炼下自己的动手能力。
接下准备写使用python如何做屏幕录制工具的系列文章:
录制屏幕制作视频
录制音频
合成视频,音频
基于pyqt5制作可视化窗口
大概上述四个部分,希望自己能够尽快完善,上一篇文章利用opencv制作了屏幕录制部分,接下继续更新系列,使用python录制音频。
应用平台
windows 10
python 3.7
音频录制部分
音频录制与视频录制相似,也是以数据帧的方式录制保存,这次使用强大的第三方包PyAudio和内置的wave模块编写主要部分代码:
pip install PyAudio
如果出现安装失败,可点击去此处下载对应.whl文件,cp37代表python3.7环境,64代表64位操作系统。
假如不是下载对应的whl包会导致安装失败,下载完成后,cmd窗口下进入whl的所在目录,使用pip install PyAudio-xx.whl
即可完成安装。
音频录制主要代码:
from pyaudio import PyAudio, paInt16, paContinue, paComplete
# 设置固定参数
chunk = 1024 # 每个缓冲区的帧数
format_sample = paInt16 # 采样位数
channels = 2 # 声道: 1,单声道;2,双声道
fps = 44100 # 采样频率
# 这里采用回调的方式录制音频
def callback(in_data, frame_count, time_info, status):
"""录制回调函数"""
wf.writeframes(in_data)
if xx: # 当某某条件满足时
return in_data, paContinue
else:
return in_data, paComplete
# 实例化PyAudio
p = PyAudio()
stream = p.open(format=format_sample,
channels=channels,
rate=fps,
frames_per_buffer=chunk,
input=True,
input_device_index=None, # 输入设备索引, None为默认设备
stream_callback=callback # 回调函数
)
# 开始流录制
stream.start_stream()
# 判断流是否活跃
while stream.is_active():
time.sleep(0.1) # 0.1为灵敏度
# 录制完成,关闭流及实例
stream.stop_stream()
stream.close()
p.terminate()
采取流式并用回调函数录制,需要先定义保存音频文件,用wave
新建音频二进制文件:
import wave
wf = wave.open('test.wav', 'wb')
wf.setnchannels(channels)
wf.setsampwidth(p.get_sample_size(format_sample))
wf.setframerate(fps)
为了后续代码可以很好的与之结合复用,将上面的代码包装成类
from pyaudio import PyAudio
class AudioRecord(PyAudio):
def __init__(self,):
源码于文末补充。
音频播放部分
播放部分代码与录制部分代码相差不大,核心部分:
wf = wave.open('test.wav', 'rb')
def callback(in_data, frame_count, time_info, status):
data = wf.readframes(frame_count)
return data, paContinue
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True,
output_device_index=output_device_index, # 输入设备索引
stream_callback=callback # 输出用回调函数
)
stream.start_stream()
while stream.is_active():
time.sleep(0.1)
目前暂时测试了.wav
和.mp3
格式可以正常录制及播放,其它类型格式音频可以自行调用代码进行测试。
GUI窗口所需属性值代码部分
考虑到GUI窗口能较为人性化的输出及输入值,编写该部分代码,内容含音频时长及获取输入设备及输出设备。
# 音频时长
duration = wf.getnframes() / wf.getframerate()
# 获取系统目前已安装的输入输出设备
dev_info = self.get_device_info_by_index(i)
default_rate = int(dev_info['defaultSampleRate'])
if not dev_info['hostApi'] and default_rate == fps and '映射器' not in dev_info['name']:
if dev_info['maxInputChannels']:
print('输入设备:', dev_info['name'])
elif dev_info['maxOutputChannels']:
print('输出设备:', dev_info['name'])
pynput监听键盘
在这部分代码也暂时使用pynput
监听键盘来对录音做中断处理。可以调用上一篇文章中的键盘监听代码。
def hotkey(self):
"""热键监听"""
with keyboard.Listener(on_press=self.on_press) as listener:
listener.join()
def on_press(self, key):
try:
if key.char == 't': # t键,录制结束,保存音频
self.flag = True
elif key.char == 'k': # k键,录制中止,删除文件
self.flag = True
self.kill = True
except Exception as e:
print(e)
功能与上一篇类似,不再赘述。
来源:https://blog.csdn.net/weixin_46281427/article/details/122035728


猜你喜欢
- 网页制作中需要把握好很多原则和细节,今天我们来谈谈网页设计中的平衡、对比、连贯和留白。一、平衡如果你的页面是平衡的,当用户浏览这个页面的时候
- asp之家注:如果你学习过asp,并且在网络公司上过班,一定会接触到网购系统,网购系统可以说是一个典型的程序类型,而其中最重要,也是最关键的
- 在MySQL 5.6.6之前,TIMESTAMP的默认行为:■TIMESTAMP列如果没有明确声明NULL属性,默认为NOT NULL。(而
- sqlserver批量导出存储过程在查询分析器中,选中数据库——》右键“任务”——》在弹出菜单中选择“生成脚本”——》“下一步”——》选择你
- PHP PDO预定义常量以下常量由本扩展模块定义,因此只有在本扩展的模块被编译到PHP中,或者在运行时被动态加载后才有效。注意:PDO使用类
- 从三个方面来说,主要有方面的措施:对象的引用计数机制、垃圾回收机制、内存池机制。一、对象的引用计数机制Python内部使用引用计数,来保持追
- Sun公司和Zmanda在3月18号声称他们正在一起合作,为MySQL Enterprise用户交付一种全面、全局数据备份与恢复解决方案。现
- 一、Pandas 读取文件当使用 Pandas 做数据分析的时,需要读取事先准备好的数据集,这是做数据分析的第一步。Panda 提供了多种读
- 通过python与ffmpeg结合使用,可生成进行视频点播、直播的压力测试脚本。可支持不同类型的视频流,比如rtmp或者hls形式。 通过如
- MySQL用Nested-Loop Join算法实现join查询区分驱动表和被驱动表,以驱动表的结果集为循环的基础,访问被驱动表过滤数据,然
- 前言之前的一篇文章已经讲过怎样获取链接,怎样获得参数了,详情请看python爬取京东商城普通篇,本文将详细介绍利用python爬虫框架scr
- 前言和Word、Excel承载数据的能力相比,PPT的应用重点在于表演。比如一场发布会、一场演说、一次产品展示、一次客户沟通&hel
- 情况1: father.php如下定义: <?php $jack = 1000; ?> children.php 如下定义: &
- 在视图中也有笨方法可以从数据库中获取数据。 很简单: 用现有的任何 Python 类库执行一条 SQL 查询并对结果进行一些处理。在本例的视
- 需求背景在很多时候我们需要抽取视频的某一帧做一些分析或修改等;比如笔者需求就是判断一个人在该视频中出现的频率,以判断他是否是这段视频的主角;
- 简而言之,channel维护了一个带指针的接受和发送的队列,其中包含mutex锁保证并发安全,数据类型,元素个数,元素大小,channel状
- 使用机器学习训练数据时,如果数据量较大可能我们不能够一次性将数据加载进内存,这时我们需要将数据进行预处理,分批次加载进内存。下面是代码作用是
- 本文实例为大家分享了Python将一个Excel拆分为多个Excel的具体代码,供大家参考,具体内容如下原始文档如下图所示将销售部门一、二、
- 经常会有定时备份SQL Server数据库的需要。定时备份到本机的话,还是挺容易的,计划任务就可以完成,但如果是整机挂了,那备份到本机是没意
- 前言这一期我们继续完善我们的魔塔小游戏。废话不多说,让我们愉快地开始吧~开发工具Python版本: 3.7.4相关模块:cpgam