4

I am playing audio with the QMediaPlayer and want to visualize the audio levels (for example like in this video).
I already found a example from the Qt 4 documentation but they were manually generating the signal and I found no way to get the audio output buffer with the QMediaPlayer.
How should I solve this problem / are there other audio librarys (crossplatform) that can accomplish this?

thanks

1 Answers1

6

You should look at QAudioProbe.

The QAudioProbe class allows you to monitor audio being played or recorded.

As the QMediaPlayer is a subclass of QMediaObject, you attach the QAudioProbe to the QMediaPlayer with bool QAudioProbe::setSource(QMediaObject* source), then connect to the void QAudioProbe::audioBufferProbed(const QAudioBuffer& buffer) signal. The documentation provides an example.

In the slot for the audioBufferProbed signal you can process the raw audio data to calculate volume, for example by computing the RMS of the sample. Have a look at this article on calculating the RMS efficiently.

To display the volume you could use QProgressBar, but you may get better performance using the Qt Widgets for Technical Applications library which can also work on a logarithmic scale which will be needed for a volume display.

Silas Parker
  • 8,017
  • 1
  • 28
  • 43
  • Thank you, this is exactly what I was searching. –  May 01 '14 at 07:14
  • I'm trying to do something similar and used the audioBufferProbed signal to capture the buffer, but the problem is this signal gets emitted very soon i.e the difference between the two emission is nearly 10ms. Is there a way to control the emission of this signal ? Because of this the fft processing which is being done in the slot gets screwed up. Am i doing this the right way ? – astre Oct 28 '14 at 06:36
  • 1
    @astre I don't think there is any way to control the signal rate. You could create a proxy class that would do this to batch several signals together. Alternatively, you may want to do the FFT in another thread, for example use [`QtConcurrent::run`](http://qt-project.org/doc/qt-5/qtconcurrent.html#run) to run the FFT and use a [`QFutureWatcher`](http://qt-project.org/doc/qt-5/qfuturewatcher.html) in the GUI to get the results to display them. – Silas Parker Oct 29 '14 at 20:28