android上的qt5不使用QAudioRecorder录制PCM wav文件

Posted

技术标签:

【中文标题】android上的qt5不使用QAudioRecorder录制PCM wav文件【英文标题】:qt5 on android don't record PCM wav files with QAudioRecorder 【发布时间】:2018-02-08 08:22:33 【问题描述】:

我在 pyqt5 上编写了将 PCM 编解码器中的音频文件录制为 wav 格式的代码。在 PC 上很好,但在 android 上总是用 amr 编解码器编写 mp4 文件。我该如何解决?

这里是代码

recorder=QAudioRecorder(w)

audiosettings=QAudioEncoderSettings()
audioSettings.setCodec("audio/PCM")
audioSettings.setSampleRate(16000)
recorder.setAudioSettings(audioSettings);

recorder.setContainerFormat("wav");
recorder.setOutputLocation(QUrl.fromLocalFile("/sdcard/test"))

(Pyqt5 在 Android 上的 Pydroid 2 应用中从 pip 安装,从 Ministro II 应用中安装 qt5)

【问题讨论】:

您的设备可能没有必要的编解码器,因此回退到默认设置。 QAudioDeviceInfo().supportedCodecs() 的输出是什么? 嗯。真的很神秘,但是supportedCodecs()是……空的!!!它是一个长度为零的列表。但为什么???此外,文档说“音频/PCM”随处可用,因此它必须至少为 1! 我在PC上运行它,它是空的,就像在android上一样。可能是,它是 python 包装器中的一个错误...... 其实好像需要获取availableDevices的列表,然后查询每个设备的supportedCodecs。但是,对我来说(在 linux 上),这只是为每个设备返回“audio/PCM”。 (PS:pyqt或者qt肯定没有bug,这纯粹是系统设置的问题)。 我检查得更准确,在 linux 和 android 上都打印 QAudioDeviceInfo.defaultInputDevice().supportedCodecs() show 'audio/pcm'。没有 mp4 和 amr 编解码器的迹象:) 【参考方案1】:

很遗憾,我没有解决 QAudioRecorder 的问题。我找到了使用 QAudioInput 编写无头有符号整数 16 位 16khz little endian PCM 的方法:

#!/usr/bin/env python2
from PyQt5.QtCore import QFile
from PyQt5.QtMultimedia import QAudioInput,QAudioFormat,QAudio
import sys
import time
from PyQt5.QtWidgets import QApplication, QWidget,QPushButton

format=QAudioFormat()
format.setSampleRate(16000);
format.setChannelCount(1);
format.setSampleSize(16);
format.setCodec("audio/pcm")

format.setByteOrder(QAudioFormat.LittleEndian)
format.setSampleType(QAudioFormat.SignedInt)

audio=QAudioInput(format)

def onBtn():
    if audio.state()==QAudio.StoppedState:
        audio.start(destFile)
        print "started"
    else:
        audio.stop()
        print "stopped"
pass

app = QApplication(sys.argv)
w = QWidget()
btnRec = QPushButton('Rec|stop', w)
btnRec.clicked.connect(onBtn)
w.show()
app.exec_()

destFile.close()

【讨论】:

以上是关于android上的qt5不使用QAudioRecorder录制PCM wav文件的主要内容,如果未能解决你的问题,请参考以下文章

Qt 5.2 RC1“执行格式错误”:虚拟 Ubuntu 13.04 上的 android 部署

蓝牙与 Android 上的 Qt。通过抽象类上的jni调用java类

包 org.qtproject.qt5.android.bindings 不存在

Windows上的Qt 5.7黑屏

Qt5 for Android:不兼容的 ABI

Qt5:下载文件而不保存到硬盘