Android开发指南(32) —— Multimedia and Camera - Audio Capture
前言
本章内容为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相关推荐
- Android开发指南中文版
Android开发指南中文版 -应用程序框架 iefreer@hotmail.com 2009/9/10 个人主页: http://blog.csdn.net/iefreer 本文是对Androi ...
- iphone android 开发指南 http://mobile.tutsplus.com
非常好的教程 iphone& android 开发指南 http://mobile.tutsplus.com/category/tutorials/iphone/ http://mobile. ...
- Android开发指南 1──应用程序基础
登录 | 注册 译言精选 订阅 社区 译言译事 翻译答问 译言帮助 文库 原文库 译文库 全部项目 空间 控制台 个人主页 发布 发布原文 发布翻译 发布编译 发布原创 首页 商业 科技 文化 体坛 ...
- Android开发指南
发现一篇很不错的文章,分享给大家,虽然有些地方翻译的有点拗口:但不影响阅读 转载自:http://www.oschina.net/translate/40-developer-tips-for-and ...
- Android开发指南(42) —— Adding Custom Suggestions
前言 本章内容为 Android开发者指南的 Framework Topics/Search/Adding Custom Suggestions章节,译为"添加自定义建议项",版本 ...
- 云炬Android开发笔记 3-2字体图标库集成与封装
1.项目:android-iconify点此链接到Github 这是一个字体图标库,用字体来代替很多图片. Android开发经常将很多本地图标放在drawable和mipmap文件夹下,这样有一些坏 ...
- Android开发指南(41) —— Searchable Configuration
前言 本章内容为 Android开发者指南的 Framework Topics/Search/Searchable Configuration章节,译为"搜索配置文件",版本为An ...
- Android开发指南!Android事件分发机制收藏这一篇就够了,2年以上经验必看
前言 现在的终端开发已经开始进入稳定期,在这个阶段大厂压力很大小厂更会收到挤压,人们使用的App越来越固定,即使是大厂,几年前平台级应用发个Push就能引流几十万,现在这些的作用也越来越小,特别到了今 ...
- android开发指南!阿里P7级别面试经验总结,知乎上转疯了!
前言 马上快到金三银四都春招阶段了,在这本就是跳槽.找工作的年后黄金时间,大多数求职者都早早做好年后求职的准备,其中不乏有年前早早辞了工作准备年后跳槽的有经验的职场老人们,也有一批即将毕业的应届毕业生 ...
- Android开发指南!Android面试题集2021版,深度好文
前言 想要成为一名优秀的Android开发,你需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~. 学算法真的很痛苦,虽然大数据现在很火,但找到适合自己定位的职业也未尝不是一种合理选择. ...
最新文章
- 08 Java程序员面试宝典视频课程之内部类
- 2.内核异常处理流程
- LintCode 563. 背包问题 V(DP)
- 【Java】聊天机器人
- Redisson 布隆过滤器
- C语言自底向上分析方法,算法6-12:自底向上的赫夫曼编码 (C语言代码)
- MySQL5.7--项目数据库不同出现的问题
- c/c++教程 - 1.10 结构体 使用typedef定义struct结构体 结构体数组 结构体指针 结构体嵌套 结构体做函数参数 结构体const
- MFC学习——下检测计算机是否联网
- 无法在此iPhone激活面容ID怎么办?
- 英特尔为RRP物联网平台项目预留1亿美元开发资金
- 社交网络的发展及趋势
- 04-小键盘字母u输出为4的问题
- Unity Mathf【Deg Rad】- 关于数学运算中的度与弧度
- 学术论文摘要写作技巧:
- pip换源-pip国内源
- 随机森林之信贷风险模型特征工程
- IDC机房有哪些设备?如何组建中小企业IDC机房?
- 测试版本大全 (转)
- 【渝粤教育】电大中专电子商务网站建设与维护 (15)作业 题库
热门文章
- 五个 macOS12 Monterey 常用实用技巧
- TOONTRACK Electronic Edge EZX(Toontrack打击乐扩展包)
- 支持macOS Big Sur 11系统 mac系统维护优化OnyX 3.9.1中文版
- macOS Big Sur无法完成安装 Big Sur为什么安装不了?
- 使用iToolab UnlockGo for Mac如何绕过屏幕时间密码
- macOS Big Sur无法安装 Big Sur为什么安装不了?
- RubyGems 镜像 -- 淘宝网
- 禁止用户用手机浏览时上下滑动
- Mac OS X Tips
- 《几何与代数导引》习题1.34.2