2017-02-26 39 views
1

我创建一个音频播放器与Qt和我正在实施,当我加载一首歌它启动automaticaly,但是当我调用函数开始歌曲并计算持续时间,歌曲不会启动。我使用了调试,当我到达播放函数调试停止与结束步进范围。我也尝试发出一个信号,但没有做任何事情,只有当我按下播放按钮时才开始播放歌曲。QMediaPlayer.play()不工作,如果我用它调用一个函数

在这里有代码

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

我会检查playerPositionChanged'和'positionSliderMoved'之间'的环键。 – LogicStuff

回答

1

要异步缺少setMedia作品。也就是说,它无法保证返回的媒体文件被加载,从docs

此功能记录介质的指定源 后返回立即。它不等待媒体完成加载并且不检查错误。 侦听mediaStatusChanged()error()信号,当媒体加载时以及加载过程中发生错误时,将通知

这意味着,当你调用this->playClicked();你叫player.setMedia(...);后,有一个很大的机会,媒体文件尚未加载,并调用player.duration()失败(它不返回的实际时间您尝试播放的媒体文件)。所以,最后您的持续时间滑块的范围为(0, 0),并且这会导致稍后调用player.stop(),因为您认为自己已达到媒体文件的末尾。 。 。

要解决这个问题,您需要关注文档中写的内容。除非确保媒体文件已完全加载,否则请务必不要进入playClicked插槽。你可以通过替换您:

this->playClicked(); 

像这样的东西:

connect(&player, &QMediaPlayer::mediaStatusChanged, 
     this, [&](QMediaPlayer::MediaStatus status){ 
    if(status == QMediaPlayer::LoadedMedia) playClicked(); 
}); 
相关问题