2017-04-01 8 views
1

私はQtを使用します5.7 私はMusic Playerを書いていますが、問題が1つあります。方法duration()QMediaPlayerは常に0を返します。どのように修正できますか?コードのQMediaPlayer duration()は常に0を返します

例:あなたはplayer->setMedia(QMediaContent(QUrl(path)));player->duration()権利を行うことはできません

QMediaPlayer *player = new QMediaPlayer; 
player->setMedia(QMediaContent(QUrl(path))); 
qDebug() << player->duration(); // returns 0 
player->play(); // it works 
+0

質問を編集して[mcve](https://stackoverflow.com/help/mcve)を追加してください。また、[ドキュメンテーション](http://doc.qt.io/qt-5/qmediaplayer.html#duration-prop)によると、「最初の再生が開始されると、再生ができない場合があります」ということに注意してください。 –

答えて

0

実際には、QMediaPlayer::setMediaです。非同期です。その直後にデュレーションを呼び出すと、メディアはまだ設定されず、デュレーションが間違っています。 Qt documentation on setMediaから

注:この機能は、メディアの指定されたソースを記録した後、すぐに返します。メディアのロードが完了するのを待つことはなく、エラーをチェックしません。

期間が更新されると、QMediaPlayerはdurationChanged(qint64 duration)という名前の信号を送ります。あなたがする必要があるように、この信号をラムダまたはスロットに接続することです。例えば

QMediaPlayer *player = new QMediaPlayer(this); 
connect(player, &QMediaPlayer::durationChanged, this, [&](qint64 dur) { 
    qDebug() << "duration = " << dur; 
}); 
QUrl file = QUrl::fromLocalFile(QFileDialog::getOpenFileName(this, tr("Open Music"), "", tr(""))); 
if (file.url() == "") 
    return ; 
player->setMedia(file); 
qDebug() << player->duration(); 
player->setVolume(50); 
player->play(); 

最初qDebugは、あなたのように0を書きますが、ラムダにおける第二は、QMediaPlayerの新しいデュレーションを書き込みます。

+0

リンクが動作しません – Vlad

+0

@Vladそうです、本当にすみません。それは今働いている! –

+0

私はそれが必要ではありません。私のアプリは音楽を再生しますが、 "duration()"メソッドは常に0を返します。オーディオの長さを取得する必要があります。 – Vlad

関連する問題