2016-08-31 11 views
0

PCT 16ビットチャネルのステレオを使用して、アンドロイドのAudioTrackクラスで音楽トラックを再生します。 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()という行も置いてあります。
私はここで何が間違っていますか?

答えて

1

圧縮されたオーディオファイルのバイナリコンテンツをAudioTrackに再生するのはおそらくですか?これは、音楽ファイルが生の非圧縮形式で保存されていないと機能しません。 AudioTracksはPCM formatを使用します。 .wavファイルのヘッダーでさえ、生のサンプルに到達するまで静的に聞こえるでしょう。

0

@ greeble31のおかげで、私は今問題を理解しています.mp3と.wavファイルをPCM形式にデコードする方法を調べたところ、誰かが必要とする場合に便利な答えherehereが見つかりました。

関連する問題