专栏首页林冠宏的技术文章Android 基于 Speex 的高度封装语音库,0 耦合,没三方jar包

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

作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguanh/ GitHub : https://github.com/af913337456/ 为了您的直观体验,请务必看完下面 截图,源码 gitHub 链接在其之后。 顺便提一下: 这个是接着我上一次开源的 仿:Android - 微信 - 朋友圈 - 小视频播放,多4句废话算我输 项目的。 目的: 不想为具备相同功能的应用开发做每次的相同代码的编写,再用简洁的风格造轮子。


为了避免大家浪费时间,直接先看下面的 截图,看完后,若你觉得会需要到,那么就请听我继续。

扯下感慨

之前说过的开源IM系统,其实是做好了的,没什么时间写文档,太乱开了也没意义。这次的文章也是挤出时间写的。语言我会尽量做到通俗易懂,少说点废话,谢谢那些一直关注我的同行,定以干货以回报之。

GitHub 链接

本着开源的精神,如果对你有用,希望您能给予个星星(star) https://github.com/af913337456/SpeexVoiceRecorder

功能点

1,直观的

  • 按键触发录音
  • 上移动或者其它移动可以撤销
  • 动态根据声音分贝显示图片进度效果
  • 录音时间过短的提示

2,隐藏的

  • 0 耦合,dialog 在内的 UI 代码我也集合了,业界风格。
  • 使用方便,下面见解析
  • 低内存占用,提供捞底回收
  • 多接口延伸,例如结果文件路径的返回,和文件的大小
  • 基于 Speex jni 库,高效,自定义语音文件格式

解析

实例:

private VoiceRecorderHelper voiceRecorderHelper;

触发:

// R.id.record 这个 VIew 是你的触发 View
findViewById(R.id.record).setOnTouchListener(
        new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent motionEvent) {
                switch (motionEvent.getAction()){
                    case MotionEvent.ACTION_DOWN:  /** 手指按下 */
                        voiceRecorderHelper.Action_Down(v,motionEvent);
                        return true;
                    case MotionEvent.ACTION_MOVE:  /** 移动 */
                        voiceRecorderHelper.Action_Move(v,motionEvent);
                        return true;
                    case MotionEvent.ACTION_UP:    /** 抬起 */
                        voiceRecorderHelper.Action_Up(v,motionEvent);
                        return true;
                }
                return false;
            }
        }
);

初始化:

voiceRecorderHelper =
                new VoiceRecorderHelper(
                        this,
                        new VoiceRecorderHelper.CallBack()
                {
                        @Override
                        public String setOutPutPath() {
                            /** 设置录音结果路径,你的格式也在这里设置 */
                            return getAudioSavePath("LinGuanHong");
                        }

                        @Override
                        public void onDown(View v) {
                            /** 纯粹的 down 事件回调 */
                        }

                        @Override
                        public void onMove_in_limit(View v) {
                            /** 手指移动的范围在限制内 */
                        }

                        @Override
                        public void onMove_out_limit(View v) {
                            /** 手指移动超过范围,内部做了显示取消的提示 */
                        }

                        @Override
                        public void onUp_start(View v) {
                            /** 纯粹的 Up 事件回调 */
                        }

                        @Override
                        public void onUp_cancel(View v) {
                            /** 这个时候已经因为手指移动超过范围取消了录音 */
                        }

                        @Override
                        public void onFinishRecord() {
                            /** 录音结束 */
                        }

                        @Override
                        public void onRecordSuccess(float len, String savePath) {
                            /** 录音、解码、保存成功 */
                            Log.e("aaaaa", "录音的路径 " + savePath + " 长度 " + len);
                        }

                        @Override
                        public void onRecordVolumeChange(int voiceValue) {
                            /** 录音声音强度的变化,单位分贝 */
                        }
                    }
                );
    }

技术点 (可以不看)

jni层:编译好 Speex.so 库,使用提供的录制函数。 java层:异步线程录制,获取分贝等数据同步刷新UI

终。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

    作者:林冠宏 / 指尖下的幽灵 腾讯云+社区:https://cloud.tencent.com/developer/user/1148436/activi...

    林冠宏-指尖下的幽灵
  • java 线程池ThreadPoolExecutor 如何与 AsyncTask() 组合使用。

    转载请声明出处谢谢!https://cloud.tencent.com/developer/user/1148436/activities 这里主要使用Exec...

    林冠宏-指尖下的幽灵
  • andriod 手机按键检测事件 onKeyDown() 简述

    函数原型: public boolean onKeyDown(int keyCode, KeyEvent event); 第一个参数是用户按下键时,当前所接收到...

    林冠宏-指尖下的幽灵
  • Android 基于 Speex 的高度封装语音库,0 耦合,没三方jar包

    作者:林冠宏 / 指尖下的幽灵 腾讯云+社区:https://cloud.tencent.com/developer/user/1148436/activi...

    林冠宏-指尖下的幽灵
  • [六] 函数式接口的复合方法示例 predicate 谓词逻辑运算 Function接口 组合运算 比较器 逆序 比较链

    接口中的compose, andThen, and, or, negate 用来组合函数接口而得到更强大的函数接口

    noteless
  • java.util.Optional学习笔记

    java.util.Optional是Java 8新增的类,作为一个持有实例的容器类,可以帮我们把判空的代码写得更优雅,并且该类还提供了一些实用的api,官方文...

    程序员欣宸
  • 干货 | 一篇文章教你用TensorFlow写名著

    前言 最近看完了 LSTM 的一些外文资料,主要参考了 Colah 的 blog以及 Andrej Karpathy blog的一些关于 RNN 和 LST...

    AI研习社
  • 干货 | 一篇文章教你用TensorFlow写名著

    前言 最近看完了 LSTM 的一些外文资料,主要参考了 Colah 的 blog以及 Andrej Karpathy blog的一些关于 RNN 和 LST...

    AI科技评论
  • 微信小程序开发--【APP(Object)函数介绍】(三)

    `App()`` 函数用来注册一个小程序。接受一个 Object 参数,其指定小程序的生命周期回调等。

    先知先觉
  • 你离高效仅『一步之遥』——模块化思维

    模块化思维是指我们需要把工作分门别类,根据自己的工作职责和内容的特点,把工作内容切成相对独立的一些模块,然后根据模块的特点和重要性来采用不同的处理方式,高效地把...

    用户1756920

扫码关注云+社区

领取腾讯云代金券