在Android上用Java或C/C++解码Airplay数据包

Decoding Airplay Packets in Java or C/C++ on Android

本文关键字:C++ 解码 Airplay 数据包 Android 上用 Java      更新时间:2023-10-16

我目前正在为安卓应用程序的一个子部分开发AirPlay接收器。我使用以下框架:

https://github.com/pentateu/DroidAirPlay

虽然这在一些中端设备(如miPad)上效果很好,但我们需要在低规格的自定义设备上运行。该定制设备解码播放数据包的速度比miPad慢10到20倍。结果,音频分组失去了时间同步,并且由于解码分组所花费的时间,音频永远不能重新同步。

我在Play Store上查看了其他一些播放接收器应用程序,从我所看到的来看,它们往往是基于Shairport的(https://github.com/abrasive/shairport)对于播放接收器方面的事情。

**注意:**基于Shairport的框架在低端设备上似乎没有出现同步问题。

我使用的框架主要基于Shairport框架,除了它是用Java编写的。

在解码数据方面,C/C++是否远远优于Java?

如果是这样的话,通过使用NDK的C或C++实现来指导DroidAirPlay框架的解码部分会给我带来很大的性能提升吗?

提前感谢

Matt

虽然Java确实编译为在虚拟机中运行的字节码,但无论是否使用C/C++,它都不一定比本机编译的可执行文件慢(或快)。这完全取决于程序!

在这种情况下,Java可能会变慢,原因有很多:

  • 解码实现可能只是编码/优化不好?(这并不是Java的错)
  • Java编译器可以为JVM生成次优代码
  • Java的一些语言构造对于这里的速度/资源需求来说太慢了
  • JVM只是另一个抽象层,也是罪魁祸首
  • 垃圾收集在里面

(我必须注意,我不是Java方面的专家!)

然而,我仍然不会称Java本质上比C或C++慢。我相信你可以在互联网上找到很多将一种语言与另一种语言进行比较的基准和测试,有些人在一定程度上(出于自豪和自我?)声称。但这些测试只是特定的情况,通常测试更大语言的具体方面(例如哈希图查找性能!)。

LLVM有一篇关于C的三部分博客文章,以及为什么未定义的行为允许编译器生成仍然正确但更高效的代码,而代价是推断运行时安全检查或决定i+1总是在i之后,完全忽略了整数溢出的存在。如果程序员不小心,这可能会带来灾难性的后果。

用Bjarne自己在抽象和C++机器模型中的话来说:

C++被设计成一种系统编程语言,并已用于嵌入式系统编程和其他资源受限类型的从最早的时候开始编程。

因此,我相信C和C++可以比Java更进一步,因为这种未定义的行为和对它的限制更少