Android MediaRecorder 手机 录音的几种方法Word文件下载.docx
《Android MediaRecorder 手机 录音的几种方法Word文件下载.docx》由会员分享,可在线阅读,更多相关《Android MediaRecorder 手机 录音的几种方法Word文件下载.docx(73页珍藏版)》请在冰点文库上搜索。
*设置录音之后,保存音频文件的位置
mediaRecorder.setOutputFile("
file:
///sdcard/myvido/a.3pg"
);
*调用start开始录音之前,一定要调用prepare方法。
try{
mediaRecorder.prepare();
mediaRecorder.start();
catch(IllegalStateExceptione){
e.printStackTrace();
catch(IOExceptione){
/***
*此外,还有和MediaRecorder有关的几个参数与方法,我们一起来看一下:
*sampleRateInHz:
音频的采样频率,每秒钟能够采样的次数,采样率越高,音质越高。
*给出的实例是44100、22050、11025但不限于这几个参数。
例如要采集低质量的音频就可以使用4000、8000等低采样率
*
*channelConfig:
声道设置:
android支持双声道立体声和单声道。
MONO单声道,STEREO立体声
*recorder.stop();
停止录音
*recorder.reset();
重置录音,会重置到setAudioSource这一步
*recorder.release();
解除对录音资源的占用
}
android中AudioRecord采集音频的参数说明
在android中采集音频的api是android.media.AudioRecord类
其中构造器的几个参数就是标准的声音采集参数
以下是参数的含义解释
publicAudioRecord(intaudioSource,intsampleRateInHz,intchannelConfig,intaudioFormat,intbufferSizeInBytes)
Since:
APILevel3
Classconstructor.
Parameters
audioSource
therecordingsource.SeeMediaRecorder.AudioSourceforrecordingsourcedefinitions.
音频源:
指的是从哪里采集音频。
这里我们当然是从麦克风采集音频,所以此参数的值为MIC
sampleRateInHz
thesamplerateexpressedinHertz.Examplesofratesare(butnotlimitedto)44100,22050and11025.
采样率:
给出的实例是44100、22050、11025但不限于这几个参数。
例如要采集低质量的音频就可以使用4000、8000等低采样率。
channelConfig
describestheconfigurationoftheaudiochannels.SeeCHANNEL_IN_MONOandCHANNEL_IN_STEREO
audioFormat
theformatinwhichtheaudiodataisrepresented.SeeENCODING_PCM_16BITandENCODING_PCM_8BIT
编码制式和采样大小:
采集来的数据当然使用PCM编码(脉冲代码调制编码,即PCM编码。
PCM通过抽样、量化、编码三个步骤将连续变化的模拟信号转换为数字编码。
)android支持的采样大小16bit或者8bit。
当然采样大小越大,那么信息量越多,音质也越高,现在主流的采样大小都是16bit,在低质量的语音传输的时候8bit足够了。
bufferSizeInBytes
thetotalsize(inbytes)ofthebufferwhereaudiodataiswrittentoduringtherecording.Newaudiodatacanbereadfromthisbufferinsmallerchunksthanthissize.SeegetMinBufferSize(int,int,int)todeterminetheminimumrequiredbuffersizeforthesuccessfulcreationofanAudioRecordinstance.UsingvaluessmallerthangetMinBufferSize()willresultinaninitializationfailure.
采集数据需要的缓冲区的大小,如果不知道最小需要的大小可以在getMinBufferSize()查看。
采集到的数据保存在一个byteBuffer中,可以使用流将其读出。
亦可保存成为文件的形式
Android使用AudioRecord录音相关和音频文件的封装
分类:
Android流媒体学习
在Android中录音可以用MediaRecord录音,操作比较简单。
但是不够专业,就是不能对音频进行处理。
如果要进行音频的实时的处理或者音频的一些封装
就可以用AudioRecord来进行录音了。
这里给出一段代码。
实现了AudioRecord的录音和WAV格式音频的封装。
用AudioTrack和AudioTrack类可以进行边录边播,可以参考:
我们这里的代码没有播放。
但是有封装和详解,如下:
[java]viewplaincopy
1packagecom.ppmeet;
2
3importjava.io.File;
4importjava.io.FileInputStream;
5importjava.io.FileNotFoundException;
6importjava.io.FileOutputStream;
7importjava.io.IOException;
8importandroid.app.Activity;
9importandroid.graphics.PixelFormat;
10importandroid.media.AudioFormat;
11importandroid.media.AudioRecord;
12importandroid.media.MediaRecorder;
13importandroid.os.Bundle;
14importandroid.view.View;
15importandroid.view.View.OnClickListener;
16importandroid.view.Window;
17importandroid.view.WindowManager;
18importandroid.widget.Button;
19
20/**
21*classname:
TestAudioRecord<
BR>
22*classdescription:
用AudioRecord来进行录音<
23*PS:
<
24*
25*@version1.002011/09/21
26*@authorCODYY)peijiangping
27*/
28publicclassTestAudioRecordextendsActivity{
29//音频获取源
30privateintaudioSource=MediaRecorder.AudioSource.MIC;
31//设置音频采样率,44100是目前的标准,但是某些设备仍然支持22050,16000,11025
32privatestaticintsampleRateInHz=44100;
33//设置音频的录制的声道CHANNEL_IN_STEREO为双声道,CHANNEL_CONFIGURATION_MONO为单声道
34privatestaticintchannelConfig=AudioFormat.CHANNEL_IN_STEREO;
35//音频数据格式:
PCM16位每个样本。
保证设备支持。
PCM8位每个样本。
不一定能得到设备支持。
36privatestaticintaudioFormat=AudioFormat.ENCODING_PCM_16BIT;
37//缓冲区字节大小
38privateintbufferSizeInBytes=0;
39privateButtonStart;
40privateButtonStop;
41privateAudioRecordaudioRecord;
42privatebooleanisRecord=false;
//设置正在录制的状态
43//AudioName裸音频数据文件
44privatestaticfinalStringAudioName="
/sdcard/love.raw"
;
45//NewAudioName可播放的音频文件
46privatestaticfinalStringNewAudioName="
/sdcard/new.wav"
47
48publicvoidonCreate(BundlesavedInstanceState){
49super.onCreate(savedInstanceState);
50getWindow().setFormat(PixelFormat.TRANSLUCENT);
//让界面横屏
51requestWindowFeature(Window.FEATURE_NO_TITLE);
//去掉界面标题
52getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
53WindowManager.LayoutParams.FLAG_FULLSCREEN);
54//重新设置界面大小
55setContentView(R.layout.main);
56init();
57}
58
59privatevoidinit(){
60Start=(Button)this.findViewById(R.id.start);
61Stop=(Button)this.findViewById(R.id.stop);
62Start.setOnClickListener(newTestAudioListener());
63Stop.setOnClickListener(newTestAudioListener());
64creatAudioRecord();
65}
66
67privatevoidcreatAudioRecord(){
68//获得缓冲区字节大小
69bufferSizeInBytes=AudioRecord.getMinBufferSize(sampleRateInHz,
70channelConfig,audioFormat);
71//创建AudioRecord对象
72audioRecord=newAudioRecord(audioSource,sampleRateInHz,
73channelConfig,audioFormat,bufferSizeInBytes);
74}
75
76classTestAudioListenerimplementsOnClickListener{
77
78@Override
79publicvoidonClick(Viewv){
80if(v==Start){
81startRecord();
82}
83if(v==Stop){
84stopRecord();
85}
86
87}
88
89}
90
91privatevoidstartRecord(){
92audioRecord.startRecording();
93//让录制状态为true
94isRecord=true;
95//开启音频文件写入线程
96newThread(newAudioRecordThread()).start();
97}
98
99privatevoidstopRecord(){
100close();
101}
102
103privatevoidclose(){
104if(audioRecord!
=null){
105System.out.println("
stopRecord"
106isRecord=false;
//停止文件写入
107audioRecord.stop();
108audioRecord.release();
//释放资源
109audioRecord=null;
110}
111}
112
113classAudioRecordThreadimplementsRunnable{
114@Override
115publicvoidrun(){
116writeDateTOFile();
//往文件中写入裸数据
117copyWaveFile(AudioName,NewAudioName);
//给裸数据加上头文件
118}
119}
120
121/**
122*这里将数据写入文件,但是并不能播放,因为AudioRecord获得的音频是原始的裸音频,
123*如果需要播放就必须加入一些格式或者编码的头信息。
但是这样的好处就是你可以对音频的裸数据进行处理,比如你要做一个爱说话的TOM
124*猫在这里就进行音频的处理,然后重新封装所以说这样得到的音频比较容易做一些音频的处理。
125*/
126privatevoidwriteDateTOFile(){
127//new一个byte数组用来存一些字节数据,大小为缓冲区大小
128byte[]audiodata=newbyte[bufferSizeInBytes];
129FileOutputStreamfos=null;
130intreadsize=0;
131try{
132Filefile=newFile(AudioName);
133if(file.exists()){
134file.delete();
135}
136fos=newFileOutputStream(file);
//建立一个可存取字节的文件
137}catch(Exceptione){
138e.printStackTrace();
139}
140while(isRecord==true){
141readsize=audioRecord.read(audiodata,0,bufferSizeInBytes);
142if(AudioRecord.ERROR_INVALID_OPERATION!
=readsize){
143try{
144fos.write(audiodata);
145}catch(IOExceptione){
146e.printStackTrace();
147}
148}
149}
150try{
151fos.close();
//关闭写入流
152}catch(IOExceptione){
153e.printStackTrace();
154}
155}
156
157//这里得到可播放的音频文件
158privatevoidcopyWaveFile(StringinFilename,StringoutFilename){
159FileInputStreamin=null;
160FileOutputStreamout=null;
161longtotalAudioLen=0;
162longtotalDataLen=totalAudioLen+36;
163longlongSampleRate=sampleRateInHz;
164intchannels=2;
165longbyteRate=16*sampleRateInHz*channels/8;
166byte[]data=newbyte[bufferSizeInBytes];
167try{
168in=newFileInputStream(inFilename);
169out=newFileOutputStream(outFilename);
170totalAudioLen=in.getChannel().size();
171totalDataLen=totalAudioLen+36;
172WriteWaveFileHeader(out,totalAudioLen,totalDataLen,
173longSampleRate,channels,byteRate);
174while(in.read(data)!
=-1){
175out.write(data);
176}
177in.close();
178out.close();
179}catch(FileNotFoundExceptione){
180e.printStackTrace();
181}catch(IOExceptione){
182e.printStackTrace();
183}
184}
185
186/**
187*这里提供一个头信息。
插入这些信息就可以得到可以播放的文件。
188*为我为啥插入这44个字节,这个还真没深入研究,不过你随便打开一个wav
189*音频的文件,可以发现前面的头文件可以说基本一样哦。
每种格式的文件都有
190*自己特有的头文件。
191*/
192privatevoidWriteWaveFileHeader(FileOutputStreamout,longtotalAudioLen,
193longtotalDataLen,longlongSampleRate,intchannels,longbyteRate)
194throwsIOException{
195byt