小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

android語(yǔ)音錄制和壓縮

 mediatv 2016-07-23





關(guān)閉
2012-02-27 09:15 10413人閱讀 評(píng)論(13) 收藏 舉報(bào)
分類:

因?yàn)樯弦黄┛痛a有點(diǎn)太多,就單開(kāi)了,這兩天主要在看Android語(yǔ)音錄制和壓縮轉(zhuǎn)碼相關(guān)知識(shí),前端時(shí)間看見(jiàn)騰訊官方微博宣布,已經(jīng)開(kāi)放出即使聊天軟件正在等待審批,但這個(gè)直接影響電話運(yùn)營(yíng)商,能通過(guò)的可能性應(yīng)該不大,但我對(duì)這方面的技術(shù)很有興趣,所以就試試看。其中涉及到很多聲音方面的處理問(wèn)題,在android中有兩個(gè)類可以錄制語(yǔ)音:AudioRecord和MediaRecorder,MediaRecorder主要是錄制音頻并寫入文件,而AudioRecord主要是錄制音頻流,錄制的音頻流為pcm格式,關(guān)于pcm格式可以自行搜索一下,在傳輸過(guò)程中可以轉(zhuǎn)換為amr格式,但沒(méi)有相關(guān)可以類庫(kù)有點(diǎn)麻煩,另外iphone不支持播放amr格式音頻,如果需要跨兩個(gè)平臺(tái)可以使用AAC,壓縮比也不錯(cuò),音質(zhì)也很好,我還沒(méi)有測(cè)試過(guò),網(wǎng)上評(píng)議而已。編碼方面大家都推薦speex,我看了一下,需要是用System.loadLibrary加載進(jìn)speex提供的類庫(kù)。下面記錄一下寫的一個(gè)邊錄制邊播放的一段代碼吧

  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.             //設(shè)置播放器緩沖區(qū)大小  
  51.             pBufferSize = AudioTrack.getMinBufferSize(frequency, AudioFormat.CHANNEL_CONFIGURATION_MONO,   
  52.                     AudioFormat.ENCODING_PCM_16BIT);  
  53.    
  54.             //獲取播放器對(duì)象  
  55.             player = new AudioTrack(AudioManager.STREAM_MUSIC, frequency,   
  56.                     AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT,  
  57.                     pBufferSize, AudioTrack.MODE_STREAM);  
  58.    
  59.             //設(shè)置錄音緩沖區(qū)大小  
  60.             rBufferSize = AudioRecord.getMinBufferSize(frequency,   
  61.                     AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);  
  62.    
  63.             //獲取錄音機(jī)對(duì)象  
  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.      * 開(kāi)始錄音 
  76.      */  
  77.     public void startRecord(){  
  78.         stopSpeech = false;  
  79.         vspeech = new VoiceSpeech();  
  80.         vspeech.start();  
  81.     }  
  82.    
  83.     /** 
  84.      * 結(jié)束錄音 
  85.      */  
  86.     public void stopRecord() {  
  87.         stopSpeech = true;  
  88.     }  
  89.    
  90.     /** 
  91.      * 開(kāi)始播放錄音 
  92.      */  
  93.     public void startPlay(){  
  94.    
  95.         //設(shè)置播放器音量  
  96.         player.setStereoVolume(0.7f, 0.7f);  
  97.    
  98.         player.play();  
  99.     }  
  100.    
  101.     /** 
  102.      * 結(jié)束播放錄音 
  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: //開(kāi)始說(shuō)話  
  117.                         startPlay();  
  118.                         startRecord();  
  119.    
  120.                         toastMsg("starting record!");  
  121.                         break;  
  122.    
  123.                     case MotionEvent.ACTION_UP: //停止說(shuō)話  
  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

參考知識(shí)庫(kù)

猜你在找
查看評(píng)論
13樓 我想我還有夢(mèng) 2015-04-22 10:45發(fā)表 [回復(fù)]
現(xiàn)在這個(gè)還有人關(guān)注嗎 ,少類庫(kù),跑步起來(lái)。
12樓 z0810 2014-07-14 09:53發(fā)表 [回復(fù)]
最近也在研究這個(gè),求demo,QQ:1467581753 . 感謝。
11樓 shengfakun1234 2014-06-10 21:51發(fā)表 [回復(fù)]
media_jni這個(gè)類庫(kù)可以發(fā)一個(gè)嗎?1002168636@qq.com
10樓 util_c 2014-06-10 21:44發(fā)表 [回復(fù)]
發(fā)個(gè)DEMO給我行嗎?605858069@qq.com
9樓 u011355656 2014-03-11 16:20發(fā)表 [回復(fù)]
求“media_jni”內(nèi)庫(kù)感激不盡??!
8樓 cool_wuli 2014-02-27 21:45發(fā)表 [回復(fù)]
同求demo576660144@qq.com
7樓 zyayy 2014-01-06 15:43發(fā)表 [回復(fù)]
兄弟,android初學(xué)者 最近遇到音頻壓縮的問(wèn)題 能否發(fā)個(gè)demo學(xué)習(xí)下啊 450459217@qq.com
6樓 yuanxiaodon 2013-12-10 16:46發(fā)表 [回復(fù)]
求Demo1269396188@qq.com
5樓 tangshengji 2013-11-18 15:17發(fā)表 [回復(fù)]
朋友,把這個(gè)Demo發(fā)給我唄,謝謝了:
393019384@qq.com
4樓 parrzhang 2013-07-11 22:09發(fā)表 [回復(fù)]
System.loadLibrary("media_jni");
這個(gè)類庫(kù)是在哪里的
3樓 gene 2013-04-18 17:32發(fā)表 [回復(fù)]
朋友你好,你給我一個(gè)demo嘛
genehang@163.com
2樓 devin_sz 2013-02-02 17:47發(fā)表 [回復(fù)]
兄弟,遇到了聲音壓縮的問(wèn)題,能否發(fā)個(gè)demo給我
devin_sz@yeah.net
1樓 buaakuan 2012-03-19 20:55發(fā)表 [回復(fù)]
你好,我是android初學(xué)者,24行的"media_jni"是什么呢,這個(gè)在本地有默認(rèn)的嗎?需要編寫它的代碼嗎?
發(fā)表評(píng)論
  • 用 戶 名:
  • wangwangzq126
  • 評(píng)論內(nèi)容:
  • 插入代碼

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多