分享

android语音录制和压缩

 mediatv 2016-07-23





关闭
2012-02-27 09:15 10413人阅读 评论(13) 收藏 举报
分类:

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

  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. }  


4
0

我的同类文章

参考知识库

猜你在找
查看评论
13楼 我想我还有梦 2015-04-22 10:45发表 [回复]
现在这个还有人关注吗 ,少类库,跑步起来。
12楼 z0810 2014-07-14 09:53发表 [回复]
最近也在研究这个,求demo,QQ:1467581753 . 感谢。
11楼 shengfakun1234 2014-06-10 21:51发表 [回复]
media_jni这个类库可以发一个吗?1002168636@qq.com
10楼 util_c 2014-06-10 21:44发表 [回复]
发个DEMO给我行吗?605858069@qq.com
9楼 u011355656 2014-03-11 16:20发表 [回复]
求“media_jni”内库感激不尽!!
8楼 cool_wuli 2014-02-27 21:45发表 [回复]
同求demo576660144@qq.com
7楼 zyayy 2014-01-06 15:43发表 [回复]
兄弟,android初学者 最近遇到音频压缩的问题 能否发个demo学习下啊 450459217@qq.com
6楼 yuanxiaodon 2013-12-10 16:46发表 [回复]
求Demo1269396188@qq.com
5楼 tangshengji 2013-11-18 15:17发表 [回复]
朋友,把这个Demo发给我呗,谢谢了:
393019384@qq.com
4楼 parrzhang 2013-07-11 22:09发表 [回复]
System.loadLibrary("media_jni");
这个类库是在哪里的
3楼 gene 2013-04-18 17:32发表 [回复]
朋友你好,你给我一个demo嘛
genehang@163.com
2楼 devin_sz 2013-02-02 17:47发表 [回复]
兄弟,遇到了声音压缩的问题,能否发个demo给我
devin_sz@yeah.net
1楼 buaakuan 2012-03-19 20:55发表 [回复]
你好,我是android初学者,24行的"media_jni"是什么呢,这个在本地有默认的吗?需要编写它的代码吗?
发表评论
  • 用 户 名:
  • wangwangzq126
  • 评论内容:
  • 插入代码

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多