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即可完成安装。

Python使用PyAudio制作录音工具的实现代码

音频录制主要代码:


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

标签:Python,PyAudio,录音
0
投稿

猜你喜欢

  • scrapy-redis分布式爬虫的搭建过程(理论篇)

    2022-04-25 20:49:25
  • Pandas直接读取sql脚本的方法

    2022-08-16 20:16:34
  • js取得html iframe中的元素和变量值

    2024-06-07 15:26:17
  • 一篇文章带你了解Python中的类

    2022-10-11 19:46:18
  • MySql安装启动两种方法教程详解

    2024-01-16 11:32:53
  • SQL Server和MySql中创建临时表

    2008-06-19 13:31:00
  • python命令行工具Click快速掌握

    2021-08-13 08:03:58
  • Python socket.error: [Errno 98] Address already in use的原因和解决方法

    2021-07-12 01:27:02
  • Python中反射和描述器总结

    2022-06-18 09:38:22
  • 使用Python在Windows下获取USB PID&VID的方法

    2021-02-15 19:31:20
  • python实现远程通过网络邮件控制计算机重启或关机

    2022-04-16 01:05:27
  • 使用python 对验证码图片进行降噪处理

    2022-01-27 23:02:16
  • Django查询数据库的性能优化示例代码

    2024-01-22 22:18:48
  • 一个完美网站的101项指标.第七部分.W3C标准

    2008-03-01 09:31:00
  • Pytorch对Himmelblau函数的优化详解

    2023-03-02 09:29:33
  • 使用python实现回文数的四种方法小结

    2022-01-17 14:57:51
  • JS仿iGoogle自定义首页模块拖拽特效的方法

    2024-04-22 22:36:37
  • Python变量和数据类型详解

    2022-01-25 07:26:25
  • django实现将修改好的新模型写入数据库

    2024-01-28 19:50:13
  • 详解MySQL如何有效的存储IP地址及字符串IP和数值之间如何转换

    2024-01-28 11:10:41
  • asp之家 网络编程 m.aspxhome.com