简体   繁体   English

使用 pyqt5 录制音频

[英]Record audio using pyqt5

Is there any way to record microphone input in pyqt5?有没有办法在pyqt5中记录麦克风输入?

I try this code:我试试这个代码:

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_())

The above code outputs a file record.raw 80 kB.上面的代码输出一个文件record.raw 80 kB。 I cannot hear it.我听不见。 I convert it to mp3 with Switch Audio Converter.我使用 Switch Audio Converter 将其转换为 mp3。 The duration is 10 seconds as it supposed to be, but i can hear only noise.持续时间应该是 10 秒,但我只能听到噪音。 Any help please?请问有什么帮助吗?

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

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

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

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

Μικρόφωνο (Realtek High Definition Audio) Μικρόφωνο(Realtek 高清音频)

Μικρόφωνο (Realtek High Definition Audio) Μικρόφωνο(Realtek 高清音频)

(2 times the same microphone input) (2次相同的麦克风输入)

If you want to record audios then you must use QAudioRecorder, in addition to that it is recommended that you review the official examples as Audio Recorder Example (translating them to python is not complicated since the classes are the same), based on that example I have implemented the following example that works for me:如果你想录制音频,那么你必须使用 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_())

On the other hand in windows you need to install the k-lite codecs .另一方面,在 Windows 中,您需要安装k-lite 编解码器

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM