返回介绍

音频捕获

发布于 2025-03-09 16:39:55 字数 7508 浏览 0 评论 0 收藏 0

音频捕获

译者微博: 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;

}

}

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文