2015-10-07 44 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信號。