AudioRecord
来源:互联网 发布:淘宝卖家需要多少钱 编辑:程序博客网 时间:2024/05/18 14:45
AudioRecord简介
1.AudioRecord与MediaRecorder一样用来录制音频的
2.AudioRecord可以对录制的数据进行实时的处理,比如降噪,除杂,或者将音频进行实时传输,比如IP电话,对讲功能等操作。
3.AudioRecord比MediaRecorder更接近底层,录制的音频是PCM格式的,只能用AudioTraker进行播放,或者将PCM数据转换成amr,wav等格式播放。
AudioRecord使用
AudioRecord以pulling方式通过read()方法对缓冲区的数据进行轮询,来实时的获取缓冲区的数据。
下面来看如何使用:
// 读取数据流 返回int,读取到的字节数public int read (byte[] audioData, int offsetInBytes, int sizeInBytes)public int read (float[] audioData, int offsetInFloats, int sizeInFloats, int readMode)public int read (ByteBuffer audioBuffer, int sizeInBytes, int readMode)// 构造方法public AudioRecord (int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes) audioSource:VOICE_CALL,VOICE_COMMUNICATION。。。。 sampleRateInHz 44100,22050,16000 channelConfig CHANNEL_IN_MONO and CHANNEL_IN_STEREO audioFormat ENCODING_PCM_8BIT ENCODING_PCM_16BIT ENCODING_PCM_FLOAT. bufferSizeInBytes 由getMinBufferSize(int, int, int)决定// 获取成功创建AudioRecord 的最小缓冲区的大小public static int getMinBufferSize (int sampleRateInHz, int channelConfig, int audioFormat)
AudioTrack
说了录音,那么播放就得说到AudioTrack,专门用来播放PCM数据.
下面是录制与播放的代码,时间太晚了,还没有测试。
package com.asia.pcm2amr;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import android.annotation.TargetApi;import android.app.Activity;import android.media.AudioFormat;import android.media.AudioManager;import android.media.AudioRecord;import android.media.AudioTrack;import android.media.MediaRecorder;import android.os.Build;import android.os.Bundle;import android.os.Environment;@TargetApi(Build.VERSION_CODES.JELLY_BEAN)public class AudioTest { static String mPath = Environment.getExternalStorageDirectory() .getAbsolutePath() + "/AAA/"; private AudioRecord mAudioRecord; private AudioTrack mAudioTrack; private boolean mIsAudioing = false; private boolean mIsPlaying = false; private int mMinBufferSize; private int mRecordTime = 20; private int mFileCount = 10; private static AudioTest mAudioTest; public static AudioTest getInstance() { if (mAudioTest == null) { mAudioTest = new AudioTest(); } return mAudioTest; } public void createObject(int sampleRateInHz) { int audioSource = MediaRecorder.AudioSource.VOICE_COMMUNICATION; int channelConfig = AudioFormat.CHANNEL_IN_STEREO; int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; mMinBufferSize = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioEncoding); int bufferSizeInBytes = mMinBufferSize * 2; mAudioRecord = new AudioRecord(audioSource, sampleRateInHz, channelConfig, audioEncoding, bufferSizeInBytes); int playBufSize = AudioTrack.getMinBufferSize(sampleRateInHz, channelConfig, audioEncoding); mAudioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, sampleRateInHz, channelConfig, audioEncoding, playBufSize, AudioTrack.MODE_STREAM, mAudioRecord.getAudioSessionId()); } public boolean isInitSucces() { boolean initRecorder = mAudioRecord != null && mAudioRecord.getState() == AudioRecord.STATE_INITIALIZED; boolean initPlayer = mAudioTrack != null && mAudioTrack.getState() == AudioTrack.STATE_INITIALIZED; return initRecorder && initPlayer; } public void startAudio() { mIsAudioing = true; new AudioThread(++mFileCount + ".pcm").start(); } public void stopAudio() { mIsAudioing = false; if (mAudioRecord.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) { mAudioRecord.stop(); } } public void startPlayer() { mIsPlaying = true; new PlayThread().start(); } public void stopPlayer() { mIsPlaying = false; if (mAudioTrack.getPlayState() == AudioTrack.PLAYSTATE_PLAYING) { mAudioTrack.stop(); } } /** * 结束录音与播放 */ public void stopVoice() { stopAudio(); stopPlayer(); mAudioRecord.release(); mAudioRecord = null; mAudioTrack.release(); mAudioTrack = null; } private class PlayThread extends Thread { public void run() { try { android.os.Process .setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); } catch (Exception e) { } try { File file = new File(mPath, 15 + ".pcm"); FileInputStream inputStream = new FileInputStream(file); byte[] audioData = new byte[mMinBufferSize]; mAudioTrack.play(); while (mIsPlaying) { // 数据源 int read = inputStream.read(audioData, 0, mMinBufferSize); mAudioTrack.write(audioData, 0, read); } inputStream.close(); mAudioTrack.stop(); } catch (Exception e) { } } } private class AudioThread extends Thread { String fileName; public AudioThread(String fileName) { this.fileName = fileName; } @Override public void run() { try { android.os.Process .setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); } catch (Exception e) { } try { mAudioRecord.startRecording(); byte[] buffer = new byte[mMinBufferSize]; File file = new File(mPath, "" + fileName); FileOutputStream outputStream = new FileOutputStream(file); while (mIsAudioing) { int read = mAudioRecord.read(buffer, 0, mMinBufferSize); for (int i = 0; i < read; i++) { byte b = buffer[i]; // 写到文件 outputStream.write(buffer, 0, read); } } mAudioRecord.stop(); outputStream.flush(); outputStream.close(); } catch (Exception e) { e.printStackTrace(); } }; }}
0 0
- AudioRecord
- AudioRecord
- AudioRecord||AudioTrack
- AudioRecord MeadiaRecord
- android audiorecord
- AudioRecord实现录音
- 用AudioRecord实现录音
- AudioRecord实现"助听器"
- android audiorecord详解
- android中AudioRecord使用
- AudiFlinger和AudioRecord简述
- Android中AudioRecord使用
- android中AudioRecord使用
- 10.AudioRecord实现“助听器”
- android中AudioRecord使用
- android_Mediaplayer&audiotrack MediaRecord&audiorecord
- AudioRecord 录制音频
- AudioRecord uninitialized Error
- Java SE和Java EE的区别
- 【转】STM32 FSMC的用法--LCD
- https和http的区别!
- iOS单方向禁止UITableView滑动,禁止向上或向下滑动
- python 脚本 自动创建年月日目录
- AudioRecord
- Java 打jar包
- Android 项目eclipse、Android Studio目录结构分析
- HDU-3183-A Magic Lamp
- Android Studio 导入SlidingMenu库方法
- spring MVC环境搭建
- 【C语言】用迭代法计算第n个斐波那契数的值
- 一入贪心深似海 ~ HDU 1009 FatMouse' Trade
- JAVA窗体中使用IO流读取图片!