Не получается сменить формат файла при записи аудио с помощью PyQt6.QtMultimedia.QMediaRecorder

Рейтинг: 0Ответов: 1Опубликовано: 17.07.2023

Мне нужен диктофон как часть программы.
Ниже приведена тестовая часть для диктофона:

import os
import sys
from PyQt6.QtMultimedia import QMediaRecorder, QMediaCaptureSession, QAudioInput, QMediaFormat
from PyQt6.QtWidgets import QMainWindow, QApplication, QPushButton
from PyQt6 import QtCore


# Для тестирования
class MainForm(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.audio_recorder_init('files/pretest')
        self.button_start.clicked.connect(self.start_record)
        self.button_stop.clicked.connect(self.stop_record)

    def initUI(self):
        self.setGeometry(100, 100, 1000, 500)
        self.setFixedSize(self.width(), self.height())
        self.button_start = QPushButton('Start', self)
        self.button_stop = QPushButton('Stop', self)
        self.button_stop.move(0, 50)

    def audio_recorder_init(self, filename):
        mcs = QMediaCaptureSession(self)
        self.inp = QAudioInput(self)
        self.inp.setVolume(1.0)
        mcs.setAudioInput(self.inp)
        self.ardRecorder = QMediaRecorder(self)
        mcs.setRecorder(self.ardRecorder)
        self.ardRecorder.setOutputLocation(QtCore.QUrl.fromLocalFile(os.path.abspath(filename)))
        # media_format = QMediaFormat(QMediaFormat.FileFormat.MP3)
        # media_format.setAudioCodec(QMediaFormat.AudioCodec.MP3)
        # self.ardRecorder.setMediaFormat(media_format)
        self.ardRecorder.setQuality(QMediaRecorder.Quality.LowQuality)
        self.ardRecorder.setEncodingMode(QMediaRecorder.EncodingMode.ConstantQualityEncoding)
        self.ardRecorder.setAudioChannelCount(1)
        self.ardRecorder.setAudioSampleRate(-1)

    def start_record(self):
        self.ardRecorder.record()

    def stop_record(self):
        self.ardRecorder.stop()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    MF = MainForm()
    MF.show()
    sys.exit(app.exec())

Программа работает и записывает звук в формате .m4a.
Но я хочу получить файлы .mp3 или .wav.


Если раскомментировать строки:

        # media_format = QMediaFormat(QMediaFormat.FileFormat.MP3)
        # media_format.setAudioCodec(QMediaFormat.AudioCodec.MP3)
        # self.ardRecorder.setMediaFormat(media_format)

то при запуске в консоль выводится:

[mp3_mf @ 0000024738C00AC0] MFT name: 'MP3 Encoder ACM Wrapper MFT'

При этом создаётся файл с расширением .m4a, но проигрыватель отказывается его воспроизводить (но звук всё-таки записывается.
Я пробовал конвертировать этот файл через онлайн-конвертер в mp3 и получилось его воспроизвести).

Если заменить формат файла и аудиокодека с MP3 на Wave, то программа вообще виснет.

В чём может быть проблема? И как можно её решить?

Ответы

▲ 0

Я не могу проверить ваш код, но предложу проверить следующее:

import os
import sys
from pathlib import Path
from PyQt6.QtMultimedia import QMediaRecorder, QMediaCaptureSession, \
    QAudioInput, QMediaFormat
from PyQt6.QtWidgets import QMainWindow, QApplication, QPushButton
from PyQt6 import QtCore


class MainForm(QMainWindow):
    def __init__(self):
        super().__init__()
        
        self.initUI()
        
        self.audio_recorder_init()
        
        self.button_start.clicked.connect(self.start_record)
        self.button_stop.clicked.connect(self.stop_record)

    def initUI(self):
        self.setGeometry(100, 100, 1000, 500)
        self.setFixedSize(self.width(), self.height())
        self.button_start = QPushButton('Start', self)
        self.button_stop = QPushButton('Stop', self)
        self.button_stop.move(0, 50)

    def audio_recorder_init(self):
        mcs = QMediaCaptureSession(self)
        self.inp = QAudioInput(self)
        self.inp.setVolume(1.0)
        mcs.setAudioInput(self.inp)
        
        self.ardRecorder = QMediaRecorder(self)
        mcs.setRecorder(self.ardRecorder)
# +++ vvv         
        self.ardRecorder.setMediaFormat(QMediaFormat.MP3)
        self.ardRecorder.setQuality(QMediaRecorder.HighQuality)

        filename = Path(QDir.currentPath()) / "test.mp3"
        url = QUrl.fromLocalFile(os.fspath(filename))
        self.ardRecorder.setOutputLocation(url)
# +++ ^^^

    def start_record(self):
        self.ardRecorder.record()

    def stop_record(self):
        self.ardRecorder.stop()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mf = MainForm()
    mf.show()
    sys.exit(app.exec())