如何播放声音文件直到它在Qt中完成?

如何播放声音文件直到它在Qt中完成?,qt,Qt,我正在使用QSound播放音频文件。音频文件持续时间为10秒。 我有一些任务后,播放完整的10秒音频文件。为此,我使用了QSound::isFinished方法,但它总是立即返回false。示例根据问题的当前措辞,我假设您正在检查的isFinished立即完成,这将返回false 我认为你们最好的选择是使用QTimer并将它的超时信号连接到某个插槽,该插槽将检查是否完成。当声音开始播放时,您将启动计时器。当isFinished返回true时,您可以停止计时器并执行任何需要执行的操作。如果返回fa

我正在使用
QSound
播放音频文件。音频文件持续时间为10秒。
我有一些任务后,播放完整的10秒音频文件。为此,我使用了
QSound::isFinished
方法,但它总是立即返回false。示例

根据问题的当前措辞,我假设您正在检查的isFinished立即完成,这将返回false

我认为你们最好的选择是使用QTimer并将它的超时信号连接到某个插槽,该插槽将检查是否完成。当声音开始播放时,您将启动计时器。当isFinished返回true时,您可以停止计时器并执行任何需要执行的操作。如果返回false,请等待下一个超时

// In the .h
// ...

private slots:
    void onTimeout();

private:
    QTimer* timer;
    QSound sound;

// ...


// In the .cpp
// In your constructor
// ...

timer = new Timer();
connect( timer, SIGNAL( timeout() ), this, SIGNAL( onTimeout() ) ),

// ...
// Starting the sound
// ...

sound.play();
timer.start( 10 );  // In milliseconds.


// ...
// onTimeout slot

void MyClass::onTimeout()
{
    if( sound.isFinished() )
    {
        timer.stop();

        // Do some things.
    }
}
我选择了10毫秒,假设可以播放不同长度的音频文件。QSound也不能保证立即开始播放


如果您知道播放的音频始终具有相同的长度,则可以放弃isFinished检查,将计时器更改为持续时间与文件长度相同的单次放炮(加上一点以说明可变的开始时间)。这将导致它只超时一次,并且应该在文件完成后执行。这不是我喜欢的方法,但这是可能的

根据问题的当前措辞,我假设您正在检查的isFinished立即完成,这将返回false

我认为你们最好的选择是使用QTimer并将它的超时信号连接到某个插槽,该插槽将检查是否完成。当声音开始播放时,您将启动计时器。当isFinished返回true时,您可以停止计时器并执行任何需要执行的操作。如果返回false,请等待下一个超时

// In the .h
// ...

private slots:
    void onTimeout();

private:
    QTimer* timer;
    QSound sound;

// ...


// In the .cpp
// In your constructor
// ...

timer = new Timer();
connect( timer, SIGNAL( timeout() ), this, SIGNAL( onTimeout() ) ),

// ...
// Starting the sound
// ...

sound.play();
timer.start( 10 );  // In milliseconds.


// ...
// onTimeout slot

void MyClass::onTimeout()
{
    if( sound.isFinished() )
    {
        timer.stop();

        // Do some things.
    }
}
我选择了10毫秒,假设可以播放不同长度的音频文件。QSound也不能保证立即开始播放


如果您知道播放的音频始终具有相同的长度,则可以放弃isFinished检查,将计时器更改为持续时间与文件长度相同的单次放炮(加上一点以说明可变的开始时间)。这将导致它只超时一次,并且应该在文件完成后执行。这不是我喜欢的方法,但这是可能的

改用QSoundEffect并连接到播放更改的信号


改用QSoundEffect并连接到播放更改的信号


我们可以看一些示例代码吗?我很好奇您什么时候检查QSound::isFinished,从您的问题中看不出这一点。我们能看到一些示例代码吗?我很好奇您何时检查QSound::isFinished,从您的问题中看不出这一点。谢谢,我将实现它。但问题是isFinished()不返回true???那怎么办??当声音立即开始时,isFinished()返回false。在您的情况下,在调用play()大约10秒后,直到文件完全播放完毕,isFinished才会返回true。在这10秒钟过去之前(播放完成),它将返回false。/*我的代码如下QSound*player=0;player=newqsound(“/filepath.wav”);player->play();而(!player->isFinished);qDebug()注释不是放置代码的好地方。我建议你编辑你的原始问题并在那里添加代码。我是堆栈溢出的新手。。。。。当我写代码时,它会显示错误,比如你的帖子包含代码,请格式化好,谢谢,我会实现它。但问题是isFinished()不返回true???那怎么办??当声音立即开始时,isFinished()返回false。在您的情况下,在调用play()大约10秒后,直到文件完全播放完毕,isFinished才会返回true。在这10秒钟过去之前(播放完成),它将返回false。/*我的代码如下QSound*player=0;player=newqsound(“/filepath.wav”);player->play();而(!player->isFinished);qDebug()注释不是放置代码的好地方。我建议你编辑你的原始问题并在那里添加代码。我是堆栈溢出的新手。。。。。当我写代码时,它会显示错误,比如你的帖子包含代码,请格式化好