-1

我正在创建一个用 Java 编写的 VoIP 软电话,目前我已经实现了 G.711 编解码器(全部通过 Java,没有本机代码)。

我想扩展可用的编解码器,尽管在我所见的任何地方,比如像 Jitsi 这样的项目,而不是用 Java 编写算法,它是用 C 编写的,而 JNI 用于调用它。我对C知之甚少,对JNI一无所知,所以我不太急于学习它们。此外,我喜欢不依赖本机代码运行的纯 Java 实现的想法。

我的问题是:我确信我找不到 Java 实现是有充分理由的,但我对编解码器的了解还不够,不知道是什么原因。那么,当另一个像 G.711 这样的编解码器运行良好时,为什么没有任何 G.722 的 Java 实现呢?

此外,如果本机代码是唯一的方法,那么从哪里开始呢?我已经尝试将 G.722.c 代码从 ITU-T 翻译成 Java,但在有点头疼之后我停止了(也是因为我的 G.711 翻译工作正常)。我研究了 Xuggle,但构建项目是一场噩梦,我不能使用 GPL 版本(也没有方便的 Javadoc)。

FFMpeg 看起来对它提供的所有编解码器都很有希望,但我不确定是否要编写自己的 JNI 包装器,而且我看过的那些要么难以实现(Xuggle),要么似乎已经过时(FMJ) .

底线:我想实现新的编解码器,但我想挑选哪些编解码器。当我只想拥有 2 或 3 个音频编解码器时,我不需要整个 AV 库。占用空间小,并且尽可能地使用纯 Java。

4

2 回答 2

0

我已经在 IAX 软电话上使用 GSM(非常小的占用空间)纯 Java 实现来完成它,您在实现 SIP 吗?是开源的吗?基于任何已知的实现(例如同行?)

此致

于 2013-08-08T22:10:48.047 回答
0

编解码器往往对性能至关重要并且具有实时要求——这两者在基于虚拟机的运行时中都更难实现。

当本机实现时,编解码器能够利用通用 VM 无法利用的特定于 CPU 的硬件加速。明显的例子是使用 SIMD 指令来实现过滤器和 FFT,以及专门为加速比特流处理而设计的指令(例如,在寄存器中定位第一个 1 或 0 位)。

对于大多数平板电脑和手机中使用的 ARMv7 CPU 来说,这是一个非常大的问题,因为浮点运算的 FPU 和 NEON (SIMD) 单元的性能之间存在巨大差异。

于 2013-08-08T23:05:03.207 回答