【问题标题】:Record audio using pyqt5使用 pyqt5 录制音频
【发布时间】:2020-10-10 23:46:06
【问题描述】:

pyqt5有没有办法记录麦克风输入?

我试试这个代码:

from PyQt5 import QtCore, QtGui, QtWidgets, QtMultimedia
import time


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):

        self.destinationFile = QtCore.QFile()


        self.destinationFile.setFileName("record.raw")
        self.destinationFile.open( QtCore.QIODevice.WriteOnly | QtCore.QIODevice.Truncate )

        format = QtMultimedia.QAudioFormat()
        format.setSampleRate(8000);
        format.setChannelCount(1);
        format.setSampleSize(8);
        format.setCodec("audio/pcm");
        format.setByteOrder(QtMultimedia.QAudioFormat.LittleEndian)
        format.setSampleType(QtMultimedia.QAudioFormat.UnSignedInt)

        info = QtMultimedia.QAudioDeviceInfo.defaultInputDevice()
        if (info.isFormatSupported(format) is not True):
            format = info.nearestFormat(format)

        self.audio = QtMultimedia.QAudioInput(format)
        self.audio.start(self.destinationFile)

        
        self.timer = QtCore.QTimer(MainWindow)
        self.timer.timeout.connect(lambda:self.close_window(MainWindow))
        self.timer.start(10000)
        
    
    def close_window(self,MainWindow):
        self.audio.stop()
        self.destinationFile.close()
        
        MainWindow.close()
    
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    app.addLibraryPath(r"C:/Users/Χρήστος/AppData/Local/Programs/Python/Python38/lib/site-packages/PyQt5/Qt/plugins")
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    
    sys.exit(app.exec_())

上面的代码输出一个文件record.raw 80 kB。 我听不见。我使用 Switch Audio Converter 将其转换为 mp3。 持续时间应该是 10 秒,但我只能听到噪音。 有什么帮助吗?

原始输出: https://files.fm/u/cv4y8d7h

Mp3 输出: https://files.fm/u/68c8zvvc#/view/v2rnbapw

print(info.deviceName()) -->默认输入设备

input_devices = QtMultimedia.QAudioDeviceInfo.availableDevices(QtMultimedia.QAudio.AudioInput)
for input_device in input_devices:
    print(input_device.deviceName())

Μικρόφωνο(瑞昱高清音频)

Μικρόφωνο(瑞昱高清音频)

(相同麦克风输入的 2 倍)

【问题讨论】:

  • 为什么要使用这些设置进行音频采样?此外,您列出了两台设备(这很正常,因为经常会多次列出同一个音频设备),但您只是使用默认设备,您不能也尝试其他设备吗?
  • 文档中提供的那些设置:doc.qt.io/qt-5/qaudioinput.html,我尝试使用这两种设备。结果相同。我只是尝试:self.audio = QtMultimedia.QAudioInput(input_devices[0],format)self.audio = QtMultimedia.QAudioInput(input_devices[1],format)

标签: python pyqt5 microphone multimedia


【解决方案1】:

如果你想录制音频,那么你必须使用QAudioRecorder,此外建议你查看Audio Recorder Example的官方示例(将它们翻译成python并不复杂,因为类是相同的),基于该示例我已经实现了以下适用于我的示例:

import os
import sys

from PyQt5 import QtCore, QtWidgets, QtMultimedia

CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))

app = QtWidgets.QApplication(sys.argv)

recorder = QtMultimedia.QAudioRecorder()

selected_audio_input = recorder.audioInput()

print("Audio Inputs:")
for i, audio_input in enumerate(recorder.audioInputs()):
    print(f"{i}. {audio_input}")

recorder.setAudioInput(selected_audio_input)

settings = QtMultimedia.QAudioEncoderSettings()

selected_codec = ""
print("Codecs:")
for i, codec in enumerate(recorder.supportedAudioCodecs()):

    print(f"{i}. {codec}")
print(f"selected codec:{selected_codec}")
settings.setCodec(selected_codec)

selected_sample_rate = 0
print("Sample rates:")
sample_rates, continuous = recorder.supportedAudioSampleRates()
for i, sample_rate in enumerate(sample_rates):
    print(f"{i}. {sample_rate}")
settings.setSampleRate(selected_sample_rate)

bit_rate = 0  # other values: 32000, 64000,96000, 128000
settings.setBitRate(bit_rate)

channels = -1  # other values: 1, 2, 4
settings.setChannelCount(channels)
settings.setQuality(QtMultimedia.QMultimedia.NormalQuality)
settings.setEncodingMode(QtMultimedia.QMultimedia.ConstantBitRateEncoding)

print("Containers")
selected_container = ""
for i, container in enumerate(recorder.supportedContainers()):
    print(f"{i}. {container}")

recorder.setEncodingSettings(
    settings, QtMultimedia.QVideoEncoderSettings(), selected_container
)

filename = os.path.join(CURRENT_DIR, "test.mp3")
recorder.setOutputLocation(QtCore.QUrl.fromLocalFile(filename))


def handle_durationChanged(progress):
    print(f"progress: {progress/1000} seg")


def handle_statusChanged(status):
    if status == QtMultimedia.QMediaRecorder.FinalizingStatus:
        QtCore.QTimer.singleShot(1 * 1000, QtCore.QCoreApplication.quit)


recorder.durationChanged.connect(handle_durationChanged)
recorder.statusChanged.connect(handle_statusChanged)


def handle_timeout():
    recorder.stop()


QtCore.QTimer.singleShot(10 * 1000, handle_timeout)

recorder.record()

sys.exit(app.exec_())

另一方面,在windows中你需要安装the k-lite codecs

【讨论】:

  • 输出:defaultServiceProvider::requestService(): no service found for - "org.qt-project.qt.audiosource" Audio Inputs: Codecs: selected codec: Sample rates: Containers
  • 使用我的代码,将 sample_rate 更改为 44100,将 SampleSize 更改为 16,将 SampleType 更改为 QtMultimedia.QAudioFormat.SignedInt 效果很好。
  • @ChrisP 正是因为这些特性取决于硬件,所以没有通用值
  • 没有可用的容器..任何解决方案?
  • 那是可选的,使用recorder.setEncodingSettings(settings)
猜你喜欢
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多