8

MediaPlayerでオーディオファイルを再生しようとしています。MediaPlayerでバイト配列を再生したい。これどうやってするの?これを確認しました

 public void writeSamples(byte[] samples, int length) 
{
  //  track.write( samples, 0, length);
    File tempMp3;
    try {
    tempMp3 = File.createTempFile("kurchina", ".mp3");
      tempMp3.deleteOnExit();
      FileOutputStream fos = new FileOutputStream(tempMp3);
      fos.write(samples);
      fos.close();
      // Tried reusing instance of media player
      // but that resulted in system crashes...  
      MediaPlayer mediaPlayer = new MediaPlayer();

      // Tried passing path directly, but kept getting 
      // "Prepare failed.: status=0x1"
      // so using file descriptor instead   
      FileInputStream fis = new FileInputStream(tempMp3);
      mediaPlayer.setDataSource(fis.getFD());
      mediaPlayer.prepare();
      mediaPlayer.start();
      } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    }

しかし、オーディオは再生されません。SDカードにたくさんのファイルを生成しているだけです。そして、このエラーを与える:

 06-06 11:02:59.191: E/MediaPlayer(1831): Unable to to create media player
 06-06 11:02:59.191: W/System.err(1831): java.io.IOException: setDataSourceFD failed.:      status=0x80000000
 06-06 11:02:59.201: W/System.err(1831):  at    android.media.MediaPlayer.setDataSource(Native Method)
 06-06 11:02:59.201: W/System.err(1831):  at   android.media.MediaPlayer.setDataSource(MediaPlayer.java:749)
 06-06 11:02:59.201: W/System.err(1831):  at   org.vinuxproject.sonic.SonicTest$1.run(SonicTest.java:178)
 06-06 11:02:59.201: W/System.err(1831):  at java.lang.Thread.run(Thread.java:1096)

私を助けてください。どんな種類の助けもありがたいです。

ありがとう

4

3 に答える 3

8

コメントに基づいて、ストリーミングに WAV ファイルを使用しています。従来の WAV はファイルの先頭にヘッダーがあり、残りのファイルは純粋なデータです。ヘッダー部分を含めない場合、データ (チャンネル数、1 秒あたりのサンプル数、ブロック サイズなど) を解釈できるように、ヘッダー部分のパラメーターをプレーヤーに提供する必要があります。その結果、WAVファイルだけではストリーミングできないため、パラメータをプレーヤーにフィードする必要があります。

一方、 MPEG-4はストリーミングできるように指定されています。これには、単独で再生できる識別可能なセグメントが含まれているため、データ チャンクにヘッダーが含まれている限り、それ以降のデータを再生できます。優れた圧縮率に加えて、これが多くのインターネット ラジオで使用される理由の 1 つです。

MediaPlayerAndroid では高レベルのコンポーネントであり、WAV チャンクの再生に必要な低レベルのパラメーターにはアクセスできません。ソースを WAV にする必要があり、他のストリーミング可能な形式を使用できない場合は、 AudioTrackクラスまたはOpenSL ESを試して、さらに低レベルのアクセスを行うことができます。AudioTrack の場合、これは非常に優れたチュートリアルです: http://audioprograming.wordpress.com/2012/10/18/a-simple-synth-in-android-step-by-step-guide-using-the-Java-sdk /

于 2013-08-27T20:21:29.383 に答える
0

これを試して :

private void playMp3(byte[] mp3SoundByteArray) 
{
    try 
    {

        File path=new File(getCacheDir()+"/musicfile.3gp");

        FileOutputStream fos = new FileOutputStream(path);
        fos.write(mp3SoundByteArray);
        fos.close();

        MediaPlayer mediaPlayer = new MediaPlayer();

        FileInputStream fis = new FileInputStream(path);
        mediaPlayer.setDataSource(getCacheDir()+"/musicfile.3gp");

        mediaPlayer.prepare();
        mediaPlayer.start();
    } 
    catch (IOException ex) 
    {
        String s = ex.toString();
        ex.printStackTrace();
    }
}
于 2013-09-03T13:10:02.600 に答える