我正在创建一个带有Qt的音频播放器,我正在实现当我加载一首歌时它会自动启动,但是当我调用该功能启动歌曲并计算持续时间时,该歌曲并没有&# 39;开始我使用了调试,当我到达播放功能时,调试已停止,并带有end-stepping-range。我也尝试发出一个信号,但无事可做,只有按下“播放”按钮才会启动歌曲。
这里有代码
void AudioPlayer::loadClicked()
{
QString filename = QFileDialog::getOpenFileName(this, "Select an audio file", "C:/Users/belli/Music" ,"File Mp3 (*.mp3)");
if(!filename.isEmpty())
{
qDebug("%s", filename.toLatin1().constData());
player.setMedia(QUrl::fromLocalFile(filename));
this->volumeSliderMoved();
QFileInfo fi(filename);
QString name = fi.fileName();
ui->label->setText(name);
this->playClicked();
}
}
void AudioPlayer::playClicked()
{
player.play();
songLength = player.duration();
ui->horizontalSliderPosition->setRange(0, songLength);
}
void AudioPlayer::stopClicked()
{
player.stop();
ui->horizontalSliderPosition->setValue(0);
}
void AudioPlayer::playerPositionChanged(qint64 pos)
{
ui->horizontalSliderPosition->setValue(pos);
if(pos == songLength)
this->stopClicked();
}
void AudioPlayer::volumeSliderMoved()
{
player.setVolume(ui->horizontalSliderVolume->value());
}
void AudioPlayer::positionSliderMoved()
{
player.setPosition((quint64) ui->horizontalSliderPosition->value());
}
连接
ui(new Ui::AudioPlayer)
{
ui->setupUi(this);
connect(ui->pushButtonLoad, SIGNAL(clicked(bool)), SLOT(loadClicked()));
connect(ui->pushButtonPlay, SIGNAL(clicked(bool)), SLOT(playClicked()));
connect(ui->pushButtonStop, SIGNAL(clicked(bool)), SLOT(stopClicked()));
connect(ui->horizontalSliderVolume, SIGNAL(valueChanged(int)), SLOT(volumeSliderMoved()));
connect(ui->horizontalSliderPosition, SIGNAL(sliderReleased()), SLOT(positionSliderMoved()));
connect(&player, SIGNAL(positionChanged(qint64)), SLOT(playerPositionChanged(qint64)));
}
答案 0 :(得分:1)
您错过了setMedia
异步工作。也就是说,它不会保证从docs:
此功能在录制指定的源后立即返回 媒体它不等待媒体完成加载并且不检查错误。 在加载媒体时以及加载过程中发生错误时,收听要通知的
mediaStatusChanged()
和error()
信号。
这意味着当您在调用this->playClicked();
后致电player.setMedia(...);
时,很可能尚未加载媒体文件,并且呼叫{{3}失败(它不会返回您尝试播放的媒体文件的实际持续时间)。因此,最终您的持续时间滑块的范围为(0, 0)
,这会导致稍后调用player.stop()
,因为您认为已到达媒体文件的末尾。 。
要解决此问题,您需要按照文档中的内容进行操作。除非确保媒体文件已满载,否则请确保不要前进到playClicked
插槽。您可以通过替换:
this->playClicked();
有这样的事情:
connect(&player, &QMediaPlayer::mediaStatusChanged,
this, [&](QMediaPlayer::MediaStatus status){
if(status == QMediaPlayer::LoadedMedia) playClicked();
});