Seek in Sound File

From Qt Wiki
Revision as of 14:38, 24 February 2015 by Maintenance script (talk | contribs)
Jump to navigation Jump to search


How to Seek in Sound File

I tried to play a sound file not at the beginning but with an offset of 20 seconds.

The following way of setting an offset fails:

player = new QMediaPlayer(this);<br />player->setMedia(QUrl::fromLocalFile("myCoolSong.mp3"));<br />player->setVolume(50);<br />player->play(); // music can be heard<br />qDebug() << player->isSeekable(); // is always false<br />player->setPosition ( 20*1000 ); //does not work

It does not work because QMediaPlayer works asynchronously.

As soon as the seek operations are delayed everything works as intended. For example:

CoolPlayer::on_Button1_clicked()<br />{<br /> qDebug() << player->isSeekable(); // true<br /> player->setPosition ( 20*1000 );<br />}

To make my life easier I have derived a class MediaPlayer from QMediaPlayer and added a blocking load method:

void MediaPlayer::loadBlocking(const QString &amp;file;)<br />{<br /> setMedia(QUrl::fromLocalFile(file));<br /> if(!isSeekable())<br /> {<br /> QEventLoop loop;<br /> QTimer timer;<br /> timer.setSingleShot(true);<br /> timer.setInterval(2000);<br /> loop.connect(&amp;timer;, SIGNAL (timeout()), &amp;loop;, SLOT (quit()) );<br /> loop.connect(this, SIGNAL (seekableChanged(bool)), &amp;loop;, SLOT (quit()));<br /> loop.exec();<br /> }<br />}

When files are loaded with this blocking load method

setPosition()

can be called right in the next source line.

loadBlocking

blocks until signal

seekableChanged()

is emitted. To avoid a deadlock, maximum waiting time is 2 seconds.