`
wang_peng1
  • 浏览: 3944349 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

speex 和libogg 编译

 
阅读更多
下载:
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库在Linux上是一项相对简单的过程,只需要遵循正确的步骤,确保所有依赖项都已安装,并按照配置、编译和安装的顺序进行操作。完成这些步骤后,你就可以在你的项目中充分利用speex库提供的高质量语音...

    在windows7下编译speex的详细过程

    在Windows7操作系统下编译SPEEX(一个开源的语音编码解码库)的详细过程涉及多个步骤,包括环境配置、编译依赖库、解决编译错误等。以下是详细知识点的总结: 1. 准备工作 - 需要在Windows7环境下准备Visual ...

    Speex1.2编译后代码

    本资源包含了Speex 1.2版本和libogg 1.3.3版本在Windows 10环境下,使用Visual Studio 2015编译后的代码,这对于开发者学习和使用Speex库具有很高的参考价值。 ** Speex 库介绍 ** Speex 是一种免费且开源的音频...

    IOS开发之使用Speex格式实现简单的语音聊天功能

    在iOS中,可以使用libogg和libvorbisfile库来处理ogg文件。 五、优化与性能 1. 帧同步:Speex是以帧为单位进行编码和解码的,需要处理好帧同步问题,确保两端的编码和解码步调一致。 2. 网络适应性:考虑网络状况...

    speexdsp-win vs2015编译

    确认无误后,点击“生成”-&gt;“构建解决方案”,VS2015将开始编译和链接 SpeexDSP-win。如果一切顺利,你应该能在输出目录下看到生成的.lib或.dll文件。 7. **测试与调试**: 编译完成后,你可以编写一个简单的...

    speex_libs:libogg-1.3.2 & speex-1.2rc2 & speexdsp-1.2rc3,为iOS构建

    标题中的“speex_libs”指的是 Speex 库的相关组件,包括了 `libogg-1.3.2`, `speex-1.2rc2` 和 `speexdsp-1.2rc3` 这三个版本。这些是开源音频处理库,主要在iOS平台上进行构建。以下是关于这些组件的详细知识: 1...

    linphone-3.2.0的编译与移植

    2. **libogg编译** 进入`libogg`目录,执行`configure`脚本并指定安装路径为`/home/cena/linphone/x86_target/`,然后执行`make`和`make install`完成编译和安装。 3. **speex编译** 同样地,进入`speex`目录,...

    FFMPEG编译手册

    下面是对FFMPEG编译手册的解读和知识点总结。 标题:FFMPEG编译手册 描述:主要是针对最新版的FFMPEG编译过程,并将h264功能加入FFMPEG中 标签:FFMPEG 编译 主要内容: 1. FFMPEG功能概述 FFMPEG是一款功能...

    FFmpeg 4.3.1 win32 编译 .lib.a.def.dll include ffmpeg.exe ffplay.exe ffprobe.exe

    带有fdk-aac, libmp3lame libgsm libogg libtheora libvorbis libvpx speex x264 xvidcore 用msys2编译的 (!!!还有一件事,技术不足libmp3lame3.100版本要改太多东西,就编译了3.99.5版本) (!!!没有x265 因为cmake出...

    linphone依赖的库文件

    标题 "linphone依赖的库文件" 指的是在开发或运行Linphone这款VoIP(Voice over IP)软件时所需要的一些关键库...通过编译和配置这些库,开发者可以确保Linphone与其他软硬件环境的兼容性,并针对特定需求进行优化。

    linephone语音模块使用说明

    Linephone 语音模块使用了多种开源库和工具,包括 GSM 编解码库、ALSA 用户层控制函数库、SPEEX 开源语音编解码库、LiveMedia 多媒体支持库、FFmpeg 多媒体编码支持库、OSIP 协议库、eXosip2 基于 libosip2 的 SIP ...

    基于mediastreamer2的网络电话实现流程以及源码库

    最后大致了解了一下,做这个项目最终要的就是需要移植好多的库,每一个库都需要配置,最后在交叉编译好动态库,然后在执行mediastreamer2的时候去调用这些动态库和头文件就OK了。 1、首先meidastream2是基于ortp库的...

    linphone3.5.2

    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虚拟机环境...

    freeswitch-1.10.2.-release.tar.gz

    进入解压后的目录,执行配置、编译和安装: ``` cd freeswitch-1.10.2 ./configure make sudo make install ``` 注意:根据你的系统配置,可能需要调整`./configure`时的选项,例如指定安装路径或启用特定模块。 五...

    EeayDarwin CentOS6.6 64部署指南

    - **EasyDarwin源码**: 用于自定义编译。 - **gcc-5.3.0.tar.gz**: 更新编译器至最新版本。 - **ffmpeg3.0源码**: 用于处理视频流。 - **nginx-1.11.10.tar.gz**: 提供HTTP服务和RTMP模块支持。 3. **依赖库**: ...

    opensips-freeSwitch负载均衡环境搭建配置.pptx

    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-...

    centos安装freeswitch过程实录

    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 ...

Global site tag (gtag.js) - Google Analytics