AudioTrack播放静音

时间:2016-08-31 19:00:20

标签: android audio audiotrack

我想在Android中使用AudioTrack类播放音乐曲目,使用带有PCM 16位通道的立体声。这是 MusicListFragment.java

的代码
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()尝试后,抓住声明,没有运气)
我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

将压缩音频文件的二进制内容播放到AudioTrack,或许?除非您的音乐文件以原始的未压缩格式存储,否则这将无效。 AudioTracks使用PCM format。在您到达原始样本之前,甚至.wav文件上的标题听起来都是静态的。

答案 1 :(得分:0)

感谢@ greeble31的回答,我现在理解了我的问题,我搜索了如何将.mp3和.wav文件解码为PCM格式,我找到了一些有用的答案herehere,以防万一任何人都需要它。