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类