【发布时间】:2010-03-02 08:33:17
【问题描述】:
我开发了一个小应用程序,它可以通过 VideoView 小部件(我也尝试过 Mplayer+SurfaceView 方法)从 rstp 流服务器(在本例中为 darwin,但这不相关)播放视频。我为此使用 Wifi 连接。
当视频是唯一的任务时,视频播放流畅。小型应用程序应该同时执行其他任务,例如不断发现蓝牙设备并调用远程 Web 服务(我为此使用了 Ksoap2)。当这些背景 taks 与视频播放同时运行时,性能会令人难以置信地下降(图像和声音有时会停止并且图像会失真,显示出相当大的方块而不是正确的帧)。
即使是低质量视频(3gp at 50 kbps)也会发生这种情况。对于蓝牙发现,我使用了两种可用的方法,但彼此之间没有性能增强:
- 使用 SDK 5 提供的发现方式,注册每一个发现的蓝牙设备。
- 使用对利用 Bluez API 提供的
hci_inquiry()函数的自写 scan() 方法的本机调用。
对 WS 的调用需要已发现设备的蓝牙地址。发现完成后调用。
我尝试使用 GLSurfaceView 代替 SurfaceView,但由于我对 Android 平台比较陌生,并且没有 3D 图形编程里程,我无法使其工作,因为我找不到任何使用 OpenGL 的示例ES 可以正确播放视频,并且仍然能够让 Android API 控制其他与 UI 相关的内容(对话框/菜单/Toast)。另一方面,我不知道这是否确实可以改善播放效果。
任何线索或提示我可以采取的方式?
编辑:我忘了说我正在开发摩托罗拉里程碑
编辑 2:按照 CommonsWare 和 snctln 的建议,我尝试在不完全忽略 SOAP WS 调用的同时尽量减少应用程序的内存占用。
现在我尝试缓存尽可能多的对象,并且只在找到新的 BT 设备时才执行调用(WS 需要发现的 BT 设备作为输入)以最小化 GC 调用。只有在蓝牙发现活动(根本没有 WS 调用)的情况下,视频仍然播放得很糟糕。
编辑 3:解决方案:我修改了我的应用程序以在扫描蓝牙设备时使用 UMTS (3G) 数据连接而不是 Wifi。虽然设备访问公共互联网 (m.youtube.com),但它通过 3G(来自公共互联网服务器)播放流视频比通过本地 Wifi(来自本地流媒体服务器)更流畅。本地流媒体服务器性能不是问题,因为流媒体到台式电脑运行良好。我还将设备固件升级到 2.0.1,本地 Wifi 连接也有所改善,但 3G 播放性能仍然优于 Wifi。
我的结论是,此设备在同时使用 Wifi/蓝牙通信时一定存在一些冲突的硬件(可能是相同的芯片组)或软件问题。
【问题讨论】:
标签: android performance web-services bluetooth video-streaming