2015-10-07 74 views
1

我正在使用QSound播放音频文件。音频文件的持续时间是10秒。 播放完整的10秒音频文件后,我有一些任务。所以对于这个我使用QSound::isFinished方法,但是这总是立即返回false。示例如何播放声音文件,直到它在Qt中完成?

+3

我们可以看到一些示例代码吗?我很好奇你什么时候检查QSound :: isFinished,并且从你的问题不是很明显 – MildWolfie

回答

2

根据问题的当前措辞,我假设您正在检查isFinished,这将确实返回false。

我认为你最好的选择是使用QTimer并将它的超时信号连接到某个将检查isFinished的插槽。当声音开始播放时,您将启动计时器。当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检查和更改计时器为单发与持续时间的文件的长度相同(加稍微考虑可变的开始时间)。这将导致它仅超时一次,并且应该在文件完成后这样做。这不是我喜欢的方法,但它是一种可能性。

+0

谢谢我将实施它。但问题是,isFinished()不返回true?那么该怎么办?当声音立即开始isFinished()返回false。 –

+0

isFinished将不会返回true,直到文件完全播放完毕,在您的情况下,大约在您调用play()之后10秒钟。直到这10秒钟过去(播放完成),它将返回false。 – MildWolfie

+0

/*我的代码是这样的 QSound * player = 0; player = new QSound(“/ filepath.wav”); player-> play(); (!player-> isFinished); qDebug()<<“配乐完成”; 因此,我只想在声音文件完成时打电话给degug,但是当声音立即开始时,qDebug启动? –

1

改为使用QSoundEffect并连接到playingChanged信号。