Android 基於Speex的高度封裝語音庫,0 耦合,沒三方jar包

林冠巨集發表於2017-07-28

作者:林冠巨集 / 指尖下的幽靈

掘金:juejin.im/user/587f0d…

部落格:www.cnblogs.com/linguanh/

GitHub : github.com/af913337456…

為了您的直觀體驗,請務必看完下面 截圖,原始碼 gitHub 連結在其之後。

順便提一下:
這個是接著我上一次開源的 仿:Android - 微信 - 朋友圈 - 小視訊播放,多4句廢話算我輸 專案的。

目的:
不想為具備相同功能的應用開發做每次的相同程式碼的編寫,再用簡潔的風格造輪子。


為了避免大家浪費時間,直接先看下面的 截圖,看完後,若你覺得會需要到,那麼就請聽我繼續。


Android 基於Speex的高度封裝語音庫,0 耦合,沒三方jar包
Android 基於Speex的高度封裝語音庫,0 耦合,沒三方jar包


Android 基於Speex的高度封裝語音庫,0 耦合,沒三方jar包
Android 基於Speex的高度封裝語音庫,0 耦合,沒三方jar包

扯下感慨

之前說過的開源IM系統,其實是做好了的,沒什麼時間寫文件,太亂開了也沒意義。這次的文章也是擠出時間寫的。語言我會盡量做到通俗易懂,少說點廢話,謝謝那些一直關注我的同行,定以乾貨以回報之。

GitHub 連結

本著開源的精神,如果對你有用,希望您能給予個星星(star)
github.com/af913337456…

功能點

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

終。

相關文章