Android⾳频采集——MediaRecord(编码后录影⽂件)、
AudioRecord。。。
⾳频简介
常见的⾳频编解码的类型:AAC  OPUS MP3  AMR  Ogg  PCM
AAC: ⾼级⾳频编码对应  .m4a(audio/m4a)或者.3pg(audio/3gpp)⽂件  HEAAC:⾼级AAC,使⽤的⽐较多。
OPUS:有损声⾳编码的格式,由互联⽹⼯程任务组(IETF)进来开发,适⽤于⽹络上的实时声⾳传输,如:语⾳通话
MP3: 使⽤的最⼴泛的⾳频编解码器对应 .mp3(audio/mp3) 各种⾳乐⽹站⼀般⽤这种。
AMR:⾃适应多速率⾳频编解码器,⼀般⽤于语⾳呼叫程序。
Ogg:开发的⽆专利的⾳频编解码器,其质量可与商业的和⼿专利保护的MP3以及AAC编解码相媲美。
PCM :原始⾳频,在平台上由audio record直接录⽤下来的,未经过编码的。
视频直播,语⾳通话中⼀般使⽤AAC或者OPUS ,如果对声⾳要进⾏处理就需要使⽤PCM原始⾳频加⼯处理,然后再进⾏编码.
Android⾳频采集(捕获)
android平台上的⾳频采集⼀般就三种:1.利⽤android内置的应⽤程序  2.使⽤MediaRecorder进⾏⾳频捕获  3.使⽤AudioRecord进⾏⾳频捕获。此3种⽅式的灵活性逐渐增⼤,相应的所需要做的⼯作也逐渐增多。
⼀、Android 内置的应⽤程序。
[java]
1. Intent intent=new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
2. startActivityForResult(intent,0); //通过startActivityForResult获取⾳频录制的结果的路径
这种⽅式灵活度最差,⼀般就是做着演⽰下,开发中基本不⽤这种⽅案。
⼆、使⽤MediaRecorder进⾏⾳频的捕获。这个是录影视频和⾳频分别编码后保存成⼀个⽂件,单独⾳频也可以,不过是编码后的数据
这种⽅案相较于调⽤系统内置的⽤⽤程序,灵活度要⾼很多,便于开发者在UI界⾯上布局,⽽且系统封装的很好,便于使⽤,唯⼀的缺点是使⽤它录下来的⾳频是经过编码的,没有办法的得到原始的⾳频。同时MediaRecorder即可⽤于⾳频的捕获也可以⽤于视频的捕获相当的强⼤。实际开发中没有特殊需求的话,⽤的是⽐较多的!
使⽤步骤:
创建MediaRecorder对象,调⽤如下⽅法(Ps:调⽤顺序顺序对结果的影响是⾮常的⼤。)
MediaRecorder recorder=new MediaRecorder();//创建MediaRecoder对象
MediaRecorder.AudioSource.CAMCORDER和MediaRecorder.AudioSource.VOICE_RECOGNITION当设备具有。>=2个麦克风的时候就可以使⽤它们。
MediaRecorder.AudioSource.VOICE_CALL从电话中录⾳
MediaRecorder.OutputFormat.THREE_GPP 输出⽂件将是⼀个扩展名为(.3gp)的⽂件。它可能包含⾳频和视频。
MediaRecorder.OutputFormat.MPEG_4 输出⼀个MPEG_4⽂件,它可能包含⾳频和视频。
以上四个⽅法⼀次调⽤完成之后,就可以像MediaPlayer⼀样控制录制和暂停录制了。
[html]
1. <?xml version="1.0" encoding="utf-8"?>
2. <LinearLayout xmlns:android="schemas.android/apk/res/android"
3.    android:orientation="vertical"
4.    android:layout_width="fill_parent"
安卓intent用法
5.    android:layout_height="fill_parent"
6.    android:background="#fff"
7.    android:gravity="center">
8.
9.    <Button
10.        android:text="开始录⾳"
11.        android:id="@+id/StartRecording"
12.        android:layout_width="wrap_content"
13.        android:layout_height="wrap_content"/>
14.
15.    <Button
16.        android:text="停⽌录⾳"
17.        android:id="@+id/StopRecording"
18.        android:layout_width="wrap_content"
19.        android:layout_height="wrap_content"/>
20.
21. </LinearLayout>
[java]
1. public class MainActivity extends Activity implements OnClickListener{
2.
3.    Button startRecording, stopRecording;//开始录⾳、停⽌录⾳、释放资源
4.    MediaRecorder recorder;
5.    File audioFile; //录⾳保存的⽂件
6.    boolean isRecoding=false;// true 表⽰正在录⾳
7.
8.    @Override
9.    public void onCreate(Bundle savedInstanceState) {
10.        Create(savedInstanceState);
11.        requestWindowFeature(Window.FEATURE_NO_TITLE);
12.        setContentView(R.layout.main);
13.        init();
14.        initListener();
15.    }
16.
17.    //初始化
18.    public void init(){
19.        stopRecording = (Button) this.findViewById(R.id.StopRecording);
20.        startRecording = (Button) this.findViewById(R.id.StartRecording);
21.
22.        recorder = new MediaRecorder();
23.        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置播放源麦克风
24.        recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); //设置输⼊格式 3gp
25.        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //设置编码 AMR
26.    }
27.
28.    //设置
29.    public void initListener(){
30.        startRecording.setOnClickListener(this);
31.        stopRecording.setOnClickListener(this);
32.    }
33.
34.    //录⾳
35.    public void recod(){
36.
37.            //此处还应该对⼿机进⾏下判断,判断下⼿机⾥⾯有没有内存卡
38.            //保存在SD卡下MediaRecorderTest⽂件夹中
39.            File path = new ExternalStorageDirectory().getAbsolutePath()+ "/MediaRecorderTest");
40.            if(!ists())
41.            {
42.                path.mkdirs();
43.            }
44.
45.            try {
46.                audioFile=new File(path,"test.3gp");
47.                ists())
48.                {
49.                    audioFile.delete();
50.                }
51.                ateNewFile();//创建⽂件
52.
53.                } catch (Exception e) {
54.                throw new RuntimeException("Couldn't create recording audio file", e);
55.            }
56.
57.            recorder.AbsolutePath()); //设置输出⽂件
58.
59.            try {
60.                recorder.prepare();
61.            } catch (IllegalStateException e) {
62.                throw new RuntimeException("IllegalStateException on MediaRecorder.prepare", e);
63.            } catch (IOException e) {
64.                throw new RuntimeException("IOException on MediaRecorder.prepare", e);
65.            }
66.            isRecoding=true;
67.            recorder.start();
68.    }
69.
70.
71.    public void onClick(View v) {
72.
73.        switch (v.getId())
74.        {
75.            //开始录⾳
76.            case R.id.StartRecording:
77.            {
78.                Toast.makeText(MainActivity.this,"开始录⾳",Toast.LENGTH_SHORT).show();
79.                recod();
80.                break;
81.            }
82.
83.            //停⽌录⾳
84.            case R.id.StopRecording:
85.            {
86.                if(isRecoding)
87.                {
88.                  Toast.makeText(MainActivity.this,"停⽌录⾳",Toast.LENGTH_SHORT).show();
89.                  recorder.stop();
90.                  lease();
91.                }
92.                break;
93.            }
94.
95.            default:
96.              break;
97.        }
98.    }
99.
100. }
[java]
1. MediaRecoder的其他API⽅法:
2. //设置录制允许的最⼤时长单位是毫秒。必须在setOutFormat⽅法之后,prepare⽅法之前使⽤。
3. setMaxDuration(int);
4. //设置⽂件录制的存放⽂件的最⼤值,单位是字节。必须在setOutFormat⽅法之后,prepare⽅法之前使⽤。
5. setMaxFileSize(long)
6. //允许录制的⾳频通道数,通常是⼀个通道(单声道,2个通道双声道,⽴体声)。必须在调⽤prepare⽅法之前调⽤。
7. setAudioChannels(int)
8. //允许制定捕获和编码⾳频的采样率。硬件和使⽤的编码器将会决定合适的采样率。必须在调⽤prepare⽅法之前调⽤。
9. setAudioSamplingRate(int)
10. //允许指定当压缩⾳频时编码器所使⽤的每秒位数(位/秒)。必须在调⽤prepare⽅法之前调⽤。
11. setAudioEncodingBitRate在(int)
三、使⽤AudioRecord 进⾏⾳频捕获。——从某个输⼊,直接捕获⾳频数据:PCM格式
这种⽅法是3种之中最为灵活的,能让开发者最⼤限度的处理采集的⾳频,同时它捕获到的⾳频是原始⾳频PCM格式的!像做变声处理的需要就必须要⽤它收集⾳频。在实际开发中,它也是最常⽤来采集⾳频的⼿段。也是本⽂介绍的重点。
[java]
1. //指定⾳频源这个和MediaRecorder是相同的
2. int audioSource=MediaRecorder.AudioSource.MIC;
3. //指定采样率(MediaRecoder 的采样率通常是8000Hz CD的通常是44100Hz 不同的Android⼿机硬件将能够以不同的采样率进⾏采
样。其中11025是⼀个常见的采样率)
4. int sampleRateInHz=11025 ;
5. //指定捕获⾳频的通道数⽬。在AudioFormat类中指定⽤于此的常量
6. int channelConfig=AudioFormat.CHANNEL_CONFIGURATION_MONO;
7. //指定⾳频量化位数 ,在AudioFormaat类中指定了以下各种可能的常量。通常我们选择ENCODING_PCM_16BIT和
ENCODING_PCM_8BIT PCM代表的是脉冲编码调制,它实际上是原始⾳频样本。
8. //因此可以设置每个样本的分辨率为16位或者8位,16位将占⽤更多的空间和处理能⼒,表⽰的⾳频也更加接近真实。
9. int audioFormat=AudioFormat.ENCODING_PCM_16BIT;
10. 指定缓冲区⼤⼩。调⽤AudioRecord类的getMinBufferSize⽅法可以获得。
11. //创建AudioRecord。AudioRecord类实际上不会保存捕获的⾳频,因此需要⼿动创建⽂件并保存下载。
12. AudioRecord record=new AudioRecord(audioSource,sampleRateInHz,channelConfig,audioFormat,bufferSizeInBytes);
布局xml⽂件和MediaRecorder Demo中⼀样,2个按钮⽽已!就不贴了,下⾯贴出AudioRecord的Demo的源代码.
[java]
1. public class MainActivity extends Activity implements OnClickListener {
2.    Button startRecordingButton, stopRecordingButton;//开始录⾳、停⽌录⾳
3.    File recordingFile;//储存AudioRecord录下来的⽂件
4.    boolean isRecording = false; //true表⽰正在录⾳
5.    AudioRecord audioRecord=null;
6.    File parent=null;//⽂件⽬录
7.    int bufferSize=0;//最⼩缓冲区⼤⼩
8.    int sampleRateInHz = 11025;//采样率
9.    int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO; //单声道
10.    int audioFormat = AudioFormat.ENCODING_PCM_16BIT; //量化位数
11.    String TAG="AudioRecord";
12.
13.    @Override
14.    public void onCreate(Bundle savedInstanceState) {
15.        Create(savedInstanceState);
16.        requestWindowFeature(Window.FEATURE_NO_TITLE);
17.        setContentView(R.layout.main);
18.        init();
19.        initListener();
20.    }
21.
22.    //初始化
23.    public void init(){
24.        startRecordingButton = (Button)findViewById(R.id.StartRecordingButton);
25.        stopRecordingButton = (Button)findViewById(R.id.StopRecordingButton);
26.
27.        bufferSize = MinBufferSize(sampleRateInHz,channelConfig, audioFormat);//计算最⼩缓冲区
28.        audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,sampleRateInHz,channelConfig, audioFormat, bufferSize);//
创建AudioRecorder对象
29.
30.        parent = new ExternalStorageDirectory().getAbsolutePath()+ "/AudiioRecordTest");
31.        if(!ists())
32.            parent.mkdirs();//创建⽂件夹
33.    }
34.
35.    //初始化
36.    public void initListener(){
37.        startRecordingButton.setOnClickListener(this);
38.        stopRecordingButton.setOnClickListener(this);
39.    }
40.
41.    public void onClick(View v) {
42.        switch (v.getId()) {
43.        //开始录⾳
44.        case R.id.StartRecordingButton:
45.        {
46.            record();
47.            break;
48.        }
49.
50.        //停⽌录⾳
51.        case R.id.StopRecordingButton:
52.        {
53.            stopRecording();
54.            break;
55.        }
56.    }
57.
58.  }
59.
60.    //开始录⾳
61.    public void record() {
62.        isRecording = true;
63.        new Thread(new Runnable() {
64.            @Override
65.            public void run() {
66.                isRecording = true;
67.
68.                recordingFile = new File(parent,"audiotest.pcm");
69.                ists()){
70.                    recordingFile.delete();
71.                }
72.
73.                try {
74.                      ateNewFile();
75.                    }
76.                catch (IOException e) {
77.                      e.printStackTrace();
78.                      Log.e(TAG,"创建储存⾳频⽂件出错");
79.                    }
80.
81.
82.                try {
83.                DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(recordingFile)));
84.                byte[] buffer = new byte[bufferSize];
85.                audioRecord.startRecording();//开始录⾳
86.                    int r = 0;
87.                    while (isRecording) {
88.                        int bufferReadResult = ad(buffer,0,bufferSize);
89.                        for (int i = 0; i < bufferReadResult; i++)
90.                        {
91.                            dos.write(buffer[i]);
92.                        }
93.                        r++;
94.                    }
95.                    audioRecord.stop();//停⽌录⾳

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。