[python]python利用pyaudio录制系统声音没有立体声混音怎么录制系统音频

当电脑没有立体声混音导致Python写代码无法使用pyaudio进行录制系统声音怎么办?查阅资料和安装驱动等方法都不行,难道没办法了吗?那为什么电脑其他软件可以做到呢?因此研究了一下pyaudio在没有立体声混音情况下确实无法录制声音,而且其他比较流行的录制声音模块都试过不行,比如scikit声音模块,因此找到一个模块能录制系统声音,尤其speaker声音很重要,否则python编程没法录制系统声音岂不是表明自己编程太烂了?最终发现一个模块十分好用而且可以录制系统声音不需要设置什么立体声混音操作。我的电脑是暗影精灵6plus结果根本没有立体声混音如下:

正常情况下人家是这样的

 

但是我尝试了很多方法甚至重装声卡驱动都没用,据说是主板不支持。难道python就没法用系统录音了吗,如果有立体声混音一般用下面代码即可录制

import numpy as np
from PIL import ImageGrab
import cv2
import pyaudio
import threading
import wave
import time
import ffmpeg
import getpass
import subprocess
import os

# 录音类
class Recorder():
    def __init__(self, chunk=1024, channels=2, rate=44100):
        self.CHUNK = chunk
        self.FORMAT = pyaudio.paInt16
        self.CHANNELS = channels
        self.RATE = rate
        self._running = True
        self._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 i
        print('无法找到内录设备!')
        return -1

    # 开始录音,开启一个新线程进行录音操作
    def start(self):
        threading._start_new_thread(self.__record, ())

    # 执行录音的线程函数
    def __record(self):
        self._running = True
        self._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()
        # 结束pyaudio
        p.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()
        # 结束pyaudio
        p.terminate()

# ffmpeg将音视频合并
def comband_av(AUDIO, VIDEO):  # 音频视频合并
    os.getcwd()
    user_name = getpass.getuser()
    str_txt = 'C:/Users/' + user_name + '/Desktop/'
    os.chdir(str_txt)
    cmd = f"ffmpeg -i {AUDIO} -i {VIDEO} comband_va.mp4 -y"
    subprocess.call(cmd, shell=True)


if __name__ == "__main__":
    os.getcwd()
    user_name = getpass.getuser()
    str_txt = 'C:/Users/' + user_name + '/Desktop/'
    os.chdir(str_txt)
    # 设置录制参数
    SCREEN_SIZE = (2560, 1600)
    FILENAME = 'recorded_video.avi'
    FPS = 30.0
    # 开始录制画面
    fourcc = cv2.VideoWriter_fourcc(*"XVID")
    out = cv2.VideoWriter(FILENAME, fourcc, FPS, SCREEN_SIZE)
    # 开始录制音频
    rec = Recorder()
    begin = time.time()
    rec.start()

    cnt = 0
    print('recording..')
    while True:
        # 获取屏幕截图
        # img = pyautogui.screenshot()
        img = ImageGrab.grab(bbox=(0, 0, 2560, 1600))
        # 转换为OpenCV格式
        frame = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
        # 写入视频文件
        out.write(frame)
        # cv2.imshow('Frame', frame)
        # cv2.resizeWindow('Frame', 1920, 1080)

        # # 检测按键
        # if cv2.waitKey(1) == ord('q'):
        #     break

        cnt = cnt + 1
        if cnt == 300:
            rec.stop()
            t = time.time() - begin
            print('录制时间为%ds' % t)
            rec.save("recorded_audio.wav")
            break

    # 停止录制
    out.release()
    cv2.destroyAllWindows()
    comband_av("recorded_audio.wav", "recorded_video.avi")  # 音频文件名,视频文件名自定义

 但是立体声混音,在声音设备根本没有,因此找到一个模块可以很好解决录制系统声音问题,视频演示如下:

python利用pyaudio录制系统声音没有立体声混音怎么录制系统音频_哔哩哔哩_bilibili当电脑没有立体声混音导致Python写代码无法使用pyaudio进行录制系统声音怎么办?查阅资料和安装驱动等方法都不行,难道没办法了吗?那为什么电脑其他软件可以做到呢?因此研究了一下pyaudio在没有立体声混音情况下确实无法录制声音,而且其他录制声音模块都试过不行,因此找到一个模块能录制系统声音,尤其speaker声音很重要,否则python编程没法录制系统声音岂不是表明自己编程太烂了?最终发现, 视频播放量 5、弹幕量 0、点赞数 0、投硬币枚数 0、收藏人数 0、转发人数 0, 视频作者 未来自主研究中心, 作者简介 未来自主研究中心,相关视频:地表最强模糊图片变清晰软件Topaz Photo AI2.2.2去升级集成全部离线模型完整版 ,最新版本解压即用,超强超稳定,一键抠图,无损放大,附赠模型,基于yolov8+bytetrack实现目标追踪视频演示,用opencv和onnxruntime去部署yolov5-7-8,C#opencvsharp进行图片拼接图像的stitch拼接,基于yolov8+deepsort实现目标追踪视频演示,yolov3 yolov4 yolov7训练助手2.1支持yolov7一键训练全程不用写代码傻瓜式操作,使用C++部署yolov8的onnx和bytetrack实现目标追踪,基于yolov3口罩检测识别系统训练和测试,使用C#的winform部署yolov8的onnx实例分割模型,将yolov5-6.2封装成一个类几行代码完成语义分割任务icon-default.png?t=N7T8https://www.bilibili.com/video/BV1qc411k7En/?vd_source=989ae2b903ea1b5acebbe2c4c4a635ee

 源码下载地址:https://download.csdn.net/download/FL1623863129/88684677

  • 21
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,您可以按照以下步骤来获取麦克风声音并使用Python调用Pyaudio录制wav声音文件: 1. 安装Pyaudio库 您可以使用以下命令在命令行中安装Pyaudio库: ``` pip install pyaudio ``` 2. 导入所需的库 在编写Python代码之前,您需要导入以下库: ``` import pyaudio import wave ``` 3. 设置录音参数 在录制音频之前,您需要设置一些参数,如采样率、每个样本的位数和通道数等。在本例中,我们将设置以下参数: ``` chunk = 1024 # 每次读取的块大小 sample_format = pyaudio.paInt16 # 采样率 channels = 2 fs = 44100 # 采样率 seconds = 5 # 录制音频的时间 ``` 4. 创建Pyaudio对象 现在,您需要创建一个Pyaudio对象以访问音频硬件。您可以使用以下代码创建Pyaudio对象: ``` p = pyaudio.PyAudio() ``` 5. 开始录制声音 现在,您可以开始录制声音了。使用以下代码开始录制声音: ``` stream = p.open(format=sample_format, channels=channels, rate=fs, frames_per_buffer=chunk, input=True) ``` 6. 将录制声音写入wav文件 使用以下代码将录制声音写入.wav文件: ``` frames = [] for i in range(0, int(fs / chunk * seconds)): data = stream.read(chunk) frames.append(data) stream.stop_stream() stream.close() p.terminate() wf = wave.open("output.wav", "wb") wf.setnchannels(channels) wf.setsampwidth(p.get_sample_size(sample_format)) wf.setframerate(fs) wf.writeframes(b"".join(frames)) wf.close() ``` 7. 完整代码 ``` import pyaudio import wave # 设置录音参数 chunk = 1024 # 每次读取的块大小 sample_format = pyaudio.paInt16 # 采样率 channels = 2 fs = 44100 # 采样率 seconds = 5 # 录制音频的时间 # 创建Pyaudio对象 p = pyaudio.PyAudio() # 开始录制声音 stream = p.open(format=sample_format, channels=channels, rate=fs, frames_per_buffer=chunk, input=True) # 将录制声音写入wav文件 frames = [] for i in range(0, int(fs / chunk * seconds)): data = stream.read(chunk) frames.append(data) stream.stop_stream() stream.close() p.terminate() wf = wave.open("output.wav", "wb") wf.setnchannels(channels) wf.setsampwidth(p.get_sample_size(sample_format)) wf.setframerate(fs) wf.writeframes(b"".join(frames)) wf.close() ``` 这就是如何使用Python调用Pyaudio获取麦克风声音录制.wav声音文件的教程。希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FL1623863129

你的打赏是我写文章最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值