织梦CMS - 轻松建站从此开始!

罗索

当前位置: 主页>嵌入式开发>Android>

Android录音与播放

落鹤生 发布于 2012-09-07 09:10 点击:次 
Android多媒体框架包含获取和编码多种音频格式的支持,所以你可以轻松地把音频合并到你的应用中.如果设备支持,你可以使用MediaRecorder APIs 进行录音.本章向你展示如何写一个应用从设备上的microphone获取音频,然后保存并回放.
TAG:

Android多媒体框架包含获取和编码多种音频格式的支持,所以你可以轻松地把音频合并到你的应用中.如果设备支持,你可以使用MediaRecorder APIs 进行录音.

本章向你展示如何写一个应用从设备上的microphone获取音频,然后保存并回放.

注:Android模拟器不具有录音的能力,但是真实的设备一般都具有此功能.

执行音频获取

从设备获取音频比回放音频或视频要复杂一点,但是也还算简单:

  • 创建一个android.media.MediaRecorder的新实例.
  • 使用MediaRecorder.setAudioSource()设置音频源,一般要使用MediaRecorder.AudioSource.MIC.
  • 使用MediaRecorder.setOutputFormat()设置输出文件的格式.
  • 使用MediaRecorder.setOutputFile()设置输出文件的名字.
  • 使用MediaRecorder.setAudioEncoder()设置音频编码.
  • 调用MediaRecorder 实例的MediaRecorder.prepare()
  • MediaRecorder.start()开始获取音频.
  • 调用MediaRecorder.stop().停止.
  • 当你用完MediaRecorder实例后,调用MediaRecorder.release(),就会立即释放资源.

示例:录音并回放录音

下面的例子演示了如何设置,开始以及停止音频获取,以及回放录制的文件.

  1. /* 
  2.  * 如果输出文件被写入外部存储, 
  3.  * 本应用需要具有写外部存储的权限,  
  4.  * 还要具有录音的权限.这些权限必须 
  5.  * 在AndroidManifest.xml 文件中声明,像这样: 
  6.  * 
  7.  * <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
  8.  * <uses-permission android:name="android.permission.RECORD_AUDIO" /> 
  9.  * 
  10.  */ 
  11. package com.android.audiorecordtest; 
  12.  
  13. import android.app.Activity; 
  14. import android.widget.LinearLayout; 
  15. import android.os.Bundle; 
  16. import android.os.Environment; 
  17. import android.view.ViewGroup; 
  18. import android.widget.Button; 
  19. import android.view.View; 
  20. import android.view.View.OnClickListener; 
  21. import android.content.Context; 
  22. import android.util.Log; 
  23. import android.media.MediaRecorder; 
  24. import android.media.MediaPlayer; 
  25.  
  26. import java.io.IOException; 
  27.  
  28.  
  29. public class AudioRecordTest extends Activity 
  30.     private static final String LOG_TAG = "AudioRecordTest"
  31.     private static String mFileName = null
  32.    //录音按钮 
  33.     private RecordButton mRecordButton = null
  34.     private MediaRecorder mRecorder = null
  35.    //回放按钮 
  36.     private PlayButton   mPlayButton = null
  37.     private MediaPlayer   mPlayer = null
  38.  
  39.    //当录音按钮被click时调用此方法,开始或停止录音 
  40.     private void onRecord(boolean start) { 
  41.         if (start) { 
  42.             startRecording(); 
  43.         } else { 
  44.             stopRecording(); 
  45.         } 
  46.     } 
  47.  
  48.    //当播放按钮被click时调用此方法,开始或停止播放 
  49.     private void onPlay(boolean start) { 
  50.         if (start) { 
  51.             startPlaying(); 
  52.         } else { 
  53.             stopPlaying(); 
  54.         } 
  55.     } 
  56.  
  57.     private void startPlaying() { 
  58.         mPlayer = new MediaPlayer(); 
  59.         try { 
  60.     //设置要播放的文件 
  61.             mPlayer.setDataSource(mFileName); 
  62.             mPlayer.prepare(); 
  63.     //播放之 
  64.             mPlayer.start(); 
  65.         } catch (IOException e) { 
  66.             Log.e(LOG_TAG, "prepare() failed"); 
  67.         } 
  68.     } 
  69.  
  70.     //停止播放 
  71.     private void stopPlaying() { 
  72.         mPlayer.release(); 
  73.         mPlayer = null
  74.     } 
  75.  
  76.     private void startRecording() { 
  77.         mRecorder = new MediaRecorder(); 
  78.         //设置音源为Micphone 
  79.         mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
  80.         //设置封装格式 
  81.         mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
  82.         mRecorder.setOutputFile(mFileName); 
  83.         //设置编码格式 
  84.         mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
  85.  
  86.         try { 
  87.             mRecorder.prepare(); 
  88.         } catch (IOException e) { 
  89.             Log.e(LOG_TAG, "prepare() failed"); 
  90.         } 
  91.  
  92.         mRecorder.start(); 
  93.     } 
  94.  
  95.     private void stopRecording() { 
  96.         mRecorder.stop(); 
  97.         mRecorder.release(); 
  98.         mRecorder = null
  99.     } 
  100.  
  101.     //定义录音按钮 
  102.     class RecordButton extends Button { 
  103.         boolean mStartRecording = true
  104.  
  105.         OnClickListener clicker = new OnClickListener() { 
  106.             public void onClick(View v) { 
  107.                 onRecord(mStartRecording); 
  108.                 if (mStartRecording) { 
  109.                     setText("Stop recording"); 
  110.                 } else { 
  111.                     setText("Start recording"); 
  112.                 } 
  113.                 mStartRecording = !mStartRecording; 
  114.             } 
  115.         }; 
  116.  
  117.         public RecordButton(Context ctx) { 
  118.             super(ctx); 
  119.             setText("Start recording"); 
  120.             setOnClickListener(clicker); 
  121.         } 
  122.     } 
  123.  
  124.     //定义播放按钮 
  125.     class PlayButton extends Button { 
  126.         boolean mStartPlaying = true
  127.  
  128.         OnClickListener clicker = new OnClickListener() { 
  129.             public void onClick(View v) { 
  130.                 onPlay(mStartPlaying); 
  131.                 if (mStartPlaying) { 
  132.                     setText("Stop playing"); 
  133.                 } else { 
  134.                     setText("Start playing"); 
  135.                 } 
  136.                 mStartPlaying = !mStartPlaying; 
  137.             } 
  138.         }; 
  139.  
  140.         public PlayButton(Context ctx) { 
  141.             super(ctx); 
  142.             setText("Start playing"); 
  143.             setOnClickListener(clicker); 
  144.         } 
  145.     } 
  146.  
  147.     //构造方法 
  148.     public AudioRecordTest() { 
  149.         mFileName = Environment.getExternalStorageDirectory().getAbsolutePath(); 
  150.         mFileName += "/audiorecordtest.3gp"
  151.     } 
  152.  
  153.     @Override 
  154.     public void onCreate(Bundle icicle) { 
  155.         super.onCreate(icicle); 
  156.         //构造界面 
  157.         LinearLayout ll = new LinearLayout(this); 
  158.         mRecordButton = new RecordButton(this); 
  159.         ll.addView(mRecordButton, 
  160.             new LinearLayout.LayoutParams( 
  161.                 ViewGroup.LayoutParams.WRAP_CONTENT, 
  162.                 ViewGroup.LayoutParams.WRAP_CONTENT, 
  163.                 0)); 
  164.         mPlayButton = new PlayButton(this); 
  165.         ll.addView(mPlayButton, 
  166.             new LinearLayout.LayoutParams( 
  167.                 ViewGroup.LayoutParams.WRAP_CONTENT, 
  168.                 ViewGroup.LayoutParams.WRAP_CONTENT, 
  169.                 0)); 
  170.         setContentView(ll); 
  171.     } 
  172.  
  173.     @Override 
  174.     public void onPause() { 
  175.         super.onPause(); 
  176.         //Activity暂停时释放录音和播放对象 
  177.         if (mRecorder != null) { 
  178.             mRecorder.release(); 
  179.             mRecorder = null
  180.         } 
  181.  
  182.         if (mPlayer != null) { 
  183.             mPlayer.release(); 
  184.             mPlayer = null
  185.         } 
  186.     } 

 

(nkmnkm)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201209/16257.html]
本文出处:CSDN博客 作者:nkmnkm 原文
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容