2014-12-18 2 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

Вы можете попробовать использовать Phonon вместо http://qt-project.org/doc/qt-4.8/phonon-volumeslider.html – kartikg3

+0

Mmh ... okay, 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 вернется и даст больше информации. – 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)