前言

  本章内容为Android开发者指南的 Framework Topics/Multimedia and Camera/Audio Capture章节,版本为Android 4.0 r1,翻译来自:"呆呆大虾",欢迎访问他的微博:"http://weibo.com/popapa",再次感谢"呆呆大虾" !期待你一起参与翻译Android的相关资料,联系我over140@gmail.com。

声明

  欢迎转载,但请保留文章原始出处:)

    博客园:http://www.cnblogs.com/

    Android中文翻译组: http://androidbox.sinaapp.com/

音频捕获

译者署名: 呆呆大虾

译者微博:http://weibo.com/popapa

版本:Android 4.0 r1

原文

http://developer.android.com/guide/topics/media/audio-capture.html

在本文中

进行音捕获

代码示例

关键类

MediaRecorder

相关例程

JetBoy

参阅

Android支持的媒体格式

数据存储

MediaPlayer

Android的多媒体框架包含了对多种通用媒体的捕获和编码支持,因此可以很容易地在程序中加入音频信息。在设备的硬件支持时,可以利用MediaRecorder API录制音频。

本文展示了如何编写程序捕获来自话筒的音频、保存并回放此音频。

注意: 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() 来释放资源。

示例:录音及其回放

下例中的类演示了如何设置、开始、停止音频捕获,以及播放录制的音频文件。

/*

* 本程序需要读取外部存储的权限

* 如果输出文件写入外部存储,那就还需要写入权限来录音。

* 这些权限必须在AndroidManifest.xml文件中设置,类似如下

* <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 class AudioRecordTest extends Activity

{

private static final String LOG_TAG = "AudioRecordTest";

private static String 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 = new MediaPlayer();

try {

mPlayer.setDataSource(mFileName);

mPlayer.prepare();

mPlayer.start();

} catch (IOException e) {

Log.e(LOG_TAG, "prepare() 失败");

}

}

private void stopPlaying() {

mPlayer.release();

mPlayer = null;

}

private void startRecording() {

mRecorder = new MediaRecorder();

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()失败");

}

mRecorder.start();

}

private void stopRecording() {

mRecorder.stop();

mRecorder.release();

mRecorder = null;

}

class RecordButton extends Button {

boolean mStartRecording = true;

OnClickListener clicker = new OnClickListener() {

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 PlayButton extends Button {

boolean mStartPlaying = true;

OnClickListener clicker = new OnClickListener() {

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 = new LinearLayout(this);

mRecordButton = new RecordButton(this);

ll.addView(mRecordButton,

new LinearLayout.LayoutParams(

ViewGroup.LayoutParams.WRAP_CONTENT,

ViewGroup.LayoutParams.WRAP_CONTENT,

0));

mPlayButton = new PlayButton(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;

}

}

}

更多相关文章

  1. Android中打开网络设置界面
  2. 设置android编码格式与包的引入格式于源码一致
  3. Android(安卓)加密/解密音频文件(AES)
  4. Android使用WebView加载网页及数据__2020.01.03
  5. 在代码中实现按下Home键的效果
  6. android coredump 调试
  7. android中设置控件边框以及如何保留上或下边框
  8. 使用IntelliJ IDEA(androidstudio前身)开发android移动应用前的基
  9. [Andriod] android中singleTask的home键的问题

随机推荐

  1. 又一处疑难杂症的折腾笔记:Android内嵌htm
  2. Google rushing out Android(安卓)4 'Ice
  3. android软件开发:横竖屏
  4. Android(安卓)webview Not allowed to lo
  5. Ubuntu 无线热点 Set Up A Wireless Hots
  6. Android(安卓)Ant打包及其环境变量配置
  7. android之sharedpreference读取参数
  8. Android(安卓)Notification 填充 自定义
  9. android的service如何接收触摸事件。
  10. Android中GridView来显示图片