国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android實現錄音功能實現實例(MediaRecorder)

2019-12-12 02:23:56
字體:
來源:轉載
供稿:網友

本文介紹了Android實現錄音的實例代碼(MediaRecorder),分享給大家,具體如下:

Android提供了兩個API用于錄音的實現:MediaRecorder 和 AudioRecord,各有優劣。

1、MediaRecorder

已經集成了錄音、編碼、壓縮等,支持少量的錄音音頻格式,大概有.aac(API = 16) .amr .3gp

優點:大部分已經集成,直接調用相關接口即可,代碼量小

缺點:無法實時處理音頻;輸出的音頻格式不是很多,例如沒有輸出mp3格式文件

2、AudioRecord

主要是實現邊錄邊播(AudioRecord+AudioTrack)以及對音頻的實時處理(如會說話的湯姆貓、語音)

優點:語音的實時處理,可以用代碼實現各種音頻的封裝

缺點:輸出是PCM語音數據,如果保存成音頻文件,是不能夠被播放器播放的,所以必須先寫代碼實現數據編碼以及壓縮

先說 MediaRecorder : MediaRecorder因為大部分功能已經集成,所以使用起來相對比較簡單。

下面是個小demo:

① 界面

界面比較簡單,由于MediaRecorder 并不能實現暫停、繼續錄音的功能

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:id="@+id/activity_main"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:orientation="vertical">  <Button    android:id="@+id/btn_start"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:text="開始" />  <Button    android:id="@+id/btn_stop"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:enabled="false"    android:text="停止" />  <TextView    android:id="@+id/text_time"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:gravity="center"    android:text="00:00:00"    android:padding="5dp"    android:layout_marginTop="10dp"/></LinearLayout>

② 相關錄音功能

開始錄音

  public void startRecord() {    // 開始錄音    /* ①Initial:實例化MediaRecorder對象 */    if (mMediaRecorder == null)      mMediaRecorder = new MediaRecorder();    try {      /* ②setAudioSource/setVedioSource */      mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 設置麥克風      /*       * ②設置輸出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式       * ,H263視頻/ARM音頻編碼)、MPEG-4、RAW_AMR(只支持音頻且音頻編碼要求為AMR_NB)       */      mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);      /* ②設置音頻文件的編碼:AAC/AMR_NB/AMR_MB/Default 聲音的(波形)的采樣 */      mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);      fileName = DateFormat.format("yyyyMMdd_HHmmss", Calendar.getInstance(Locale.CHINA)) + ".m4a";      if (!FileUtils.isFolderExist(FileUtils.getFolderName(audioSaveDir))) {        FileUtils.makeFolders(audioSaveDir);      }      filePath = audioSaveDir + fileName;      /* ③準備 */      mMediaRecorder.setOutputFile(filePath);      mMediaRecorder.prepare();      /* ④開始 */      mMediaRecorder.start();    } catch (IllegalStateException e) {      LogUtil.i("call startAmr(File mRecAudioFile) failed!" + e.getMessage());    } catch (IOException e) {      LogUtil.i("call startAmr(File mRecAudioFile) failed!" + e.getMessage());    }  }

音頻編碼可以根據自己實際需要自己設定,文件名防止重復,使用了日期_時分秒的結構,audioSaveDir 是文件存儲目錄,可自行設定。

停止錄音

  public void stopRecord() {    try {      mMediaRecorder.stop();      mMediaRecorder.release();      mMediaRecorder = null;      filePath = "";    } catch (RuntimeException e) {      LogUtil.e(e.toString());      mMediaRecorder.reset();      mMediaRecorder.release();      mMediaRecorder = null;      File file = new File(filePath);      if (file.exists())        file.delete();      filePath = "";    }  }

時長記錄

  // 記錄錄音時長  private void countTime() {    while (isRecording) {        LogUtil.d("正在錄音");        timeCount++;        Message msg = Message.obtain();        msg.what = TIME_COUNT;        msg.obj = timeCount;        myHandler.sendMessage(msg);      try {        timeThread.sleep(1000);      } catch (InterruptedException e) {        e.printStackTrace();      }    }    LogUtil.d("結束錄音");    timeCount = 0;    Message msg = Message.obtain();    msg.what = TIME_COUNT;    msg.obj = timeCount;    myHandler.sendMessage(msg);  }

將錄音時長格式化

  // 格式化 錄音時長為 時:分:秒  public static String FormatMiss(int miss) {    String hh = miss / 3600 > 9 ? miss / 3600 + "" : "0" + miss / 3600;    String mm = (miss % 3600) / 60 > 9 ? (miss % 3600) / 60 + "" : "0" + (miss % 3600) / 60;    String ss = (miss % 3600) % 60 > 9 ? (miss % 3600) % 60 + "" : "0" + (miss % 3600) % 60;    return hh + ":" + mm + ":" + ss;  }

Activity全部代碼

import android.media.MediaRecorder;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.text.format.DateFormat;import android.view.View;import android.widget.Button;import android.widget.TextView;import com.zzx.hellokotlin.R;import com.zzx.hellokotlin.utils.FileUtils;import com.zzx.hellokotlin.utils.LogUtil;import java.io.File;import java.io.IOException;import java.util.Calendar;import java.util.Locale;public class Record2Activity extends AppCompatActivity {  // 錄音界面相關  Button btnStart;  Button btnStop;  TextView textTime;  // 錄音功能相關  MediaRecorder mMediaRecorder; // MediaRecorder 實例  boolean isRecording; // 錄音狀態  String fileName; // 錄音文件的名稱  String filePath; // 錄音文件存儲路徑  Thread timeThread; // 記錄錄音時長的線程  int timeCount; // 錄音時長 計數  final int TIME_COUNT = 0x101;  // 錄音文件存放目錄  final String audioSaveDir = Environment.getExternalStorageDirectory().getAbsolutePath()+"/audiodemo/";  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_record2);    btnStart = (Button) findViewById(R.id.btn_start);    btnStop = (Button) findViewById(R.id.btn_stop);    textTime = (TextView) findViewById(R.id.text_time);    btnStart.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View v) {        // 開始錄音        btnStart.setEnabled(false);        btnStop.setEnabled(true);        startRecord();        isRecording = true;        // 初始化錄音時長記錄        timeThread = new Thread(new Runnable() {          @Override          public void run() {            countTime();          }        });        timeThread.start();      }    });    btnStop.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View v) {        // 停止錄音        btnStart.setEnabled(true);        btnStop.setEnabled(false);        stopRecord();        isRecording = false;      }    });  }  // 記錄錄音時長  private void countTime() {    while (isRecording) {        LogUtil.d("正在錄音");        timeCount++;        Message msg = Message.obtain();        msg.what = TIME_COUNT;        msg.obj = timeCount;        myHandler.sendMessage(msg);      try {        timeThread.sleep(1000);      } catch (InterruptedException e) {        e.printStackTrace();      }    }    LogUtil.d("結束錄音");    timeCount = 0;    Message msg = Message.obtain();    msg.what = TIME_COUNT;    msg.obj = timeCount;    myHandler.sendMessage(msg);  }  /**   * 開始錄音 使用amr格式   * 錄音文件   * @return   */  public void startRecord() {    // 開始錄音    /* ①Initial:實例化MediaRecorder對象 */    if (mMediaRecorder == null)      mMediaRecorder = new MediaRecorder();    try {      /* ②setAudioSource/setVedioSource */      mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 設置麥克風      /*       * ②設置輸出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式       * ,H263視頻/ARM音頻編碼)、MPEG-4、RAW_AMR(只支持音頻且音頻編碼要求為AMR_NB)       */      mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);      /* ②設置音頻文件的編碼:AAC/AMR_NB/AMR_MB/Default 聲音的(波形)的采樣 */      mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);      fileName = DateFormat.format("yyyyMMdd_HHmmss", Calendar.getInstance(Locale.CHINA)) + ".m4a";      if (!FileUtils.isFolderExist(FileUtils.getFolderName(audioSaveDir))) {        FileUtils.makeFolders(audioSaveDir);      }      filePath = audioSaveDir + fileName;      /* ③準備 */      mMediaRecorder.setOutputFile(filePath);      mMediaRecorder.prepare();      /* ④開始 */      mMediaRecorder.start();    } catch (IllegalStateException e) {      LogUtil.i("call startAmr(File mRecAudioFile) failed!" + e.getMessage());    } catch (IOException e) {      LogUtil.i("call startAmr(File mRecAudioFile) failed!" + e.getMessage());    }  }  /**   * 停止錄音   */  public void stopRecord() {    //有一些網友反應在5.0以上在調用stop的時候會報錯,翻閱了一下谷歌文檔發現上面確實寫的有可能會報錯的情況,捕獲異常清理一下就行了,感謝大家反饋!    try {      mMediaRecorder.stop();      mMediaRecorder.release();      mMediaRecorder = null;      filePath = "";    } catch (RuntimeException e) {      LogUtil.e(e.toString());      mMediaRecorder.reset();      mMediaRecorder.release();      mMediaRecorder = null;      File file = new File(filePath);      if (file.exists())        file.delete();      filePath = "";    }  }  // 格式化 錄音時長為 時:分:秒  public static String FormatMiss(int miss) {    String hh = miss / 3600 > 9 ? miss / 3600 + "" : "0" + miss / 3600;    String mm = (miss % 3600) / 60 > 9 ? (miss % 3600) / 60 + "" : "0" + (miss % 3600) / 60;    String ss = (miss % 3600) % 60 > 9 ? (miss % 3600) % 60 + "" : "0" + (miss % 3600) % 60;    return hh + ":" + mm + ":" + ss;  }  Handler myHandler = new Handler() {    @Override    public void handleMessage(Message msg) {      switch (msg.what) {        case TIME_COUNT:          int count = (int) msg.obj;          LogUtil.d("count == " + count);          textTime.setText(FormatMiss(count));          break;      }    }  };}

總結:MediaRecorder 實現錄音還是比較簡單的,只是不能暫停。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平乡县| 清镇市| 花莲县| 云南省| 宁明县| 奉节县| 唐山市| 嘉鱼县| 通州区| 玉山县| 巴中市| 玉溪市| 丰原市| 深泽县| 商洛市| 黄山市| 台前县| 四川省| 上杭县| 仪征市| 宝山区| 留坝县| 威海市| 安平县| 大邑县| 木兰县| 隆昌县| 永平县| 丹东市| 犍为县| 新闻| 安图县| 汶川县| 嘉禾县| 错那县| 梁平县| 桐城市| 桃园市| 将乐县| 金山区| 汝城县|