2016-08-31 80 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,以防万一需要它。