`
mmdev
  • 浏览: 12917508 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Android录制声音(一)Recorder

 
阅读更多

再看Android SDK的录制声音的例子时看见文章比较短就翻译了一下,请大家提出宝贵意见:

Android SDK\docs\guide\topics\media\audio-capture.html 的翻译

音频录制

Android多媒体框架支持对常见音频的录制和编码,如果硬件支持,可以使用 MediaRecorder APIs 来非常方便的编写音频程序。

通过学习这篇文档,你可编写应用程序通过设备的麦克来录制声音,并且保持和播放声音。

注意:Android模拟器不支持录制声音的功能,必须有实际设备。

运行录制声音程序

音频的录制要比音频或者视频的播放要复杂,但是相对也比较简单,课遵循以下步骤:

1.创建MediaRecorder实例: android.media.MediaRecorder

2.设置音频来源:MediaRecorder.setAudioSource();

3.设置输出音频格式:MediaRecorder.setOutputFormat();

4.设置输出文件名:MediaRecorder.setOutputFile();

5.设置输出编码格式:MediaRecorder.setAudioEncorder();

6.在开始录制之前调用MediaRecorder.prepare();

7.开始录制声音,调用:MediaRecorder.start();

8.停止录制声音,调用:MediaRecorder.stop();

9.当录制完声音的时候,调用MediaRecorder.release()来释放占用的相关资源

例子:录制音频并播放

下面的例子展示了怎样录制并播放声音

这个APP需要添加两个权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

/*
* The application needs to have the permission to write to external storage
* if the output file is written to the external storage, and also the
* permission to record audio. These permissions must be set in the
* application's AndroidManifest.xml file, with something like:
*
* <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
* <uses-permission android:name="android.permission.RECORD_AUDIO" />
*
*/

package com.android.audiorecordtest;

import android.app.Activity;
import android.widget.LinearLayout;
import android.os.Bundle;
import android.os.Environment;
import android.view.ViewGroup;
import android.widget.Button;
import android.view.View;
import android.view.View.OnClickListener;
import android.content.Context;
import android.util.Log;
import android.media.MediaRecorder;
import android.media.MediaPlayer;

import java.io.IOException;


public classAudioRecordTestextendsActivity
{
private staticfinalString LOG_TAG="AudioRecordTest";
private staticString mFileName=null;

private RecordButton mRecordButton=null;
private MediaRecorder mRecorder=null;

private PlayButton mPlayButton=null;
private MediaPlayer mPlayer=null;

private void onRecord(boolean start){
if (start){
startRecording
();
} else{
stopRecording
();
}
}

private void onPlay(boolean start){
if (start){
startPlaying
();
} else{
stopPlaying
();
}
}

private void startPlaying(){
mPlayer
= newMediaPlayer();
try {
mPlayer
.setDataSource(mFileName);
mPlayer
.prepare();
mPlayer
.start();
} catch(IOException e){
Log.e(LOG_TAG,"prepare() failed");
}
}

private void stopPlaying(){
mPlayer
.release();
mPlayer
= null;
}

private void startRecording(){
mRecorder
= newMediaRecorder();
mRecorder
.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder
.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder
.setOutputFile(mFileName);
mRecorder
.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

try {
mRecorder
.prepare();
} catch(IOException e){
Log.e(LOG_TAG,"prepare() failed");
}

mRecorder
.start();
}

private void stopRecording(){
mRecorder
.stop();
mRecorder
.release();
mRecorder
= null;
}

class RecordButtonextendsButton{
boolean mStartRecording=true;

OnClickListener clicker=newOnClickListener(){
public void onClick(View v){
onRecord
(mStartRecording);
if (mStartRecording){
setText
("Stop recording");
} else{
setText
("Start recording");
}
mStartRecording
=!mStartRecording;
}
};

public RecordButton(Context ctx){
super(ctx);
setText
("Start recording");
setOnClickListener
(clicker);
}
}

class PlayButtonextendsButton{
boolean mStartPlaying = true;

OnClickListener clicker=newOnClickListener(){
public void onClick(View v){
onPlay
(mStartPlaying);
if (mStartPlaying){
setText
("Stop playing");
} else{
setText
("Start playing");
}
mStartPlaying
=!mStartPlaying;
}
};

public PlayButton(Context ctx){
super(ctx);
setText
("Start playing");
setOnClickListener
(clicker);
}
}

public AudioRecordTest(){
mFileName
= Environment.getExternalStorageDirectory().getAbsolutePath();
mFileName
+= "/audiorecordtest.3gp";
}

@Override
public void onCreate(Bundle icicle){
super.onCreate(icicle);

LinearLayout ll = newLinearLayout(this);
mRecordButton
= new RecordButton(this);
ll
.addView(mRecordButton,
new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT,
0));
mPlayButton
= newPlayButton(this);
ll
.addView(mPlayButton,
new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT,
0));
setContentView
(ll);
}

@Override
public void onPause(){
super.onPause();
if (mRecorder!=null){
mRecorder
.release();
mRecorder
= null;
}

if (mPlayer!=null){
mPlayer
.release();
mPlayer
= null;
}
}
}

这是SDK的中带的代码,我已经在自己的手机上成功运行没有任何错误!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics