歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android 通過AudioTrack播放CAF音頻

Android 通過AudioTrack播放CAF音頻

日期:2017/3/1 10:20:05   编辑:Linux編程

我們知道iPhone錄制的音頻都是caf格式,Android的Mediaplayer不支持這個格式的播放..那麼怎麼辦? 我們使用AudioTrack來播放!!代碼如下:

  1. import android.app.Activity;
  2. import android.os.Bundle;
  3. import android.view.View;
  4. import android.widget.Button;
  5. import android.widget.TextView;
  6. import android.media.MediaPlayer;
  7. import android.media.AudioManager;
  8. import android.media.AudioTrack;
  9. import android.media.AudioFormat;
  10. public class LRChannel extends Activity {
  11. private Button lButton;
  12. private Button rButton;
  13. private TextView myTextView;
  14. private MediaPlayer mMediaPlayer01 = null;
  15. private AudioTrack aAudioTrack01 = null;
  16. private String strFilePath = "/sdcard/test.caf";
  17. private float midVol = 0;
  18. /** Called when the activity is first created. */
  19. @Override
  20. public void onCreate(Bundle savedInstanceState) {
  21. super.onCreate(savedInstanceState);
  22. setContentView(R.layout.main);
  23. lButton = (Button) findViewById(R.id.ButtonL);
  24. rButton = (Button) findViewById(R.id.ButtonR);
  25. myTextView = (TextView) findViewById(R.id.myTextView);
  26. // left button response
  27. lButton.setOnClickListener(new Button.OnClickListener()
  28. {
  29. @Override
  30. public void onClick(View arg0)
  31. {
  32. playSound(strFilePath, 0);
  33. }
  34. });
  35. // right button response
  36. rButton.setOnClickListener(new Button.OnClickListener()
  37. {
  38. @Override
  39. public void onClick(View arg0)
  40. {
  41. playSound(strFilePath, 1);
  42. }
  43. });
  44. }
  45. // iChannel = 0 means left channel test, iChannel = 1 means right channel test.
  46. private void playSound(String strPath, int iChannel)
  47. {
  48. // If now is playing...
  49. if ( aAudioTrack01 != null )
  50. {
  51. aAudioTrack01.release();
  52. aAudioTrack01 = null;
  53. }
  54. // Get the AudioTrack minimum buffer size
  55. int iMinBufSize = AudioTrack.getMinBufferSize(44100,
  56. AudioFormat.CHANNEL_CONFIGURATION_STEREO,
  57. AudioFormat.ENCODING_PCM_16BIT);
  58. if ( iMinBufSize == AudioTrack.ERROR_BAD_VALUE || iMinBufSize == AudioTrack.ERROR )
  59. {
  60. return;
  61. }
  62. // Constructor a AudioTrack object
  63. try
  64. {
  65. aAudioTrack01 = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,
  66. AudioFormat.CHANNEL_CONFIGURATION_STEREO,
  67. AudioFormat.ENCODING_PCM_16BIT,
  68. iMinBufSize,
  69. AudioTrack.MODE_STREAM);
  70. }
  71. catch (IllegalArgumentException iae)
  72. {
  73. myTextView.setText("new AudioTrack Exceeption:" + iae.toString());
  74. iae.printStackTrace();
  75. }
  76. // Write data to buffer
  77. byte data[] = new byte[iMinBufSize];
  78. aAudioTrack01.write(data, 0, data.length);
  79. aAudioTrack01.write(data, 0, data.length);
  80. float lValue = 0;
  81. float rValue = 0;
  82. if ( iChannel == 0 )
  83. {
  84. lValue = 1.0f;
  85. rValue = 0.0f;
  86. }
  87. else if ( iChannel == 1 )
  88. {
  89. lValue = 0.0f;
  90. rValue = 1.0f;
  91. }
  92. aAudioTrack01.play();
  93. if ( aAudioTrack01.setStereoVolume(lValue, rValue) == AudioTrack.SUCCESS )
  94. {
  95. myTextView.setText("setStereoVolume successfully!");
  96. }
  97. aAudioTrack01.stop();
  98. if ( aAudioTrack01.setStereoVolume(midVol, midVol) == AudioTrack.SUCCESS )
  99. {
  100. myTextView.setText("Restore setStereoVolume successfully!");
  101. }
  102. aAudioTrack01.release();
  103. aAudioTrack01 = null;
  104. }
  105. @Override
  106. protected void onDestroy() {
  107. super.onDestroy();
  108. // TODO Auto-generated method stub
  109. if ( aAudioTrack01 != null ) {
  110. aAudioTrack01.setStereoVolume(midVol, midVol);
  111. aAudioTrack01.release();
  112. aAudioTrack01 = null;
  113. }
  114. }
  115. }

更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11

Copyright © Linux教程網 All Rights Reserved