[英]Record audio using pyqt5
有没有办法在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())
Μικρόφωνο(Realtek 高清音频)
Μικρόφωνο(Realtek 高清音频)
(2次相同的麦克风输入)
如果你想录制音频,那么你必须使用 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 中,您需要安装k-lite 编解码器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.