iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 18
0
Software Development

Java 與 Kotlin 入門系列 第 18

[Day18]MediaRecorder

MediaRecorder

首先創建一個RecordActivity,用來錄製聲音用的class。

processViews();

findViewById找到對應元件。

Intent intent = getIntent();
fileName = intent.getStringExtra("fileName");
  • 讀取檔案名稱
  • 在EditActivity時,創造新檔案。
//取消,確定
    public void onSubmit(View view) {
        if (isRecording) {
            // 停止錄音
            myRecoder.stop();
        }

        // 確定
        if (view.getId() == R.id.record_ok) {
            Intent result = getIntent();
            setResult(Activity.RESULT_OK, result);
        }

        finish();
    }
  • 按取消先判斷是否有在錄音,有的話關掉在finish,沒有直接就finish。
  • 按確定也事先判斷是否有錄音,有的話關掉在儲存至Intent在finish,沒有直接就儲存至Intent在finish。
 public void clickRecord(View view) {
        // 切換
        isRecording = !isRecording;

        // 開始錄音
        if (isRecording) {
            // 設定按鈕圖示為錄音中
            record_button.setImageResource(R.drawable.ic_keyboard_voice_red_24dp);
            // 建立錄音物件
            myRecoder = new MyRecoder(fileName);
            // 開始錄音
            myRecoder.start();
            // 建立並執行顯示麥克風音量的AsyncTask物件
            new MicLevelTask().execute();
        }
        // 停止錄音
        else {
            // 設定按鈕圖示為停止錄音
            record_button.setImageResource(R.drawable.ic_keyboard_voice_black_24dp);
            // 麥克風音量歸零
            record_volumn.setProgress(0);
            // 停止錄音
            myRecoder.stop();
        }
    }
  • 那個錄音按鈕觸發事件,按下去就先變換布林值,開始錄音時改變按鈕顏色,建立一個錄音的事件,並且跑異部處理(execute),在按下的話按鈕換顏色,progress歸0,停止錄音。
// 建立錄音物件,參數為錄音儲存的位置與檔名
MyRecoder(String output) {
this.output = output;
}
        // 開始錄音
        public void start() {
            if (recorder == null) {
// 建立錄音用的MediaRecorder物件
                recorder = new MediaRecorder();
// 設定錄音來源為麥克風,必須在setOutputFormat方法之前呼叫
                recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 設定輸出格式為3GP壓縮格式,必須在setAudioSource方法之後,
// 在prepare方法之前呼叫
                recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
// 設定錄音的編碼方式,必須在setOutputFormat方法之後,
// 在prepare方法之前呼叫
                recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
// 設定輸出的檔案名稱,必須在setOutputFormat方法之後,
// 在prepare方法之前呼叫
                recorder.setOutputFile(output);

                try {
                    // 準備執行錄音工作,必須在所有設定之後呼叫
                    recorder.prepare();
                }
                catch (IOException e) {
                    Log.d("RecordActivity", e.toString());
                }

                // 開始錄音
                recorder.start();
                mEMA = 0.0;
            }
        }

        // 停止錄音
        public void stop() {
            if (recorder != null) {
                // 停止錄音
                recorder.stop();
                // 清除錄音資源
                recorder.release();
                recorder = null;
            }
        }

        public double getAmplitude() {
            if (recorder != null)
                return (recorder.getMaxAmplitude() / 2700.0);
            else
                return 0;
        }

        // 取得麥克風音量
        public double getAmplitudeEMA() {
            double amp = getAmplitude();
            mEMA = EMA_FILTER * amp + (1.0 - EMA_FILTER) * mEMA;
            return mEMA;
        }
    }
  • 傳入指定的錄音檔位置
  • 如果MediaRecorder是空的話,start開始錄音,new一個MediaRecorder,然後來源來自麥克風,壓縮成3GP格式,設定編碼方式,輸出檔案,以上都必須在prepare之前,prepare是準備執行錄音工作,必須在所有設定之後呼叫
  • stop如果不是空的,MediaRecorder暫停,然後清除資源(release)

上一篇
[Day17]RetrofitClient
下一篇
[DAY19]MediaRecoder-02
系列文
Java 與 Kotlin 入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言