You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 07:40:08