首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

QMediaPlayer duration 為 0 問題解決方案

     編輯:C++ 入門

QMediaPlayer duration 獲取為 0 的坑與解決

調用 setMedia() 後立即讀取 duration() 返回 0。文檔說明:"The value may change across the life time of the QMediaPlayer object and may not be available when initial playback begins."

錯誤代碼示例

void MainWindow::slotPlayAudio(const QString &audioFilePath) {
    currentAudioFilePath_ = audioFilePath;
    player_->setMedia(QUrl::fromLocalFile(audioFilePath));
    player_->setVolume(50);
    horizontalSliderMusic->setMinimum(0);
    horizontalSliderMusic->setMaximum(player_->duration());  // 這裡返回 0!
    player_->play();
    pushButtonPlay->setText("pause");
}

正確解決方案:監聽 durationChanged 信號

connect(player_, &QMediaPlayer::durationChanged, [this](qint64 duration) {
    horizontalSliderMusic->setMaximum(duration);
});

更健壯的綜合處理:positionChanged 中同步檢查

connect(player_, &QMediaPlayer::positionChanged, [this](qint64 position) {
    if (player_->duration() != horizontalSliderMusic->maximum()) {
        horizontalSliderMusic->setMaximum(player_->duration());
    }
    horizontalSliderMusic->setValue(position);
});

關鍵點總結

  • 異步元數據:媒體元數據解析是異步的,duration 就緒時發出 durationChanged
  • 雙重保險:positionChanged 中檢查並同步 maximum,應對 duration 遲到或變化
  • 避免阻塞:不應在主線程等待 duration 就緒,會凍結 UI
  • 狀態機:QMediaPlayer 內部狀態機控制元數據加載時機

相關信號時序

  1. mediaStatusChanged → LoadingMedia → LoadedMedia
  2. durationChanged (可能多次,最終值為準)
  3. positionChanged 開始周期性發出
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved