Android上的后台任务流式传输视频播放性能问题

时间:2010-03-02 08:33:18

标签: android performance web-services bluetooth video-streaming

我已经开发了一个小应用程序,可以通过VideoView小部件(我已经尝试过Mplayer + SurfaceView方法)从rstp流服务器(在这种情况下是darwin,但这不相关)播放视频。我使用Wifi连接。

视频是唯一的任务时,视频播放流畅。小应用程序应该同时执行其他任务,例如不断发现蓝牙设备并调用远程Web服务(我正在使用Ksoap2)。当这些背景播放与视频播放同时运行时,性能难以置信地下降(图像和声音有时会停止,图像会变形,显示相当大的正方形而不是正确的帧)。

即使使用低质量视频(3gp,50 kbps),也会发生这种情况。对于蓝牙发现,我使用了两种可用的方法而没有相互提高性能:

  • 使用SDK 5提供的发现方式并注册所有找到的蓝牙设备。
  • 使用本机调用自编写的scan()方法,该方法利用Bluez API提供的hci_inquiry()函数。

对WS的调用要求对发现的设备进行蓝牙攻击。发现完成后调用。

我尝试使用GLSurfaceView而不是SurfaceView,但由于我对Android平台很新,并且没有3D图形编程里程,我无法使其工作,因为我找不到任何如何使用OpenGL的示例ES属性播放视频,仍然能够让Android API控制其他UI相关的东西(Dialogs / Menus / Toasts)。另一方面,我不知道这是否确实可以改善播放效果。

我可以采取的任何线索或提示?

编辑:我忘了说我正在开发摩托罗拉里程碑

编辑2 :遵循CommonsWare和snctln建议我尝试尽量减少应用程序的内存占用,同时不完全忽略SOAP WS调用。

现在我尝试缓存尽可能多的对象,并且仅在找到新的BT设备时执行调用(WS需要发现BT设备作为输入)以最小化GC调用。只有在蓝牙发现处于活动状态时才能播放视频(完全没有WS呼叫)。

编辑3:解决方案:我在扫描蓝牙设备时修改了我的应用程序以使用UMTS(3G)数据连接而不是Wifi。虽然设备访问公共互联网(m.youtube.com),但它播放流媒体视频比3G(来自公共互联网服务器)更顺畅,而非本地Wifi(来自本地流媒体服务器)。本地流媒体服务器性能不是问题,因为流式传输到桌面PC运行正常。我还将设备固件升级到2.0.1,并且通过本地Wifi连接也经历了一些改进,但3G播放性能仍然高于Wifi。

我的结论是,当使用同步Wifi /蓝牙通信时,此设备必须具有一些冲突的硬件(可能是相同的芯片组)或软件问题。

2 个答案:

答案 0 :(得分:1)

请理解,摩托罗拉Milestone在大约12 - 15年前拥有PC的CPU速度和RAM。

  

我的方式的任何线索或提示   取?

转储SOAP并使用轻量级Web服务协议(例如,基于REST的JSON)。降低执行此工作的线程的优先级,以便它们不会干扰处理视频播放的线程。尽可能多地在蓝牙扫描中添加“呼吸时间”,而不是连续执行代码以尝试发现设备。

假设无法解决问题,请使用traceview和类似工具尝试优化后台线程(可能没有视频运行)。

答案 1 :(得分:1)

你可以做的一件事就是看看你的内存分配。大约一年前,我有一个游戏的显示性能问题,每2秒左右就会有大量的“滞后”。我发布了android-develoeprs谷歌小组,并得到一些指导,以便从一个Android工程师追踪问题。他后来将this blog post放在一起,详细说明了跟踪内存分配的过程,这一点很重要,因为我看到的滞后直接归因于垃圾收集。现在我将分配保持在最低限度,这种延迟的发生频率要低得多。

此外,我同意Mark(CommonsWare)的意见,如果您可以将肥皂转移到轻量级协议中,您可能会看到一些改进的性能。