2016-08-31 76 views
0

我想用AudioTrack類在android中播放音樂曲目,使用立體聲PCM 16位頻道。這裏是我的代碼MusicListFragment.javaAudioTrack播放靜態音樂

import android.media.AudioFormat; 
import android.media.AudioManager; 
import android.media.AudioTrack; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ListView; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStream; 

public class MusicListFragment extends Fragment implements AdapterView.OnItemClickListener { 

    private AudioTrack mAudioTrack; 

    public MusicListFragment() { 

    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.fragment_music_list, container, false); 

     ListView musicListView = (ListView) view.findViewById(R.id.music_list_view); 
     musicListView.setAdapter(new MusicListAdapter(getActivity())); 

     int minBufferSize = AudioTrack.getMinBufferSize(
       22000, 
       AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT); 
     mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 22000 
       , AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize, 
       AudioTrack.MODE_STREAM); 

     musicListView.setOnItemClickListener(this); 

     return view; 
    } 

    @Override 
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
     Music music = (Music) adapterView.getItemAtPosition(i); 
     InputStream inputStream = null; 
     byte[] bytes = new byte[512]; 

     mAudioTrack.play(); 

     try { 
      File file = new File(music.getPath()); 
      inputStream = new FileInputStream(file); 
      int k; 
      while ((k = inputStream.read(bytes)) != -1) { 
       mAudioTrack.write(bytes, 0, k); 
      } 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

適配器工作正常,因爲我測試了它使用的MediaPlayer 。 (如果你願意的話,我也可以提供我的適配器和其他課程,但我懷疑他們是這個問題。)
我的列表視圖顯示了音樂的標題,藝術家和專輯,還存儲了每首音樂的路徑。
我可以很容易地用MediaPlayer播放音樂,但我在使用AudioTrack時出現問題。該代碼使設備播放靜態聲音,就像舊電視沒有信號時一樣! :)
正如你可以在適配器的點擊監聽器中看到的,我是
1.獲取所選音樂。
2.將音樂文件讀入InputStream
3.最後將字節寫入音軌實例。 (我也放了一行:mAudioTrack.play()在try,catch語句後,沒有運氣)
我在這裏做錯了什麼?

回答

1

將壓縮音頻文件的二進制內容播放到AudioTrack,也許?除非您的音樂文件以原始未壓縮格式存儲,否則這將不起作用。 AudioTracks使用PCM format。即使是.wav文件中的標題聽起來也是靜止的,直到您達到原始樣本。

0

感謝@ greeble31答案,我現在明白我的問題,我搜索瞭如何將.mp3和.wav文件解碼爲PCM格式,並且我發現了一些有用的答案herehere,以防萬一需要它。