zoukankan      html  css  js  c++  java
  • speex编译

    首先去官网 

    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 = 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_speex_lib_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 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-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);
        }
    
        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_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 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_speex_lib_Speex_getFrameSize
            (JNIEnv *env, jobject obj) {
    
        if (!codec_open)
            return 0;
        return (jint)enc_frame_size;
    
    }
    
    extern "C"
    JNIEXPORT void JNICALL Java_com_speex_lib_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);
    }

    在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目录下面生成

     
  • 相关阅读:
    第 1 章 代码无错便是优?——简单工厂模式
    [转载]由浅入深探究mysql索引结构原理、性能分析与优化
    jquery中 $.expr使用实例介绍
    jQuery UI Widget(1.8.1)工作原理
    asp.net url重写
    CJL.0.1.js
    React Context 的用法
    小程序组件使用
    深入理解es5中Object.defineProperty()
    React合成事件
  • 原文地址:https://www.cnblogs.com/mingfeng002/p/7800439.html
Copyright © 2011-2022 走看看