标签:cep string copyto com comm 立体声 硬件 art 使用
http://blog.csdn.net/java_android_c/article/details/52619737
Android 音频简介
常见的音频编解码的类型: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 :原始音频,在android平台上由audio record直接录用下来的,未经过编码的。
视频直播,语音通话中一般使用AAC或者OPUS ,如果对声音要进行处理就需要使用PCM原始音频加工处理,然后再进行编码.
Android音频采集(捕获)
android平台上的音频采集一般就三种:1.利用android内置的应用程序 2.使用MediaRecorder进行音频捕获 3.使用AudioRecord进行音频捕获。此3种方式的灵活性逐渐增大,相应的所需要做的工作也逐渐增多。
一、Android 内置的应用程序。
- Intent intent=new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
- startActivityForResult(intent,0);
这种方式灵活度最差,一般就是做着演示下,开发中基本不用这种方案。
二、使用MediaRecorder进行音频的捕获。 这个是 录影视频和音频分别编码后保存成一个文件,单独音频也可以,不过是编码后的数据
这种方案相较于调用系统内置的用用程序,灵活度要高很多,便于开发者在UI界面上布局,而且系统封装的很好,便于使用,唯一的缺点是使用它录下来的音频是经过编码的,没有办法的得到原始的音频。同时MediaRecorder即可用于音频的捕获也可以用于视频的捕获相当的强大。实际开发中没有特殊需求的话,用的是比较多的!
使用步骤:
创建MediaRecorder对象,调用如下方法(Ps:调用顺序顺序对结果的影响是非常的大。)
MediaRecorder recorder=new MediaRecorder();//创建MediaRecoder对象
1.recorder.setAudioSource(MediaRecorder.AudioSource.MIC); //调用setAudioSource方法 (调用的第一个方法)
MediaRecorder.AudioSource.CAMCORDER和MediaRecorder.AudioSource.VOICE_RECOGNITION当设备具有。>=2个麦克风的时候就可以使用它们。
MediaRecorder.AudioSource.VOICE_CALL从电话中录音
2.recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//setOutputFormat方法(调用的第二个方法)
MediaRecorder.OutputFormat.THREE_GPP 输出文件将是一个扩展名为(.3gp)的文件。它可能包含音频和视频。
MediaRecorder.OutputFormat.MPEG_4 输出一个MPEG_4文件,它可能包含音频和视频。
3.recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); //setAudioEncoder方法 (这是调用的第三个方法)
4.recorder.setOutputFile(url); //setOutputFile方法 url是目标文件路径(这是调用的第四个方法)
以上四个方法一次调用完成之后,就可以像MediaPlayer一样控制录制和暂停录制了。
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="#fff"
- android:gravity="center">
-
- <Button
- android:text="开始录音"
- android:id="@+id/StartRecording"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
-
- <Button
- android:text="停止录音"
- android:id="@+id/StopRecording"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
-
- </LinearLayout>
- public class MainActivity extends Activity implements OnClickListener{
-
- Button startRecording, stopRecording;
- MediaRecorder recorder;
- File audioFile;
- boolean isRecoding=false;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(R.layout.main);
- init();
- initListener();
- }
-
-
- public void init(){
- stopRecording = (Button) this.findViewById(R.id.StopRecording);
- startRecording = (Button) this.findViewById(R.id.StartRecording);
-
- recorder = new MediaRecorder();
- recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
- recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
- recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
- }
-
-
- public void initListener(){
- startRecording.setOnClickListener(this);
- stopRecording.setOnClickListener(this);
- }
-
-
- public void recod(){
-
-
-
- File path = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+ "/MediaRecorderTest");
- if(!path.exists())
- {
- path.mkdirs();
- }
-
- try {
- audioFile=new File(path,"test.3gp");
- if(audioFile.exists())
- {
- audioFile.delete();
- }
- audioFile.createNewFile();
-
- } catch (Exception e) {
- throw new RuntimeException("Couldn‘t create recording audio file", e);
- }
-
- recorder.setOutputFile(audioFile.getAbsolutePath());
-
- try {
- recorder.prepare();
- } catch (IllegalStateException e) {
- throw new RuntimeException("IllegalStateException on MediaRecorder.prepare", e);
- } catch (IOException e) {
- throw new RuntimeException("IOException on MediaRecorder.prepare", e);
- }
- isRecoding=true;
- recorder.start();
- }
-
-
- public void onClick(View v) {
-
- switch (v.getId())
- {
-
- case R.id.StartRecording:
- {
- Toast.makeText(MainActivity.this,"开始录音",Toast.LENGTH_SHORT).show();
- recod();
- break;
- }
-
-
- case R.id.StopRecording:
- {
- if(isRecoding)
- {
- Toast.makeText(MainActivity.this,"停止录音",Toast.LENGTH_SHORT).show();
- recorder.stop();
- recorder.release();
- }
- break;
- }
-
- default:
- break;
- }
- }
-
- }
- MediaRecoder的其他API方法:
- setMaxDuration(int);
- setMaxFileSize(long)
- setAudioChannels(int)
- setAudioSamplingRate(int)
- setAudioEncodingBitRate在(int)
三、使用AudioRecord 进行音频捕获。——从某个输入,直接捕获音频数据:PCM格式
这种方法是3种之中最为灵活的,能让开发者最大限度的处理采集的音频,同时它捕获到的音频是原始音频PCM格式的!像做变声处理的需要就必须要用它收集音频。在实际开发中,它也是最常用来采集音频的手段。也是本文介绍的重点。
- int audioSource=MediaRecorder.AudioSource.MIC;
- int sampleRateInHz=11025 ;
- int channelConfig=AudioFormat.CHANNEL_CONFIGURATION_MONO;
- int audioFormat=AudioFormat.ENCODING_PCM_16BIT;
- 指定缓冲区大小。调用AudioRecord类的getMinBufferSize方法可以获得。
- AudioRecord record=new AudioRecord(audioSource,sampleRateInHz,channelConfig,audioFormat,bufferSizeInBytes);
布局xml文件和MediaRecorder Demo中一样,2个按钮而已!就不贴了,下面贴出AudioRecord的Demo的源代码.
- public class MainActivity extends Activity implements OnClickListener {
- Button startRecordingButton, stopRecordingButton;
- File recordingFile;
- boolean isRecording = false;
- AudioRecord audioRecord=null;
- File parent=null;
- int bufferSize=0;
- int sampleRateInHz = 11025;
- int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
- int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
- String TAG="AudioRecord";
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(R.layout.main);
- init();
- initListener();
- }
-
-
- public void init(){
- startRecordingButton = (Button)findViewById(R.id.StartRecordingButton);
- stopRecordingButton = (Button)findViewById(R.id.StopRecordingButton);
-
- bufferSize = AudioRecord.getMinBufferSize(sampleRateInHz,channelConfig, audioFormat);
- audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,sampleRateInHz,channelConfig, audioFormat, bufferSize);
-
- parent = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+ "/AudiioRecordTest");
- if(!parent.exists())
- parent.mkdirs();
- }
-
-
- public void initListener(){
- startRecordingButton.setOnClickListener(this);
- stopRecordingButton.setOnClickListener(this);
- }
-
- public void onClick(View v) {
- switch (v.getId()) {
-
- case R.id.StartRecordingButton:
- {
- record();
- break;
- }
-
-
- case R.id.StopRecordingButton:
- {
- stopRecording();
- break;
- }
- }
-
- }
-
-
- public void record() {
- isRecording = true;
- new Thread(new Runnable() {
- @Override
- public void run() {
- isRecording = true;
-
- recordingFile = new File(parent,"audiotest.pcm");
- if(recordingFile.exists()){
- recordingFile.delete();
- }
-
- try {
- recordingFile.createNewFile();
- }
- catch (IOException e) {
- e.printStackTrace();
- Log.e(TAG,"创建储存音频文件出错");
- }
-
-
- try {
- DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(recordingFile)));
- byte[] buffer = new byte[bufferSize];
- audioRecord.startRecording();
- int r = 0;
- while (isRecording) {
- int bufferReadResult = audioRecord.read(buffer,0,bufferSize);
- for (int i = 0; i < bufferReadResult; i++)
- {
- dos.write(buffer[i]);
- }
- r++;
- }
- audioRecord.stop();
- dos.close();
- } catch (Throwable t) {
- Log.e(TAG, "Recording Failed");
- }
-
- }
- }).start();
-
- }
-
-
- public void stopRecording()
- {
- isRecording = false;
- }
-
-
- }
注意这几个Demo都要添加以下权限:
- <uses-permission android:name="android.permission.RECORD_AUDIO"/>
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
四、备注:
MediaRecorder采集音频的Demo源码
AudioRecord采集音频的Demo源码
原始音频PCM播放器 使用方法 : 文件->导入->裸数据 然后根据你录音时的配置填写相应参数 就可以播放了!
Android 音频采集——MediaRecord(编码后录影文件) 、AudioRecord(PCM原始数据)
标签:cep string copyto com comm 立体声 硬件 art 使用
原文地址:http://www.cnblogs.com/stnlcd/p/7151413.html