现在网上用python编写的录音机小软件很多,几乎都不支持内录。

这个小程序的主要功能特点是

1 , 录制电脑上正在播放的声音,即从声卡录制,而不是从麦克风录制,这样就可以将电脑上正在播放的音乐保存下来

2, 不预先指定录制时间,而是根据用户指令开始录音或停止录音,因此要使用多线程技术来实现

实际使用效果

技术关键点

调用pyaudio模块进行录音,为了实现内录功能,有一个关键点是要找出支持内录的音频输入设备。

为此专门定义了一个方法,找出支持内录的设备的序号

#获取内录设备序号,在windows操作系统上测试通过,hostAPI = 0 表明是MME设备def findInternalRecordingDevice(self,p):#要找查的设备名称中的关键字target = '立体声混音'#逐一查找声音设备  for i in range(p.get_device_count()):devInfo = p.get_device_info_by_index(i)   if devInfo['name'].find(target)>=0 and devInfo['hostApi'] == 0 :      #print('已找到内录设备,序号是 ',i)return iprint('无法找到内录设备!')return -1

此外在创建音频输入流时,要通过参数 input_device_index 指定内录设备
相关代码如下:

#在打开输入流时指定输入设备stream = p.open(input_device_index=dev_idx,format=self.FORMAT,channels=self.CHANNELS,rate=self.RATE,input=True,frames_per_buffer=self.CHUNK)

完整的python代码

pyRecorder.py

# _*_ coding: utf-8 _*_# 录音机,用于录制声卡播放的声音(内录)import os
import pyaudio
import threading
import wave
import time
from datetime import datetime#录音类
class Recorder():def __init__(self, chunk=1024, channels=2, rate=44100):self.CHUNK = chunkself.FORMAT = pyaudio.paInt16self.CHANNELS = channelsself.RATE = rateself._running = Trueself._frames = []#获取内录设备序号,在windows操作系统上测试通过,hostAPI = 0 表明是MME设备def findInternalRecordingDevice(self,p):#要找查的设备名称中的关键字target = '立体声混音'#逐一查找声音设备  for i in range(p.get_device_count()):devInfo = p.get_device_info_by_index(i)   if devInfo['name'].find(target)>=0 and devInfo['hostApi'] == 0 :      #print('已找到内录设备,序号是 ',i)return iprint('无法找到内录设备!')return -1#开始录音,开启一个新线程进行录音操作def start(self):threading._start_new_thread(self.__record, ())#执行录音的线程函数def __record(self):self._running = Trueself._frames = []p = pyaudio.PyAudio()#查找内录设备dev_idx = self.findInternalRecordingDevice(p)if dev_idx < 0 :            return#在打开输入流时指定输入设备stream = p.open(input_device_index=dev_idx,format=self.FORMAT,channels=self.CHANNELS,rate=self.RATE,input=True,frames_per_buffer=self.CHUNK)#循环读取输入流while(self._running):data = stream.read(self.CHUNK)self._frames.append(data)#停止读取输入流  stream.stop_stream()#关闭输入流stream.close()#结束pyaudiop.terminate()return#停止录音def stop(self):self._running = False#保存到文件def save(self, fileName):   #创建pyAudio对象p = pyaudio.PyAudio()#打开用于保存数据的文件wf = wave.open(fileName, 'wb')#设置音频参数wf.setnchannels(self.CHANNELS)wf.setsampwidth(p.get_sample_size(self.FORMAT))wf.setframerate(self.RATE)#写入数据wf.writeframes(b''.join(self._frames))#关闭文件wf.close()#结束pyaudiop.terminate()if __name__ == "__main__":#检测当前目录下是否有record子目录if not os.path.exists('record'):os.makedirs('record')print("\npython 录音机 ....\n")print("提示:按 r 键并回车 开始录音\n")    i = input('请输入操作码:')if i == 'r':           rec = Recorder()begin = time.time()print("\n开始录音,按 s 键并回车 停止录音,自动保存到 record 子目录\n")rec.start()running = Truewhile running:i = input("请输入操作码:")if i == 's':running =Falseprint("录音已停止")rec.stop()               t = time.time() - beginprint('录音时间为%ds'%t)#以当前时间为关键字保存wav文件rec.save("record/rec_"+datetime.now().strftime("%Y-%m-%d_%H-%M-%S")+".wav")

将以上内容保存在本地,在安装好python3 及 pyaudio 模块的前提下,执行 python pyRecorder.py 就可以开始录音了。

以上代码在 win10 下测试通过,linux或其它操作系统未测试,可能要做一些小的改动才能正常运行。

补充说明:

在录制网上音乐时,如果想做到:点击网页上的播放按钮时自动开始录音,可参看python录音机的改进版。

python开发的录音机(一)录制声卡播放的声音(内录)相关推荐

  1. UOS 录制电脑播放的音频 / 内录音频

    Windows 里面有一个"立体声混音",可以内录电脑播放的音频,而不受到外界噪音的干扰.前段时间接到反馈说 UOS 的设置里面的音频输入里面没有可以选择的设备,这里就稍微探索了一 ...

  2. python开发的录音机(二)让鼠标点击与开始录音同步(录制与回放鼠标宏)

    当我们用录音机录网上的音乐时,有一个场景让人困扰: 比如听以下页面中的一首歌,要在页面上点击一下播放按钮 如果想把这一首歌录下来,当点击了播放按钮再去点录音机的录音按钮时,中间有一个时间差.可能一不小 ...

  3. WebRTC Native M96 SDK接口封装--enableLoopbackRecording启用声卡采集,声卡播放的声音合到本地音频流发送远端

    音频采集或播放时,需要用MMDevice API来枚举和获取指定设备,用WASAPI来处理应用程序和音频设备之间的音频流数据,如采集或播放 声网接口:enableLoopbackRecording 接 ...

  4. M1 macOS 无法录制系统声音?SoundFlower后继有BlackHole【macOS系统声音内录】

    SoundFlower 众所周知,QuickTime无法录制系统声音,在macOS之前的版本,和M1(Apple Silicon)没问世之前,SoundFlower一直都是首选!可惜SoundFlow ...

  5. python开发安卓盒子_python实现音乐播放器 python实现花框音乐盒子

    本文实例为大家分享了python实现音乐播放器的具体代码,供大家参考,具体内容如下 """这是一个用海龟画图模块和pygame的混音模块制作的简易播放器. 作者:李兴球, ...

  6. 使用Python开发测试小工具-录制回放工具的实现

    Pyqt5 信号槽机制可参考:https://blog.51cto.com/9291927/2422187 信号槽是Qt的核心机制,也是PyQt编程中对象进行通信的机制.在Qt中,QObject对象和 ...

  7. 用python开发安卓手机脚本录制工具_手机脚本精灵安卓好用录制工具

    是何原因,还望高手指点ado.SaveToFile target,adSaveCreateOverWriteQ:--怎样在我的程序中实现文件下载 Re: 一个例子:一个Command,两个Text代码 ...

  8. 使用 Audacity 录制声卡声音

    在Linux中使用 Audacity 录制电脑播放的声音非常简单,其实主要设置不在 Audacity 上,而是要设置好输入设备并选择对录音输入源. 首先确认输入设备中 内置音频的Monitor 没有被 ...

  9. 声卡内录——概念简记

    声卡内录 百度百科的链接 声卡内录就是将电脑上正在播放的声音由内部录制下来的过程,通常由"更改本身录音机设置"或"其他软件"两种途径来完成.其中,Cool Ed ...

最新文章

  1. 设计模式 之美 -- 工厂方法模式
  2. 关于通讯作者、第一作者的那点事,你想知道的全都在这里!
  3. python贴吧发帖脚本-分享用Python写的99收抢单小脚本,仅供学习
  4. 修改MySQL字段为首字母大写
  5. 洛谷P2746 [USACO5.3]校园网Network of Schools
  6. linux getopts学习笔记
  7. xgboost python windows编译问题
  8. php去除html属性,PHP如何去掉所有HTML标签?
  9. the java home_the java_home environment variable is not defined correctly
  10. java 设备集成,java 集成 海康 SDK
  11. 配置java时找不到匹配项,检索项目的父项时出错:找不到与给定名称匹配的资源...
  12. Python一键生成国庆出行攻略,助你出门远游嗨不停!
  13. 韦根w34是多少位_韦根(Wiegand)数据传输格式
  14. WebSocket 消息推送
  15. 网络安全工程师的简单介绍
  16. 开源WebGIS开发——如何创建一张地图
  17. 东方欲晓,莫道君行早
  18. 钉钉e应用点击按钮触发两次点击事件的解决办法
  19. 七月算法机器学习笔记8 聚类算法
  20. otg线是什么,otg线和数据线的区别介绍

热门文章

  1. 作为投资人,我的两次投资失败经历
  2. 向日葵远程控制端 for Mac
  3. oracle golden gate安装,Oracle GoldenGate在RAC上部署安装
  4. windows重启php服务,Windows后台启动、停止和重启WNMP脚本
  5. A topic modeling framework for spatio-temporal information management(2020)
  6. CTFjpg图片隐写之zlib压缩数据包的提取
  7. VNC Viewer请求超时解决方案 、灰屏解决方案(gnome或xfce4)
  8. SLAM练习题(九)——点云融合、滤波、平滑、网格化
  9. MySQL多表关联查询效率高点还是多次单表查询效率高,为什么?
  10. HDU 6201 最长路