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; 

        } 

    } 

}

 

 

posted @ 2011-11-14 13:13  农民伯伯  阅读(3401)  评论(1编辑  收藏  举报