前言

  本章内容为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;

}

}

}

转载于:https://www.cnblogs.com/over140/archive/2011/11/14/2248237.html

Android开发指南(32) —— Multimedia and Camera - Audio Capture相关推荐

  1. Android开发指南中文版

    Android开发指南中文版 -应用程序框架   iefreer@hotmail.com 2009/9/10 个人主页: http://blog.csdn.net/iefreer 本文是对Androi ...

  2. iphone android 开发指南 http://mobile.tutsplus.com

    非常好的教程 iphone& android 开发指南 http://mobile.tutsplus.com/category/tutorials/iphone/ http://mobile. ...

  3. Android开发指南 1──应用程序基础

    登录 |  注册 译言精选 订阅 社区 译言译事 翻译答问 译言帮助 文库 原文库 译文库 全部项目 空间 控制台 个人主页 发布 发布原文 发布翻译 发布编译 发布原创 首页 商业 科技 文化 体坛 ...

  4. Android开发指南

    发现一篇很不错的文章,分享给大家,虽然有些地方翻译的有点拗口:但不影响阅读 转载自:http://www.oschina.net/translate/40-developer-tips-for-and ...

  5. Android开发指南(42) —— Adding Custom Suggestions

    前言 本章内容为 Android开发者指南的 Framework Topics/Search/Adding Custom Suggestions章节,译为"添加自定义建议项",版本 ...

  6. 云炬Android开发笔记 3-2字体图标库集成与封装

    1.项目:android-iconify点此链接到Github 这是一个字体图标库,用字体来代替很多图片. Android开发经常将很多本地图标放在drawable和mipmap文件夹下,这样有一些坏 ...

  7. Android开发指南(41) —— Searchable Configuration

    前言 本章内容为 Android开发者指南的 Framework Topics/Search/Searchable Configuration章节,译为"搜索配置文件",版本为An ...

  8. Android开发指南!Android事件分发机制收藏这一篇就够了,2年以上经验必看

    前言 现在的终端开发已经开始进入稳定期,在这个阶段大厂压力很大小厂更会收到挤压,人们使用的App越来越固定,即使是大厂,几年前平台级应用发个Push就能引流几十万,现在这些的作用也越来越小,特别到了今 ...

  9. android开发指南!阿里P7级别面试经验总结,知乎上转疯了!

    前言 马上快到金三银四都春招阶段了,在这本就是跳槽.找工作的年后黄金时间,大多数求职者都早早做好年后求职的准备,其中不乏有年前早早辞了工作准备年后跳槽的有经验的职场老人们,也有一批即将毕业的应届毕业生 ...

  10. Android开发指南!Android面试题集2021版,深度好文

    前言 想要成为一名优秀的Android开发,你需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~. 学算法真的很痛苦,虽然大数据现在很火,但找到适合自己定位的职业也未尝不是一种合理选择. ...

最新文章

  1. 08 Java程序员面试宝典视频课程之内部类
  2. 2.内核异常处理流程
  3. LintCode 563. 背包问题 V(DP)
  4. 【Java】聊天机器人
  5. Redisson 布隆过滤器
  6. C语言自底向上分析方法,算法6-12:自底向上的赫夫曼编码 (C语言代码)
  7. MySQL5.7--项目数据库不同出现的问题
  8. c/c++教程 - 1.10 结构体 使用typedef定义struct结构体 结构体数组 结构体指针 结构体嵌套 结构体做函数参数 结构体const
  9. MFC学习——下检测计算机是否联网
  10. 无法在此iPhone激活面容ID怎么办?
  11. 英特尔为RRP物联网平台项目预留1亿美元开发资金
  12. 社交网络的发展及趋势
  13. 04-小键盘字母u输出为4的问题
  14. Unity Mathf【Deg Rad】- 关于数学运算中的度与弧度
  15. 学术论文摘要写作技巧:
  16. pip换源-pip国内源
  17. 随机森林之信贷风险模型特征工程
  18. IDC机房有哪些设备?如何组建中小企业IDC机房?
  19. 测试版本大全 (转)
  20. 【渝粤教育】电大中专电子商务网站建设与维护 (15)作业 题库

热门文章

  1. 五个 macOS12 Monterey 常用实用技巧
  2. TOONTRACK Electronic Edge EZX(Toontrack打击乐扩展包)
  3. 支持macOS Big Sur 11系统 mac系统维护优化OnyX 3.9.1中文版
  4. macOS Big Sur无法完成安装 Big Sur为什么安装不了?
  5. 使用iToolab UnlockGo for Mac如何绕过屏幕时间密码
  6. macOS Big Sur无法安装 Big Sur为什么安装不了?
  7. RubyGems 镜像 -- 淘宝网
  8. 禁止用户用手机浏览时上下滑动
  9. Mac OS X Tips
  10. 《几何与代数导引》习题1.34.2