在Android上用Java或C/C++解码Airplay数据包
Decoding Airplay Packets in Java or C/C++ on Android
我目前正在为安卓应用程序的一个子部分开发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更进一步,因为这种未定义的行为和对它的限制更少
- 无法解码base64+deflate数据
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 使用已使用 java 编码的 openssl 解码数据
- 如何使用 OpenCV 解码在两个 UWP 应用之间发送的图像字节?
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- 从原始字节解码协议缓冲区(以 C++为单位)
- FFmpeg——使用硬件加速进行视频解码
- 如何从WIC解码器确定自上而下/自下而上?
- 使用公钥加密消息:BER 解码错误
- 在CRC-16 CCITT中将数据从二进制解码为文本,我应该输入一个码字,使用CRC生成器进行编码
- 在 GLFW 窗口中显示 FFMPEG 解码帧
- 如何将 MJPEG 解码为原始 RGB(或 YUV)数据
- 编译时 Base64 解码 C++
- 解码H264流时如何跳过帧?
- 无法在 HEVC 解码器上设置输出类型 IMFTransform
- pyserial arduino 字节阵列解码问题
- 将帧从 h264 流解码到 OpenCV Mat
- 连接无线电流和 MP3 解码器
- 将数据包从C++服务器发送到NodeJs服务器时出现MessagePack解码错误
- h264_cuvid编解码器未找到