九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
MediaPlayer和AudioTrack播放Audio的區(qū)別與聯(lián)系

MediaPlayer和AudioTrack播放Audio的區(qū)別與聯(lián)系

分類: android framework Android應(yīng)用 Android Audio系統(tǒng) 1975人閱讀 評論(1) 收藏 舉報(bào)
播放聲音可以用MediaPlayer和AudioTrack,兩者都提供了java API供應(yīng)用開發(fā)者使用。雖然都可以播放聲音,但兩者還是有很大的區(qū)別的。
其中最大的區(qū)別是MediaPlayer可以播放多種格式的聲音文件,例如MP3,AAC,WAV,OGG,MIDI等。MediaPlayer會(huì)在framework層創(chuàng)建對應(yīng)的音頻解碼器。
而AudioTrack只能播放已經(jīng)解碼的PCM流,如果是文件的話只支持wav格式的音頻文件,因?yàn)閣av格式的音頻文件大部分都是PCM流。AudioTrack不創(chuàng)建解碼器,所以只能播放不需要解碼的wav文件。

當(dāng)然兩者之間還是有緊密的聯(lián)系的,MediaPlayer在framework層還是會(huì)創(chuàng)建AudioTrack,把解碼后的PCM數(shù)流傳遞給AudioTrack,AudioTrack再傳遞給AudioFlinger進(jìn)行混音,然后才傳遞給硬件播放。
所以是MediaPlayer包含了AudioTRack。
通過查看API可以知道,MediaPlayer提供了5個(gè)setDataSource方法,分為三類,一類是傳遞播放文件的字符串路徑作為參數(shù),例如直接取sd卡里mp3文件的路徑,一類是傳遞播放文件的FileDescriptor文件描述符作為播放的id,例例如從db中查詢的音頻文件的id,就可以直接賦給MediaPlayer進(jìn)行播放。還有一類是Uri類型的資源文件,用于播放content uri文件。

下面是一個(gè)用MediaPlayer播放音樂的示例,音樂文件是從數(shù)據(jù)庫中取出的。
  1. if (mMediaPlayer == null) {  
  2.     mMediaPlayer = new MediaPlayer(); // 創(chuàng)建MediaPlayer對象   
  3. }  
  4.   
  5. mMediaPlayer.reset();  
  6. String dataSource = getDataByPosition(mCursor, mPlayPosition);  
  7. mMediaPlayer.setDataSource(dataSource); // 設(shè)置需要播放的數(shù)據(jù)源   
  8. mMediaPlayer.prepare(); // 準(zhǔn)備播放,如果是流媒體需要調(diào)用prepareAsync進(jìn)行異步準(zhǔn)備   
  9. if (Common.PLAY_MODE_SINGLE_LOOP == mPlayMode) {  
  10.     mMediaPlayer.setLooping(true); // 單曲循環(huán)   
  11. else {  
  12.     mMediaPlayer.setLooping(false); // 不循環(huán)播放   
  13. }  
  14. mMediaPlayer.start(); // 開始播放,如果是播放流媒體,需要等到流媒體準(zhǔn)備完成才能播放(在prepare的callback函數(shù)中調(diào)用start進(jìn)行播放)   
  15.   
  16. // 根據(jù)位置來獲取歌曲位置   
  17. public String getDataByPosition(Cursor c, int position) {  
  18.     c.moveToPosition(position);  
  19.     int dataColumn = c.getColumnIndex(MediaStore.Audio.Media.DATA);  
  20.     String data = c.getString(dataColumn);  
  21.     return data;  
  22. }  
AudioTrack播放聲音時(shí)不能直接把wav文件傳遞給AudioTrack進(jìn)行播放,必須傳遞buffer,通過write函數(shù)把需要播放的緩沖區(qū)buffer傳遞給AudioTrack,然后才能播放。

AudioTrack使用的例子參考下面:
此示例轉(zhuǎn)自:http://samyou.iteye.com/blog/1125872
  1. public class AndroidTest extends Activity implements View.OnClickListener,SurfaceHolder.Callback  
  2. {  
  3.     private SurfaceHolder surfaceHolder = null;  
  4.     private SurfaceView surfaceView = null;  
  5.     private AudioTrack audioTrack = null;  
  6.     private Thread writePCMThread = null;  
  7.     private File audioFile = null;  
  8.     private FileInputStream fileInputStream = null;  
  9.     private byte buffer[] = new byte[16*10000];  
  10.   
  11.     // The Handler that gets information back from the other threads   
  12.     private final Handler msgHandler = new Handler()  
  13.     {  
  14.         public void handleMessage(Message msg)  
  15.         {  
  16.             switch (msg.what)  
  17.             {  
  18.             default:  
  19.                 break;  
  20.             }  
  21.         }  
  22.     };  
  23.   
  24.   
  25.     /** Called when the activity is first created. */  
  26.     @Override  
  27.     public void onCreate(Bundle savedInstanceState) {  
  28.         super.onCreate(savedInstanceState);  
  29.         setContentView(R.layout.main);  
  30.         surfaceView = (SurfaceView) findViewById(R.id.surface);  
  31.         SurfaceHolder surfaceHolder = surfaceView.getHolder();  
  32.         surfaceHolder.addCallback(this);  
  33.         surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  34.         findViewById(R.id.button1).setOnClickListener(this);  
  35.         findViewById(R.id.button2).setOnClickListener(this);  
  36.     }  
  37.   
  38.     public void finish() {  
  39.         super.finish();  
  40.         System.out.println("finish");  
  41.         try {  
  42.             writePCMThread.interrupt();  
  43.         } catch (Exception e) {  
  44.         }  
  45.         try {  
  46.             fileInputStream.close();  
  47.         } catch (Exception e) {  
  48.         }  
  49.         try {  
  50.             audioTrack.stop();  
  51.             audioTrack.release();  
  52.         } catch (Exception e) {  
  53.         }  
  54.     }  
  55.   
  56.   
  57.   
  58.     protected void onResume()  
  59.     {  
  60.         super.onResume();  
  61.         System.out.println("back on!!!!!!!!!!!");  
  62.         initAudioTrack();  
  63.         audioFile = new File(Environment.getExternalStorageDirectory(),"test.wav");  
  64.         System.out.println(audioFile.length());  
  65.         try {  
  66.             fileInputStream = new FileInputStream(audioFile);  
  67.             fileInputStream.skip(0x2c);  
  68.         } catch (Exception e) {  
  69.         }  
  70.   
  71.         writePCMThread = new Thread(new Runnable(){  
  72.             public void run() {  
  73.                 try  
  74.                 {  
  75.                     while(fileInputStream.read(buffer)>=0)  
  76.                     {  
  77.                         System.out.println("write pcm data");  
  78.                         audioTrack.write(buffer, 0, buffer.length);  
  79.                     }  
  80.                 }  
  81.                 catch (Exception e) {  
  82.                     e.printStackTrace();  
  83.                 }  
  84.             }  
  85.         });  
  86.   
  87.     }  
  88.   
  89.     private void initAudioTrack()  
  90.     {  
  91.         int minBufferSize = AudioTrack.getMinBufferSize(0xac44, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);  
  92.         System.out.println("minBufferSize = "+minBufferSize);  
  93.         audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 0xac44,  
  94.         AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize*2,AudioTrack.MODE_STREAM);  
  95.         audioTrack.setStereoVolume(1.0f, 1.0f);// 設(shè)置當(dāng)前音量大小   
  96.         System.out.println("initAudioTrack over");  
  97.         audioTrack.play();  
  98.     }  
  99.   
  100.     public void onClick(View v)  
  101.     {  
  102.         switch (v.getId()) {  
  103.         case R.id.button1:  
  104.             writePCMThread.start();  
  105.             break;  
  106.         case R.id.button2:  
  107.             break;  
  108.         default:  
  109.             break;  
  110.     }  
  111.   
  112.   
  113.     }  
  114.   
  115.     public void surfaceCreated(SurfaceHolder holder) {  
  116.         System.out.println("surfaceCreated()");  
  117.         this.surfaceHolder = holder;  
  118.     }  
  119.   
  120.     public void surfaceDestroyed(SurfaceHolder holder) {  
  121.     }  
  122.   
  123.     public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  124.         int height) {  
  125.         this.surfaceHolder = holder;  
  126.     }  
  127.   
  128.     public void onActivityResult(int requestCode, int resultCode, Intent data) {  
  129.     }  
  130.   
  131. }  

注:PCM和WAV

以下摘自:http://www.erji.net/read.php?tid=227570

簡單來說,pcm是一種數(shù)據(jù)編碼格式,CD唱盤上刻錄的就直接用pcm格式編碼的數(shù)據(jù)文件;
wav是一種聲音文件格式,wav里面包含的聲音數(shù)據(jù)可以是采用pcm格式編碼的聲音數(shù)據(jù),也可以是采用其它格式編碼的聲音數(shù)據(jù),但目前一般采用pcm編碼的聲音數(shù)據(jù)
兩者區(qū)別就是這些

pcm是一個(gè)通信上的概念,脈沖編碼調(diào)制。wav是媒體概念,體現(xiàn)的是封裝。wav文件可以封裝pcm編碼信息,也可以封裝其他編碼格式,例如mp3等。


本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
android全格式多媒體播放器(二:opencore媒體系統(tǒng)解析)
[譯]Android音頻: 如何使用AudioTrack播放一個(gè)WAV格式文件?
如何壓縮wav文件體積
[WPF 學(xué)習(xí)] 15.播放百度合成的語音
【圖】完美解決全新君越無法播放DTS等高品質(zhì)音樂方案
【圖】DVD Audio光盤制作方法圖文詳解
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服