我在制作一个单词朗读软件时,需要一个个地播放很多的 mp3 文件,每次都使用 Phonon::MediaObject 提供的 setCurrentSource() 函数载入当前的单词音频,然后用 play() 播放。
这时偶尔会出现某个单词播放不出声音的情况,不像是音频文件的问题,因为哪个文件不出声是随机出现的,一个接一个播放几十甚至上百的文件才会遇到一次不出声的情况。此时MediaObject 不会报告任何错误信息。
我检查了一下,在对 Phonon::MediaObject 使用 setCurrentSource() 之后,Phonon::MediaObject 进入 Phonon::StoppedState 这个状态,表示已经就绪了,之后调用 play() 就可以播放。文件播放完成后,进入到 Phonon::PausedState。
整个过程中 MediaObject 的状态变化是:LoadingState -> StoppedState -> PlayingState -> PausedState 。
不出声的时候,MediaObject 直接进入到了 Phonon::PausedState 这个状态,这时 play() 是没有效果的,必须先调用一次 stop() 得到 Phonon::StoppedState 状态之后,才能 play() 发出声音。
而且,在 setCurrentSource() 之后直接调用 stop() 再调用 play() 是没有效果的,也就是说,仍然会遇到偶尔无声的现象,只有用一个槽函数接收 MediaObject 的信号 stateChanged() 之后,再视情况调用 stop() 和 play() 才能避免偶尔的无声。这个可能和 Phonon 本身的异步特性有关。
不知道大家有没有遇到过这个现象,解决办法又是什么?