Android平台下使用TMediaPlayer循环播放音频异常问题求助
Android下TMediaPlayer循环播放音频多次后无声的问题解决思路
我用C++ Builder创建了一个带按钮的表单,点击按钮启动线程循环播放音频,代码如下:
按钮点击事件代码:
void __fastcall TForm2::Button1Click(TObject *Sender) { TRecitar *Recitar = new TRecitar(false); }
线程类代码:
class TRecitar : public TThread { private: UnicodeString PathGhost; protected: void __fastcall Execute(); public: __fastcall TRecitar(bool CreateSuspended); }; __fastcall TRecitar::TRecitar(bool CreateSuspended) : TThread(CreateSuspended) { PathGhost=System::Ioutils::TPath::GetDocumentsPath()+"/"; } void __fastcall TRecitar::Execute() { FreeOnTerminate = true; AnsiString Audio; TMediaPlayer *Pl; for(int i=1;i<150;i++) { Audio = PathGhost + "Multimedia/SonG.3gp"; Pl->FileName = Audio; Pl->Play(); sleep(1); Pl->Stop(); Pl->Clear(); } }
启动后音频能循环播放约40次,之后听不到声音,但循环仍在运行,无任何报错。怀疑是Android设备问题,求解决思路。
解决思路
- 修复野指针问题:代码中
TMediaPlayer *Pl;仅声明指针未初始化,直接调用成员函数属于未定义行为。必须在使用前创建实例,用完后销毁:TMediaPlayer *Pl = new TMediaPlayer(); // 播放逻辑... delete Pl; - 修正播放等待逻辑:
sleep(1)时间过短,音频未播放就被终止。应等待播放完成再执行后续操作,比如通过检查状态:Pl->Play(); while (Pl->State == mpPlaying) { Sleep(50); // 短延时避免占用过多CPU } - 避免后台线程操作UI组件:TMediaPlayer依赖Android UI线程上下文,后台线程中操作易引发资源异常。需通过
Synchronize将播放逻辑同步到UI线程:void __fastcall TRecitar::Execute() { FreeOnTerminate = true; for(int i=1;i<150;i++) { Synchronize([this](){ TMediaPlayer *Pl = new TMediaPlayer(); UnicodeString Audio = PathGhost + "Multimedia/SonG.3gp"; Pl->FileName = Audio; Pl->Play(); while (Pl->State == mpPlaying) Sleep(50); Pl->Stop(); Pl->Clear(); delete Pl; }); } } - 排查资源泄漏:每次播放后确保销毁TMediaPlayer实例,避免音频资源被持续占用。可通过Android Studio的Profiler工具监控内存和音频资源使用情况。
- 验证文件路径有效性:每次循环中输出实际音频路径,确认文件是否存在、权限是否正常,避免因路径错误导致无法加载音频。
内容的提问来源于stack exchange,提问作者neg1414
相关产品推荐
相关产品推荐

