2016-08-31 12 views
0

Я хочу воспроизводить музыкальные треки с помощью класса AudioTrack в android, используя стерео с 16-битным каналом PCM. Вот мой код 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() после попытки, catch, не повезло)
Что я здесь делаю неправильно?

ответ

1

Воспроизведение двоичного содержимого сжатого аудиофайла в AudioTrack, возможно? Это не сработает, если ваши музыкальные файлы не хранятся в необработанном формате. AudioTracks использует PCM format. Даже заголовок в .wav-файле будет звучать как статический, пока вы не достигнете необработанных образцов.

0

Спасибо @ greeble31 Ответ, я понимаю свою проблему сейчас, я искал, как декодировать файлы .mp3 и .wav в формате PCM, и я нашел полезные ответы here и here, если кому-то это понадобится.