You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PyQt6 QMediaRecorder无法录制MP3/WAV格式音频的问题求助

PyQt6 QMediaRecorder无法录制MP3/WAV格式音频的问题求助

我来帮你分析一下你遇到的这两个问题,结合你的代码和现象来看,主要是媒体格式配置不完整输出文件名未指定对应后缀,以及系统编解码器支持限制导致的,咱们一步步拆解解决:

一、MP3格式录制的问题分析与解决

你启用MP3格式设置后,出现[mp3_mf @ 0000024738C00AC0] MFT name: 'MP3 Encoder ACM Wrapper MFT'的日志,同时生成的文件是.m4a后缀且无法直接播放,核心原因有两个:

  1. 输出文件名未指定.mp3后缀:你传入的filename'files/pretest',没有明确后缀,Qt会默认使用编码器对应的容器格式后缀(这里可能因为ACM wrapper的兼容性问题, fallback到了m4a容器);
  2. MP3格式的编解码器兼容性:Windows下的MP3 Encoder ACM Wrapper可能存在容器封装的问题,导致生成的文件虽然是MP3编码,但用了m4a的容器,播放器无法识别。

解决MP3问题的步骤:

  • 指定正确的输出文件名后缀:把filename改成'files/pretest.mp3',明确告诉Qt输出MP3格式的文件;
  • 验证格式支持性:在设置媒体格式前,先检查当前系统是否支持MP3编码,避免无效配置;
  • 调整格式配置方式:确保媒体格式的文件格式和音频编码对应正确。

修改后的MP3相关代码片段:

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)
    
    # 配置MP3格式
    media_format = QMediaFormat(QMediaFormat.FileFormat.MP3)
    media_format.setAudioCodec(QMediaFormat.AudioCodec.MP3)
    # 检查格式是否支持编码
    if media_format.isSupported(QMediaFormat.ConversionMode.Encode):
        self.ardRecorder.setMediaFormat(media_format)
    else:
        print("当前系统不支持MP3编码,请检查编解码器")
    
    # 明确指定带.mp3后缀的输出路径
    self.ardRecorder.setOutputLocation(QtCore.QUrl.fromLocalFile(os.path.abspath(filename)))
    
    self.ardRecorder.setQuality(QMediaRecorder.Quality.LowQuality)
    self.ardRecorder.setEncodingMode(QMediaRecorder.EncodingMode.ConstantQualityEncoding)
    self.ardRecorder.setAudioChannelCount(1)
    self.ardRecorder.setAudioSampleRate(-1)

调用时传入audio_recorder_init('files/pretest.mp3')

二、WAV格式录制导致程序崩溃的问题分析与解决

WAV格式一般使用PCM无损编码,你之前直接改成Wave格式但没调整对应的编码配置,导致Qt的媒体录制器无法正确初始化,进而程序崩溃。

解决WAV问题的步骤:

  • 指定WAV对应的编码和文件格式:WAV的文件格式是QMediaFormat.FileFormat.Wave,音频编码要设置为QMediaFormat.AudioCodec.PCM(WAV默认的无损编码);
  • 指定.wav后缀的输出文件名:同样要明确文件名后缀;
  • 调整编码模式:WAV是无损格式,ConstantQualityEncoding可能不适用,建议改用ConstantBitRateEncoding或者保持默认的质量设置。

修改后的WAV相关代码片段:

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)
    
    # 配置WAV格式
    media_format = QMediaFormat(QMediaFormat.FileFormat.Wave)
    media_format.setAudioCodec(QMediaFormat.AudioCodec.PCM)
    if media_format.isSupported(QMediaFormat.ConversionMode.Encode):
        self.ardRecorder.setMediaFormat(media_format)
    else:
        print("当前系统不支持WAV编码,请检查编解码器")
    
    # 明确指定带.wav后缀的输出路径
    self.ardRecorder.setOutputLocation(QtCore.QUrl.fromLocalFile(os.path.abspath(filename)))
    
    # WAV用PCM编码,建议调整编码模式为恒定比特率
    self.ardRecorder.setQuality(QMediaRecorder.Quality.HighQuality)
    self.ardRecorder.setEncodingMode(QMediaRecorder.EncodingMode.ConstantBitRateEncoding)
    self.ardRecorder.setAudioChannelCount(1)
    self.ardRecorder.setAudioSampleRate(44100)  # WAV建议设置明确的采样率,比如44100Hz

调用时传入audio_recorder_init('files/pretest.wav')

额外注意事项

  • 系统编解码器依赖:Qt的媒体功能依赖系统自带的编解码器,如果你的Windows系统缺少MP3或WAV的编解码器,可能需要安装对应的组件(比如Windows Media Feature Pack);
  • 权限问题:确保程序有写入files/目录的权限,避免文件无法生成导致的隐性错误;
  • 日志排查:可以通过QMediaRecordererrorOccurred信号捕获错误信息,更精准定位问题:
self.ardRecorder.errorOccurred.connect(self.on_recorder_error)

def on_recorder_error(self, error, error_string):
    print(f"录制错误:{error_string}")

备注:内容来源于stack exchange,提问作者Владимир

火山引擎 最新活动