首先去官网

https://www.speex.org/downloads/

下载解压

将include、libspeex文件夹复制到自己新建工程的jni目录下

speex有关的类

package com.speex.lib;

public 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 = 4; public 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(); }

对应的C的源码speex_jni.cpp的源码

////

#include <jni.h>

#include <string.h>
#include <unistd.h> #include <speex/speex.h> static int codec_open = ; 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_speex_lib_Speex_open
(JNIEnv *env, jobject obj, jint compression) {
int tmp; if (codec_open++ != )
return (jint); 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);
} extern "C"
JNIEXPORT jint JNICALL Java_com_speex_lib_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-)/enc_frame_size + ;
int i, tot_bytes = ; if (!codec_open)
return ; speex_bits_reset(&ebits); for (i = ; i < nsamples; i++) {
env->GetShortArrayRegion(lin, offset + i*enc_frame_size, 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, , tot_bytes,
output_buffer); return (jint)tot_bytes;
} extern "C"
JNIEXPORT jint JNICALL Java_com_speex_lib_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 ; env->GetByteArrayRegion(encoded, , encoded_length, buffer);
speex_bits_read_from(&dbits, (char *)buffer, encoded_length);
speex_decode_int(dec_state, &dbits, output_buffer);
env->SetShortArrayRegion(lin, , dec_frame_size,
output_buffer); return (jint)dec_frame_size;
} extern "C"
JNIEXPORT jint JNICALL Java_com_speex_lib_Speex_getFrameSize
(JNIEnv *env, jobject obj) { if (!codec_open)
return ;
return (jint)enc_frame_size; } extern "C"
JNIEXPORT void JNICALL Java_com_speex_lib_Speex_close
(JNIEnv *env, jobject obj) { if (--codec_open != )
return; speex_bits_destroy(&ebits);
speex_bits_destroy(&dbits);
speex_decoder_destroy(dec_state);
speex_encoder_destroy(enc_state);
}

在jni目录下新增Android.mk文件,复制如下内容,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 :=
LOCAL_SRC_FILES :=speex_jni.cpp \
./libspeex/bits.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/filters.c \
./libspeex/gain_table_lbr.c \
./libspeex/gain_table.c \
./libspeex/hexc_10_32_table.c \
./libspeex/hexc_table.c \
./libspeex/high_lsp_tables.c \
./libspeex/kiss_fft.c \
./libspeex/kiss_fftr.c \
./libspeex/lpc.c \
./libspeex/lsp_tables_nb.c \
./libspeex/lsp.c \
./libspeex/ltp.c \
./libspeex/modes_wb.c \
./libspeex/modes.c \
./libspeex/nb_celp.c \
./libspeex/quant_lsp.c \
./libspeex/sb_celp.c \
./libspeex/smallft.c \
./libspeex/speex_callbacks.c \
./libspeex/speex_header.c \
./libspeex/speex.c \
./libspeex/stereo.c \
./libspeex/vbr.c \
./libspeex/vorbis_psy.c \
./libspeex/vq.c \
./libspeex/window.c \ include $(BUILD_SHARED_LIBRARY)

在jni下创建Application.mk,并添加如下内容,编译所有平台下的so文件

APP_ABI := all

在jni/include/speex/目录下新增speex_config_types.h文件,复制内容如下

#ifndef __SPEEX_TYPES_H__
#define __SPEEX_TYPES_H__ typedef short spx_int16_t;
typedef unsigned short spx_uint16_t;
typedef int spx_int32_t;
typedef unsigned int spx_uint32_t; #endif

在命令行输入ndk-build

开始编译

在libs目录下面生成

 

speex编译的更多相关文章

  1. 编译Speex生成so库文件(android-speex)

    项目中需要用音频格式转换,之前使用VoAacEncoder,部分手机总是莫名崩溃,所以决定不再使用VoAacEncoder,换做Speex来完成格式转换,但是没有找到Speex的库文件,网上介绍的都是 ...

  2. speex进行音频去噪

    应用speex进行音频去噪,speex功能很强大,因为opus的出现,用speex进行编码/解码的人几乎没有了,但是用speex来进行降噪,去除回声,增益还是很多. 这里用speex进行音频去噪,主要 ...

  3. [原]如何用Android NDK编译FFmpeg

    我们知道在Ubuntu下直接编译FFmpeg是很简单的,主要是先执行./configure,接着执行make命令来编译,完了紧接着执行make install执行安装.那么如何使用Android的ND ...

  4. android源码编译1

    一.环境说明: 1.liunx系统:Ubuntu12.04 2.jdk:sun-java6-jdk 3.g++4.5 gcc4.5 二.android源码的目录结构 |-- Makefile |-- ...

  5. Android - 基于 Speex 的高度封装语音库,0 耦合使用

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  6. 使用speex动态链接库过程中遇到问题及解决方法

    本以为speex的应用程序很容易就能跑起来,可是,实际操作中才发现,这里面暴露 的问题还真不少.看来以后不能眼高手低了,知行合一,这个一定要牢记在心中. speex安装成功后,可以一直无法调用动态链接 ...

  7. 工欲善其事,必先利其器 软件工具开发关键词 protractor自动化测试工具 RegexBuddy正则 CodeSmith,LightSwitch:代码生成 CheatEngine:玩游戏修改内存值必备神器 ApkIDE:Android反编译工具 Reflector:反编译dll动态链接库

    工欲善其事,必先利其器 本文版权归翟士丹(Stan Zhai)和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利. 原文地址:http ...

  8. Android 基于 Speex 的高度封装语音库,0 耦合,没三方jar包

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  9. 音频压缩(Speex使用&Opus简介)--转

    博客地址:http://blog.csdn.net/kevindgk GitHub地址:https://github.com/KevinDGK/MyAudioDemo 一简介 二局域网语音配置 三Sp ...

随机推荐

  1. Luogu 3521 [POI2011]ROT-Tree Rotations

    BZOJ 2212 从下到上线段树合并. 考虑到每一个子树内部产生的贡献不可能通过换儿子消除,所以一次更换只要看看把哪个儿子放在左边产生的逆序对数少就可以了. 逆序对数可以在线段树合并的时候顺便算出来 ...

  2. apache隐藏入口文件index.php

    LoadModule rewrite_module modules/mod_rewrite.so

  3. unix 下 shell 遍历指定范围内的日期

    UNIX下遍历日期,date 没有 -d 的参数,所以需要自己处理. 下面使用时差的方法进行计算,遍历的日期是降序的 #!/usr/bin/ksh . $HOME/.profile timelag= ...

  4. CLRMonitor - 跟踪CLR内部执行过程工具

    CLRMonitor v1.0.1511.13 点击此处下载 软件介绍:这款软件主要用于跟踪CLR内部执行过程,定位当前程序执行的命名空间以及方法名等信息.可以迅速找到被跟踪程序的当前执行方法名.本软 ...

  5. HDU 5038 Grade (水题,坑题)

    题意:给 n 个数,输出众数,但是如果所有的频率都相同但数不同输出 Bad Mushroom. 析:直接记录个数直接暴力就,就是要注意只有一种频率的时候. 代码如下: #pragma comment( ...

  6. SQLite操作

    创建有主键的表: create table test (pkey varchar(16) primary key, value varchar(10)); 创建有复合(即key由多个字段联合组成)主键 ...

  7. 【android】shape的使用

    例子:XML 文件保存在 res/drawable/gradient_box.xml: <?xml version="1.0" encoding="utf-8&qu ...

  8. 后台调js方法

    Page.ClientScript.RegisterStartupScript(Page.GetType(), "", "<script>btnSearch( ...

  9. CefSharp49.0.1 SetZoomLevel

    SetZoomLevel(double zoomLevel)   -8<= zoomLevel <=9 Each zoom level increases the zoom by 20%. ...

  10. Service Fabric 注意事项

    1. ActorTimer和ActorReminder会阻塞一个Actor的其他外部方法调用,即ActorTimer和ActorReminder内部就去未执行完毕之前,该Actor其他方法只能等待. ...