在MediaPlayer中播放Byte数组 - Android

Kri*_*har 5 android

我正在尝试使用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();
    }
    }
Run Code Online (Sandbox Code Playgroud)

但它没有播放音频.它只是在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)
Run Code Online (Sandbox Code Playgroud)

请帮我.任何形式的帮助表示赞赏.

谢谢

all*_*rog 8

根据您的评论,您使用WAV文件进行流式传输.常规WAV在文件的开头有一个标题,文件的其余部分是纯数据.如果你不包括标题部分,则需要将其中的参数提供给播放器,以便能够解释数据(通道数,每秒采样数,块大小等).结果,WAV单独的文件不可流式传输,参数必须输入播放器.

另一方面,MPEG-4已被指定为能够流式传输.它包含可以单独播放的可识别的片段,因此只要数据块包含标题,其后的数据就可以播放.除了良好的压缩比之外,这也是许多互联网无线电使用它的原因之一.

MediaPlayer在Android中是一个高级组件,并且无法访问播放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 /