android语音录制和压缩

本文介绍了一种在Android平台上实现语音实时录制和播放的方法。利用AudioRecord和AudioTrack两个类,可以实现实时采集麦克风输入的声音信号,并即时播放出来。文章提供了具体的代码示例,包括初始化播放器和录音机对象、设置缓冲区大小、开始和停止录音及播放等操作。

http://blog.youkuaiyun.com/acu/article/details/7296998

这两天主要在看android语音录制和压缩转码相关知识,前端时间看见腾讯官方微博宣布,已经开放出即使聊天软件正在等待审批,但这个直接影响电话运营商,能通过的可能性应该不大,但我对这方面的技术很有兴趣,所以就试试看。其中涉及到很多声音方面的处理问题,在android中有两个类可以录制语音:AudioRecord和MediaRecorder,MediaRecorder主要是录制音频并写入文件,而AudioRecord主要是录制音频流,录制的音频流为pcm格式,关于pcm格式可以自行搜索一下,在传输过程中可以转换为amr格式,但没有相关可以类库有点麻烦,另外iphone不支持播放amr格式音频,如果需要跨两个平台可以使用AAC,压缩比也不错,音质也很好,我还没有测试过,网上评议而已。编码方面大家都推荐speex,我看了一下,需要是用System.loadLibrary加载进speex提供的类库。下面记录一下写的一个边录制边播放的一段代码吧

[java]  view plain copy
  1. package voice.hcent.com;  
  2.    
  3. import java.io.IOException;  
  4.    
  5. import android.app.Activity;  
  6. import android.os.Bundle;  
  7. import android.os.Looper;  
  8. import android.os.Process;  
  9. import android.util.Log;  
  10. import android.view.MotionEvent;  
  11. import android.view.View;  
  12. import android.widget.Button;  
  13. import android.widget.Toast;  
  14.    
  15. import android.media.AudioFormat;  
  16. import android.media.AudioManager;  
  17. import android.media.AudioRecord;  
  18. import android.media.AudioTrack;  
  19. import android.media.MediaRecorder;  
  20.    
  21. public class VoiceHcentActivity extends Activity {  
  22.    
  23.     static {  
  24.         System.loadLibrary("media_jni");  
  25.     }  
  26.    
  27.     public int frequency = 8000;  
  28.     private int rBufferSize, pBufferSize;  
  29.     private Button startSpeech;  
  30.     private AudioRecord recorder;  
  31.     private VoiceSpeech vspeech;  
  32.     private AudioTrack player;  
  33.     private boolean stopSpeech = false;  
  34.    
  35.     /** Called when the activity is first created. */  
  36.     @Override  
  37.     public void onCreate(Bundle savedInstanceState) {  
  38.         super.onCreate(savedInstanceState);  
  39.         setContentView(R.layout.main);  
  40.    
  41.         init();  
  42.    
  43.         test();  
  44.     }  
  45.    
  46.     public void init(){  
  47.         try{  
  48.             startSpeech = (Button)findViewById(R.id.StartSpeech);  
  49.    
  50.             //设置播放器缓冲区大小  
  51.             pBufferSize = AudioTrack.getMinBufferSize(frequency, AudioFormat.CHANNEL_CONFIGURATION_MONO,   
  52.                     AudioFormat.ENCODING_PCM_16BIT);  
  53.    
  54.             //获取播放器对象  
  55.             player = new AudioTrack(AudioManager.STREAM_MUSIC, frequency,   
  56.                     AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT,  
  57.                     pBufferSize, AudioTrack.MODE_STREAM);  
  58.    
  59.             //设置录音缓冲区大小  
  60.             rBufferSize = AudioRecord.getMinBufferSize(frequency,   
  61.                     AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);  
  62.    
  63.             //获取录音机对象  
  64.             recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,   
  65.                     frequency, AudioFormat.CHANNEL_CONFIGURATION_MONO,   
  66.                     AudioFormat.ENCODING_PCM_16BIT, rBufferSize);  
  67.    
  68.         }catch (Exception e) {  
  69.             String msg = "ERROR init: "+e.getStackTrace();  
  70.             VoiceHcentActivity.this.toastMsg(msg);  
  71.         }  
  72.     }  
  73.    
  74.     /** 
  75.      * 开始录音 
  76.      */  
  77.     public void startRecord(){  
  78.         stopSpeech = false;  
  79.         vspeech = new VoiceSpeech();  
  80.         vspeech.start();  
  81.     }  
  82.    
  83.     /** 
  84.      * 结束录音 
  85.      */  
  86.     public void stopRecord() {  
  87.         stopSpeech = true;  
  88.     }  
  89.    
  90.     /** 
  91.      * 开始播放录音 
  92.      */  
  93.     public void startPlay(){  
  94.    
  95.         //设置播放器音量  
  96.         player.setStereoVolume(0.7f, 0.7f);  
  97.    
  98.         player.play();  
  99.     }  
  100.    
  101.     /** 
  102.      * 结束播放录音 
  103.      */  
  104.     public void stopPlay(){  
  105.         player.stop();  
  106.     }  
  107.    
  108.     public void test(){  
  109.    
  110.         startSpeech.setOnTouchListener(new View.OnTouchListener() {  
  111.    
  112.             public boolean onTouch(View arg0, MotionEvent arg1) {  
  113.    
  114.                 switch (arg1.getAction()) {  
  115.    
  116.                     case MotionEvent.ACTION_DOWN: //开始说话  
  117.                         startPlay();  
  118.                         startRecord();  
  119.    
  120.                         toastMsg("starting record!");  
  121.                         break;  
  122.    
  123.                     case MotionEvent.ACTION_UP: //停止说话  
  124.                         Log.i("hcent""111");  
  125.                         stopPlay();  
  126.                         Log.i("hcent""222");  
  127.                         stopRecord();  
  128.                         toastMsg("stoped record!");  
  129.                         break;  
  130.    
  131.                     default:  
  132.                         break;  
  133.                 }  
  134.    
  135.                 return false;  
  136.             }  
  137.         });  
  138.    
  139.     }  
  140.    
  141.     public class VoiceSpeech extends Thread{  
  142.    
  143.         @Override  
  144.         public void run() {  
  145.             super.run();  
  146.             try {  
  147.                 byte[] tempBuffer, readBuffer = new byte[rBufferSize];  
  148.                 int bufResult = 0;  
  149.                 recorder.startRecording();  
  150.                 while(!stopSpeech){  
  151.                     bufResult = recorder.read(readBuffer, 0, rBufferSize);  
  152.                     if(bufResult>0 && bufResult%2==0){  
  153.                         tempBuffer = new byte[bufResult];  
  154.                         System.arraycopy(readBuffer, 0, tempBuffer, 0, rBufferSize);  
  155.                         player.write(tempBuffer, 0, tempBuffer.length);  
  156.                     }  
  157.                     Log.d("hcent""get read:"+bufResult+"___"+readBuffer.length);  
  158.                 }  
  159.                 recorder.stop();  
  160.                 Looper.prepare();  
  161.                 VoiceHcentActivity.this.toastMsg("AudioSpeech have ended!");  
  162.                 Looper.loop();    
  163.             } catch (Exception e) {  
  164.                 String msg = "ERROR AudioRecord: "+e.getStackTrace();  
  165.                 Looper.prepare();  
  166.                 VoiceHcentActivity.this.toastMsg(msg);  
  167.                 Looper.loop();  
  168.             }        
  169.         }  
  170.     }  
  171.     @Override  
  172.     protected void onDestroy(){  
  173.         player.release();  
  174.         recorder.release();  
  175.         super.onDestroy();  
  176.         Process.killProcess(Process.myPid());  
  177.     }  
  178.     public void toastMsg(String msg){  
  179.         Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();  
  180.         Log.e("hcent", msg);  
  181.     }    
  182. }  
参考链接http://www.cnblogs.com/Amandaliu/archive/2013/02/04/2891604.html 在链接内容基础上修改了amr编码格式为aac编码格式 Android提供了两个API用于实现录音功能:android.media.AudioRecord、android.media.MediaRecorder。 网上有很多谈论这两个类的资料。现在大致总结下: 1、AudioRecord 主要是实现边录边播(AudioRecord+AudioTrack)以及对音频的实时处理(如会说话的汤姆猫、语音) 优点:语音的实时处理,可以用代码实现各种音频的封装 缺点:输出是PCM语音数据,如果保存成音频文件,是不能够被播放器播放的,所以必须先写代码实现数据编码以及压缩 示例: 使用AudioRecord类录音,并实现WAV格式封装。录音20s,输出的音频文件大概为3.5M左右(已写测试代码) 2、MediaRecorder 已经集成了录音、编码、压缩等,支持少量的录音音频格式,大概有.aac(API = 16) .amr .3gp 优点:大部分以及集成,直接调用相关接口即可,代码量小 缺点:无法实时处理音频;输出的音频格式不是很多,例如没有输出mp3格式文件 示例: 使用MediaRecorder类录音,输出amr格式文件。录音20s,输出的音频文件大概为33K(已写测试代码) 3、音频格式比较 WAV格式:录音质量高,但是压缩率小,文件大 AAC格式:相对于mp3,AAC格式的音质更佳,文件更小;有损压缩;一般苹果或者Android SDK4.1.2(API 16)及以上版本支持播放 AMR格式:压缩比比较大,但相对其他的压缩格式质量比较差,多用于人声,通话录音 至于常用的mp3格式,使用MediaRecorder没有该视频格式输出。一些人的做法是使用AudioRecord录音,然后编码成wav格式,再转换成mp3格式 再贴上一些测试工程。 功能描述: 1、点击“录音WAV文件”,开始录音。录音完成后,生成文件/sdcard/FinalAudio.wav 2、点击“录音AMR文件”,开始录音。录音完成后,生成文件/sdcard/FinalAudio.amr 3、点击“停止录音”,停止录音,并显示录音输出文件以及该文件大小。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值