如何显示我的麦克风的当前音量?

Posted

技术标签:

【中文标题】如何显示我的麦克风的当前音量?【英文标题】:How to show the current audio volume of my microphone? 【发布时间】:2015-02-17 18:52:00 【问题描述】:

我对 QMultimedia 完全陌生。目前,我尝试从网络摄像头中的麦克风获取音频流以进行进一步处理。现在我只是尝试用滑块连续显示麦克风“听到”的声音的音量。所以我一起用谷歌搜索了一些代码(找到了近 10 吨如何播放音频的示例,但只有几块关于音频输入的 C++ 代码)并被卡住了。

这是我的实际代码:

import sys, time
from PyQt4 import Qt, QtGui, QtCore, QtMultimedia

class VolumeSlider(QtGui.QSlider):
    def __init__(self, parent=None):
        super(VolumeSlider, self).__init__(parent)

        self.audio = None

        self.volumeSlider = QtGui.QSlider(QtCore.Qt.Horizontal)
        self.volumeSlider.setTickInterval(1)
        self.volumeSlider.setMaximum(100)
        self.volumeSlider.setValue(49)

        self.volumeSlider.show()

        self.openMicStream()

        # THIS IS WHAT I WANT - DOESN'T WORK
        while True:
            self.volumeSlider.setValue(self.audio.volume())
            time.sleep(0.02)



    def openMicStream( self ):
        #audioInputDevices = QtMultimedia.QAudioDeviceInfo.availableDevices(QtMultimedia.QAudio.AudioInput)
        #for d in audioInputDevices: d.deviceName()

        info = QtMultimedia.QAudioDeviceInfo(QtMultimedia.QAudioDeviceInfo.defaultInputDevice())
        print "Default audio input device:", info.deviceName()

        audioFormat = QtMultimedia.QAudioFormat()            
        audioFormat.setFrequency(8000);
        audioFormat.setChannels(1);
        audioFormat.setSampleSize(8);
        audioFormat.setCodec("audio/pcm");
        audioFormat.setByteOrder(QtMultimedia.QAudioFormat.LittleEndian);
        audioFormat.setSampleType(QtMultimedia.QAudioFormat.UnSignedInt);

        audioDeviceInfo = QtMultimedia.QAudioDeviceInfo.defaultInputDevice();
        if not audioDeviceInfo.isFormatSupported(audioFormat):
            sys.stderr("default audioFormat not supported try to use nearest")
            audioFormat = audioDeviceInfo.nearestFormat(audioFormat);

        self.audioInput = QtMultimedia.QAudioInput(audioFormat);

        fmtSupported = info.isFormatSupported(audioFormat)
        print "Is the selected format supported?", fmtSupported

        if not fmtSupported:
            audioFormat = info.nearestFormat(audioFormat)
            print "Is the nearest format supported?", info.isFormatSupported(audioFormat)

        self.audio = QtMultimedia.QAudioInput(audioFormat, None)
        self.audio.start()


if __name__ == "__main__":    
    app = Qt.QApplication(sys.argv)
    x = VolumeSlider()
    sys.exit(app.exec_()) 

谁能在“#THIS IS WHAT I WANT”的地方戳我的脑袋,以计算和显示当前的音量水平?

【问题讨论】:

Qt4 中没有用于获取或设置audio input/output device 音量的函数(但它们确实存在于 Qt5 中)。 您可以尝试使用 Phonon 代替 qt-project.org/doc/qt-4.8/phonon-volumeslider.html 嗯...好的,thanx,将尝试其中之一 顺便说一句。你不应该在 Qt 中使用 sleep 。请改用计时器。 qt-project.org/doc/qt-4.8/qtimer.html 【参考方案1】:

在 Qt 4 (QAudioInput documentation) 和 Qt 5 中都没有用于计算使用 QAudioInput 录制时输入声音信号的当前音量级别的内置函数。

但你可以自己计算。信号移动窗口中的均方根通常用作当前响度的量度。更多建议请见How can I determine how loud a WAV file will sound?。

【讨论】:

在Qt5中,QAudioInput类可以get/set the volume(只要设备支持)。 @ekhumoro 我看到了,但我认为如果我理解正确的话,它们可能意味着与 OP 所希望的当前音频响度级别不同的音量。它更像是一个额外的增益因子。但我不完全确定这里的实际含义。我想我们必须等待 OP 回来并提供更多信息。【参考方案2】:

在处理其他部分一段时间后解决了这个问题。现在,在我将 openMicStream(self) 更改为此之后,我至少可以听到开箱即用的声音:

def openMicStream( self ):
    info = QAudioDeviceInfo(QAudioDeviceInfo.defaultInputDevice())
    print "Default audioInput input device: ", info.deviceName()

    audioFormat = QAudioFormat()

    audioFormat.setFrequency(44100);
    audioFormat.setChannels(1);
    audioFormat.setSampleSize(16);
    audioFormat.setCodec("audioInput/pcm");
    audioFormat.setByteOrder(QAudioFormat.LittleEndian);
    audioFormat.setSampleType(QAudioFormat.UnSignedInt);

    audioDeviceInfo = QAudioDeviceInfo.defaultInputDevice();
    if not audioDeviceInfo.isFormatSupported(audioFormat):
        messages.error(__name__, "default audioFormat not supported try to use nearest")            
        audioFormat = audioDeviceInfo.nearestFormat(audioFormat);
        print audioFormat.frequency()
        print audioFormat.channels()
        print audioFormat.sampleSize()
        print audioFormat.codec()
        print audioFormat.byteOrder()
        print audioFormat.sampleType()

    self.audioInput = QAudioInput(audioFormat);

    audioFmtSupported = info.isFormatSupported(audioFormat)        
    messages.info(__name__, "Is the selected format supported?"+str(audioFmtSupported))

    if not audioFmtSupported:
        audioFormat = info.nearestFormat(audioFormat)
        messages.info(__name__, "Is the nearest format supported?"+str(info.isFormatSupported(audioFormat)))

    self.audioInput = QAudioInput(audioFormat, None)
    self.audioOutput = QAudioOutput(audioFormat, None)

    device = self.audioOutput.start()   
    self.audioInput.start(device)

【讨论】:

以上是关于如何显示我的麦克风的当前音量?的主要内容,如果未能解决你的问题,请参考以下文章

如何从麦克风输入中获取音量

调整麦克风输入音量

如何在 iOS 7 中获得麦克风音量?

如何以编程方式在 Android 中调整麦克风音量

iOS 是不是会降低使用麦克风的应用程序的扬声器音量?

访问麦克风后整个应用程序的音量变得更安静