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

发布时间:2023年12月31日

当电脑没有立体声混音导致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://blog.csdn.net/FL1623863129/article/details/135317928
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。