Android音频捕获(录音)
来源:互联网 发布:模拟炒股软件 知乎 编辑:程序博客网 时间:2024/04/30 00:14
Android多媒体框架支持捕获和编码多种常见的音频格式,所以您可以轻松地将音频集成到您的应用程序。您可以使用麦克风和MediaRecorder组件API录制音频。
本文档会教您如何通过麦克风录制音频和回放音频
注意:Android模拟器没有捕获音频的能力,但实际的设备可能会提供这些功能,调试时尽量使用真机调试。
第一步,准备开始录音
音频捕获(录音)是相对于音视频播放更加复杂的一个过程,但是实现起来还是很简单的。
我们需要按照下边的步骤实现:
1.在使用音频捕获时,需要我们在清单文件(AndroidManifest.xml)中加入两个权限
外部存储可写权限,因为我们录制的音频文件可能要存储在外部存储器中。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
允许捕获音频权限,这是音频捕获的必要权限。
<uses-permission android:name="android.permission.RECORD_AUDIO" />
2.创建一个android.media.MediaRecorder实例。
3.使用MediaRecorder.setAudioSource设置音频源()。你可能会用到MediaRecorder.AudioSource.MIC(麦克风设备)。
4.使用MediaRecorder.setOutputFormat()设置输出文件格式。
5.使用MediaRecorder.setOutputFile()设置输出文件名称。
6.使用MediaRecorder.setAudioEncoder()设置音频编码器。
7.调用MediaRecorder实例的prepare()函数进入准备阶段。
8.调用MediaRecorder实例的start()函数开始捕获(录音)
9.调用MediaRecorder实例的stop()函数停止捕获(录音)
10.当您停止或退出录音功能时调用MediaRecorder实例的release()函数释放MediaRecorder实例资源,此函数一定要在不使用时主动调用,否则会出现内存或者其他异常
下边为示例源码
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() failed"); } } 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() failed"); } 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; } }}本文翻译自谷歌官方Android开发文档
https://developer.android.com/intl/zh-cn/guide/topics/media/audio-capture.html#audiocapture
- Android音频捕获(录音)
- Android音频捕获(录音)
- Android之音频录音
- Android 音频 OpenSL ES 录音
- Android 音频 录音与播放
- Android开发之录音MediaRecorder、播放音频(MediaPlayer、SoundPool)
- 音频处理(录音一)
- 音频处理(录音二)
- Android中的录音与音频合成
- Android音频操作:录音和播放
- Android 音频 OpenSL ES 录音 采集
- Android音频开发之AudioRecord录音实现
- Android 音频 Framework层 音频输入 录音 Java API
- JMF捕获技术(音频)
- Media播放(播放音频,录音等)
- 音频压缩工具——Speex的使用(Android&iOS语音录音技术预演)
- 音频压缩工具——Speex的使用(Android&iOS语音录音技术预演)
- Android学习笔记(二)---Mediaplayer、关于视频,音频,录像,录音
- wordcount运行各类问题解答
- 大学时数据结构课上写的排序算法
- Android事件分发详解(三)——ViewGroup的dispatchTouchEvent()源码学习
- 拓扑排序
- 关于C语言中的未初始化变量的值
- Android音频捕获(录音)
- 小知识点
- 自己动手丰衣足食之纯CSS画的基本图形(矩形、圆形、三角形、多边形、爱心、八卦等)
- 019Adapter初解
- Android事件分发详解(二)——View的事件分发
- ios safe dictionary simple implement
- JSP跳转
- 开发环境应用检测脚本
- [解决]error MSB8031: Building an MFC project for a non-Unicode character set is deprecated.