2014-12-18 66 views
1

我對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_()) 

可能有人戳我的頭我有什麼在做「#這就是我想要」的地方,計算並顯示卷的當前水平?

+0

存在用於獲取或設置用於[音頻輸入/輸出設備]的體積(無功能http://qt-project.org/doc/qt-4.8/qaudioinput.html)在Qt4中(它們確實存在於Qt5中)。 – ekhumoro

+0

你可以嘗試使用聲音,而不是http://qt-project.org/doc/qt-4.8/phonon-volumeslider.html – kartikg3

+0

Mmh ...好吧,thanx,將嘗試其中之一 – kwaxs

回答

0

沒有爲當QAudioInput無論是在Qt的4(QAudioInput documentation)也不在Qt的5

記錄但你可以計算出它自己計算輸入聲音信號的當前音量級別沒有內置的功能。信號的移動窗口中的均方根通常用作當前響度的度量。有關更多建議,請參閱How can I determine how loud a WAV file will sound?

+0

在Qt5中,'QAudioInput'類可以[獲取/設置音量](http://doc.qt.io/qt-5 /qaudioinput.html#setVolume)(只要設備支持它)。 – ekhumoro

+0

@ekhumoro我看到了它,但我認爲它們可能意味着與OP所希望的音頻響度的當前級別不同的音量,如果我理解正確的話。它更像是一個額外的增益因素。但我不完全確定這裏的實際意義。我想我們必須等待OP回來並提供更多信息。 – Trilarion

0

解決了一段時間後,在另一部分工作。現在我可以至少聽到聲音出的箱子,我改變了openMicStream(個體)到這個後:

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)