下载: http://www.speex.org/downloads/ http://xiph.org/downloads/ 建立 jni 文件夹,然后从下载的文件夹中提取相关文件 放到jni下 /libspeex/* ? /jni/libspeex/ /include/speex/* ? /jni/include/speex/ /src/wav_io.h ? /jni/include/speex /src/* ? /jni/libogg/ /include/ogg/* ? /jni/include/ogg 编辑jni/include/speex/speex_config_types.h.in 用后面的取代前面的 @SIZE16@ with short @SIZE32@ with int 然后将此文件重新命名为speex_config_types.h 同样 /jni/include/ogg/config_types.h.in @INCLUDE_INTTYPES_H@ with 1 @INCLUDE_STDINT_H@ with 1 @INCLUDE_SYS_TYPES_H@ with 1 @SIZE16@ with short @USIZE16@ with unsigned short @SIZE32@ with int @USIZE32@ with unsigned int @SIZE64@ with long long 在jni 目录下 Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libspeex LOCAL_CFLAGS = -DFIXED_POINT -DUSE_KISS_FFT -DEXPORT="" -UHAVE_CONFIG_H LOCAL_C_INCLUDES := $(LOCAL_PATH)/include LOCAL_SRC_FILES := \ ./libspeex/bits.c \ ./libspeex/buffer.c \ ./libspeex/cb_search.c \ ./libspeex/exc_10_16_table.c \ ./libspeex/exc_10_32_table.c \ ./libspeex/exc_20_32_table.c \ ./libspeex/exc_5_256_table.c \ ./libspeex/exc_5_64_table.c \ ./libspeex/exc_8_128_table.c \ ./libspeex/fftwrap.c \ ./libspeex/filterbank.c \ ./libspeex/filters.c \ ./libspeex/gain_table.c \ ./libspeex/gain_table_lbr.c \ ./libspeex/hexc_10_32_table.c \ ./libspeex/hexc_table.c \ ./libspeex/high_lsp_tables.c \ ./libspeex/jitter.c \ ./libspeex/kiss_fft.c \ ./libspeex/kiss_fftr.c \ ./libspeex/lpc.c \ ./libspeex/lsp.c \ ./libspeex/lsp_tables_nb.c \ ./libspeex/ltp.c \ ./libspeex/mdf.c \ ./libspeex/modes.c \ ./libspeex/modes_wb.c \ ./libspeex/nb_celp.c \ ./libspeex/preprocess.c \ ./libspeex/quant_lsp.c \ ./libspeex/resample.c \ ./libspeex/sb_celp.c \ ./libspeex/scal.c \ ./libspeex/smallft.c \ ./libspeex/speex.c \ ./libspeex/speex_callbacks.c \ ./libspeex/speex_header.c \ ./libspeex/stereo.c \ ./libspeex/vbr.c \ ./libspeex/vq.c \ ./libspeex/window.c \ ./libogg/bitwise.c \ ./libogg/framing.c include $(BUILD_SHARED_LIBRARY) 如此就编写好了。 2.为了调用 还需要添加jni 文件 #include <jni.h> #include <string.h> #include <unistd.h> #include <speex/speex.h> static int codec_open = 0; static int dec_frame_size; static int enc_frame_size; static SpeexBits ebits, dbits; void *enc_state; void *dec_state; static JavaVM *gJavaVM; extern "C" JNIEXPORT jint JNICALL Java_com_ultraman_Speex_open (JNIEnv *env, jobject obj, jint compression) { int tmp; if (codec_open++ != 0) return (jint)0; speex_bits_init(&ebits); speex_bits_init(&dbits); enc_state = speex_encoder_init(&speex_nb_mode); dec_state = speex_decoder_init(&speex_nb_mode); tmp = compression; speex_encoder_ctl(enc_state, SPEEX_SET_QUALITY, &tmp); speex_encoder_ctl(enc_state, SPEEX_GET_FRAME_SIZE, &enc_frame_size); speex_decoder_ctl(dec_state, SPEEX_GET_FRAME_SIZE, &dec_frame_size); return (jint)0; } extern "C" JNIEXPORT jint Java_com_ultraman_Speex_encode (JNIEnv *env, jobject obj, jshortArray lin, jint offset, jbyteArray encoded, jint size) { jshort buffer[enc_frame_size]; jbyte output_buffer[enc_frame_size]; int nsamples = (size-1)/enc_frame_size + 1; int i, tot_bytes = 0; if (!codec_open) return 0; speex_bits_reset(&ebits); for (i = 0; i < nsamples; i++) { env->GetShortArrayRegion(lin, offset + i*enc_frame_size, enc_frame_size, buffer); speex_encode_int(enc_state, buffer, &ebits); } //env->GetShortArrayRegion(lin, offset, enc_frame_size, buffer); //speex_encode_int(enc_state, buffer, &ebits); tot_bytes = speex_bits_write(&ebits, (char *)output_buffer, enc_frame_size); env->SetByteArrayRegion(encoded, 0, tot_bytes, output_buffer); return (jint)tot_bytes; } extern "C" JNIEXPORT jint JNICALL Java_com_ultraman_Speex_decode (JNIEnv *env, jobject obj, jbyteArray encoded, jshortArray lin, jint size) { jbyte buffer[dec_frame_size]; jshort output_buffer[dec_frame_size]; jsize encoded_length = size; if (!codec_open) return 0; env->GetByteArrayRegion(encoded, 0, encoded_length, buffer); speex_bits_read_from(&dbits, (char *)buffer, encoded_length); speex_decode_int(dec_state, &dbits, output_buffer); env->SetShortArrayRegion(lin, 0, dec_frame_size, output_buffer); return (jint)dec_frame_size; } extern "C" JNIEXPORT jint JNICALL Java_com_ultraman_Speex_getFrameSize (JNIEnv *env, jobject obj) { if (!codec_open) return 0; return (jint)enc_frame_size; } extern "C" JNIEXPORT void JNICALL Java_com_ultraman_Speex_close (JNIEnv *env, jobject obj) { if (--codec_open != 0) return; speex_bits_destroy(&ebits); speex_bits_destroy(&dbits); speex_decoder_destroy(dec_state); speex_encoder_destroy(enc_state); } 命名为speex_jni.cpp 放在jni下面 然后在android.mk 下追加 最后一行 ./libogg/bitwise.c \ ./libogg/framing.c \ ./speex_jni.cpp java层调用 package com.audio; class Speex { /* quality * 1 : 4kbps (very noticeable artifacts, usually intelligible) * 2 : 6kbps (very noticeable artifacts, good intelligibility) * 4 : 8kbps (noticeable artifacts sometimes) * 6 : 11kpbs (artifacts usually only noticeable with headphones) * 8 : 15kbps (artifacts not usually noticeable) */ private static final int DEFAULT_COMPRESSION = 8; Speex() { } public void init() { load(); open(DEFAULT_COMPRESSION); } private void load() { try { System.loadLibrary("speex"); } catch (Throwable e) { e.printStackTrace(); } } public native int open(int compression); public native int getFrameSize(); public native int decode(byte encoded[], short lin[], int size); public native int encode(short lin[], int offset, byte encoded[], int size); public native void close(); }
附件是生成的speex。so 和相关的jni文件
相关推荐
总之,编译speex库在Linux上是一项相对简单的过程,只需要遵循正确的步骤,确保所有依赖项都已安装,并按照配置、编译和安装的顺序进行操作。完成这些步骤后,你就可以在你的项目中充分利用speex库提供的高质量语音...
在Windows7操作系统下编译SPEEX(一个开源的语音编码解码库)的详细过程涉及多个步骤,包括环境配置、编译依赖库、解决编译错误等。以下是详细知识点的总结: 1. 准备工作 - 需要在Windows7环境下准备Visual ...
本资源包含了Speex 1.2版本和libogg 1.3.3版本在Windows 10环境下,使用Visual Studio 2015编译后的代码,这对于开发者学习和使用Speex库具有很高的参考价值。 ** Speex 库介绍 ** Speex 是一种免费且开源的音频...
在iOS中,可以使用libogg和libvorbisfile库来处理ogg文件。 五、优化与性能 1. 帧同步:Speex是以帧为单位进行编码和解码的,需要处理好帧同步问题,确保两端的编码和解码步调一致。 2. 网络适应性:考虑网络状况...
确认无误后,点击“生成”->“构建解决方案”,VS2015将开始编译和链接 SpeexDSP-win。如果一切顺利,你应该能在输出目录下看到生成的.lib或.dll文件。 7. **测试与调试**: 编译完成后,你可以编写一个简单的...
标题中的“speex_libs”指的是 Speex 库的相关组件,包括了 `libogg-1.3.2`, `speex-1.2rc2` 和 `speexdsp-1.2rc3` 这三个版本。这些是开源音频处理库,主要在iOS平台上进行构建。以下是关于这些组件的详细知识: 1...
2. **libogg编译** 进入`libogg`目录,执行`configure`脚本并指定安装路径为`/home/cena/linphone/x86_target/`,然后执行`make`和`make install`完成编译和安装。 3. **speex编译** 同样地,进入`speex`目录,...
下面是对FFMPEG编译手册的解读和知识点总结。 标题:FFMPEG编译手册 描述:主要是针对最新版的FFMPEG编译过程,并将h264功能加入FFMPEG中 标签:FFMPEG 编译 主要内容: 1. FFMPEG功能概述 FFMPEG是一款功能...
带有fdk-aac, libmp3lame libgsm libogg libtheora libvorbis libvpx speex x264 xvidcore 用msys2编译的 (!!!还有一件事,技术不足libmp3lame3.100版本要改太多东西,就编译了3.99.5版本) (!!!没有x265 因为cmake出...
标题 "linphone依赖的库文件" 指的是在开发或运行Linphone这款VoIP(Voice over IP)软件时所需要的一些关键库...通过编译和配置这些库,开发者可以确保Linphone与其他软硬件环境的兼容性,并针对特定需求进行优化。
Linephone 语音模块使用了多种开源库和工具,包括 GSM 编解码库、ALSA 用户层控制函数库、SPEEX 开源语音编解码库、LiveMedia 多媒体支持库、FFmpeg 多媒体编码支持库、OSIP 协议库、eXosip2 基于 libosip2 的 SIP ...
最后大致了解了一下,做这个项目最终要的就是需要移植好多的库,每一个库都需要配置,最后在交叉编译好动态库,然后在执行mediastreamer2的时候去调用这些动态库和头文件就OK了。 1、首先meidastream2是基于ortp库的...
linphone3.5.2版本的源代码,压缩包中包括:linphone-3.5.2.tar.gz,libogg-1.1.3.tar.gz,speex-1.2rc1.tar.gz,libosip2-3.3.0.tar.gz,libeXosip2-3.3.0.tar.gz,皆从开源社区获得。本人已经在Fedora17虚拟机环境...
进入解压后的目录,执行配置、编译和安装: ``` cd freeswitch-1.10.2 ./configure make sudo make install ``` 注意:根据你的系统配置,可能需要调整`./configure`时的选项,例如指定安装路径或启用特定模块。 五...
- **EasyDarwin源码**: 用于自定义编译。 - **gcc-5.3.0.tar.gz**: 更新编译器至最新版本。 - **ffmpeg3.0源码**: 用于处理视频流。 - **nginx-1.11.10.tar.gz**: 提供HTTP服务和RTMP模块支持。 3. **依赖库**: ...
devel libedit-devel libidn-devel libjpeg-devel libmemcached-devel libogg-devel libsilk-devel libsndfile-devel libtheora-devel libtool libvorbis-devel libxml2-devel lua-devel lz4-devel mongo-c-driver-...
devel libedit-devel libidn-devel libjpeg-devel libmemcached-devel libogg-devel libsilk-devel libsndfile-devel libtiff-devel libtheora-devel libtool libvorbis-devel libxml2-devel lua-devel lzo-devel ...