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

求助:Xamarin中VideoView循环播放视频长时间卡顿的解决办法

解决Xamarin VideoView长时间循环播放卡顿问题

针对你遇到的数小时后视频卡顿问题,结合代码分析,以下是具体的修复方案:

1. 修正VideoView的错误复用逻辑

你的VideoView_Completion方法中重复调用Dispose和FindViewById是错误的,这会导致资源释放不彻底或重复创建控件实例,进而引发内存泄漏或资源耗尽。修改如下:

private void VideoView_Completion(object sender, EventArgs e)
{
    // 停止播放并清理当前视频资源
    videoView.StopPlayback();
    videoView.ClearFocus();
    videoView.SetVideoPath(null); // 清空视频路径,释放解码器资源

    hourTextView.Text = DateTime.Now.ToString("HH:mm:ss");

    currentIndex = (currentIndex + 1) % videoUrls.Length;
    PlayNextVideo();
}

同时,PlayNextVideo中存在逻辑错误——你写死了videoUrls[1],应该使用更新后的currentIndex来循环播放列表中的视频:

private void PlayNextVideo()
{
    string tmpPath = Path.Combine(App.AppMainFolder, videoUrls[currentIndex]);
    videoView.SetVideoPath(tmpPath);
    videoView.Start();
}

2. 修复Timer资源泄漏问题

你使用的System.Threading.Timer如果未正确停止,会持续持有Activity引用导致内存泄漏。在Activity销毁时添加清理逻辑:

protected override void OnDestroy()
{
    // 停止并释放Timer
    if (memoryTimer != null)
    {
        memoryTimer.Change(Timeout.Infinite, Timeout.Infinite);
        memoryTimer.Dispose();
        memoryTimer = null;
    }

    // 释放VideoView资源
    if (videoView != null)
    {
        videoView.StopPlayback();
        videoView.Dispose();
        videoView = null;
    }

    base.OnDestroy();
}

另外,内存检测的Timer间隔设置为1秒过于频繁,建议调整为5秒或更长,减少UI刷新带来的资源消耗:

memoryTimer = new Timer(UpdateMemory, null, 0, 5000); // 5秒更新一次

3. 启用硬件加速

确保你的Activity开启硬件加速,利用Odroid-X4U的硬件解码能力,避免软件解码的性能瓶颈:

在代码的OnCreate方法中添加:

Window.SetFlags(WindowManagerFlags.HardwareAccelerated, WindowManagerFlags.HardwareAccelerated);

或者在AndroidManifest.xml的对应Activity标签中配置:

<activity android:name=".YourActivity" android:hardwareAccelerated="true" />

4. 验证视频格式兼容性

确保你播放的视频是Odroid-X4U支持的硬件解码格式(如H.264/AVC),避免使用需要软件解码的格式(如某些编码的MKV、AVI)。可以使用工具将视频转码为兼容性更好的MP4格式。

5. 补充资源监控

虽然你已经监控了RAM,但可以添加对CPU使用率的监控,确认是否是视频解码导致的CPU长期高负载:

// 添加到UpdateMemory方法中
var processStats = new Debug.MemoryInfo();
Debug.GetMemoryInfo(processStats);
var cpuUsage = processStats.TotalPss; // 可通过系统API获取更精确的CPU数据

内容的提问来源于stack exchange,提问作者Arnaud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 07:00:25