我正在创建一个用Java编写的VoIP软电话,目前我已经实现了G.711编解码器(全部通过Java,没有本机代码)。
我希望扩展可用的编解码器,不过我看到的地方,比如像Jitsi这样的项目,而不是用Java编写算法,它用C语言编写,JNI用来调用它。我对C知之甚少,对JNI一无所知,所以我不急于学习它们。另外,我喜欢纯Java实现的想法,它不依赖于本机代码来运行。
我的问题是:我确信有一个很好的理由我无法找到Java实现,但我不太了解编解码器知道这是什么原因。那么,当G.711这样的另一个编解码器运行得如此之好时,怎么没有G.722的Java实现呢?
此外,如果本机代码是唯一的出路,哪里是一个好的起点?我已经尝试将ITU-T的G.722.c代码翻译成Java,但是在我有点头疼之后我就停止了(因为我的G.711翻译工作正常)。我看过Xuggle,但构建项目是一场噩梦,我不能使用GPL版本(也没有方便的Javadoc)。
FFMpeg对于它提供的所有编解码器看起来都很有希望,但我不确定是否编写了自己的JNI包装器,而我所看到的那些包装器很难实现(Xuggle)或者似乎已经过时了(FMJ)。
底线:我想实现新的编解码器,但我想挑选哪些编解码器。当我只想要2或3个音频编解码器时,我不需要整个AV库。占用空间小,并且可以获得纯Java。
答案 0 :(得分:0)
我在IAX软电话上使用GSM(非常小的占用空间)纯java实现,你实现了SIP吗?是开源的吗?是基于任何已知的实现(对于例如同行?)
最好的问候
答案 1 :(得分:0)
编解码器往往具有性能关键性并且具有实时要求 - 这两者在基于虚拟机的运行时中更难实现。
当本地实现时,编解码器能够利用通用VM无法实现的CPU特定硬件加速。明显的例子是使用SIMD指令来实现滤波器和FFT,以及专门设计用于加速比特流处理的指令(例如,在寄存器中定位前1或0位)。
对于大多数平板电脑和手机中使用的ARMv7 CPU而言,这是一个非常重要的问题,其中FPU和NEON(SIMD)单元之间在浮点运算方面的性能差异很大。