我正在开发一个Android应用程序,它使用DJI Mobile SDK将DJI无人机的视频流发送到ANT媒体服务器。 使用RTMP协议,使用SDK方法对视频进行编码和发送。 使用ANT RTMP转WEBRTC,由于延迟非常低,我注意到一个问题:
我也使用 DJI 提供的 Mobile SDK Sample 进行了测试,行为是相同的。 考虑到性能问题,我然后附加了 Android Studio Profiler,我注意到一个非常奇怪的行为:附加了探查器后,流性能是完美的。 4-500ms 恒定延迟,即使经过数小时也没有任何损失。 如果我在附加分析器的情况下立即启动应用程序或将其附加到打开的应用程序,则没有区别,重要的是在开始流式传输之前附加分析器。
profiling环境和非profiling环境有什么区别?在 Android Profiler 执行期间是否在系统/应用程序上设置了一些参数(线程优先级、系统计时器分辨率、无设备优化..?)?
编辑
这是设置 rtmp URL 并开始流式传输的代码片段,不需要更多代码。所有的魔力都是由 DJI Mobile SDK 完成的。
new Thread() {
@Override
public void run() {
DJISDKManager.getInstance().getLiveStreamManager().setLiveUrl(rtmpUrl);
int result = DJISDKManager.getInstance().getLiveStreamManager().startStream();
DJISDKManager.getInstance().getLiveStreamManager().setStartTime();
}
}.start();
我不知道是什么让您的应用程序在附加分析器的情况下运行得更快,但我可以确认您提到的所有内容(线程优先级等)都没有在分析器中实现。我可以列出一堆在附加探查器时导致性能开销的内容(设备上的服务器、JVMTI 回调等),它们只会减慢应用程序的速度,而不是相反。
如果不查看您的应用程序,我无法想到任何解释。如果您愿意,可以查看 Android Studio 分析器的源代码。
出现该问题是因为低开销分析使用可调试的错误参数运行。当您尝试分析应用程序时,无法附加调试进程。