我正在尝试使用MediaPlayer播放音频文件。我想在MediaPlayer中播放字节数组。我怎样才能做到这一点?我查了this
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)
请帮帮我。任何形式的帮助都表示赞赏。
由于
答案 0 :(得分:6)
根据您的评论,您正在使用WAV文件进行流式传输。文件开头的常规WAV has a header和文件的其余部分是纯数据。如果你不包括标题部分,则需要将其中的参数提供给播放器,以便能够解释数据(通道数,每秒采样数,块大小等)。结果,WAV单独的文件不可流式传输,参数必须输入播放器。
另一方面,MPEG-4已指定能够进行流式传输。它包含可以单独播放的可识别的片段,因此只要数据块包含标题,其后的数据就可以播放。除了良好的压缩比之外,这也是许多互联网无线电使用它的原因之一。
Android中的 MediaPlayer
是一个高级组件,无法访问播放WAV块所需的低级参数。如果您需要源是WAV而无法使用其他streamable formats,那么您可以尝试使用AudioTrack类或OpenSL ES进行更低级别的访问。
对于AudioTrack,这是一个非常好的教程:http://audioprograming.wordpress.com/2012/10/18/a-simple-synth-in-android-step-by-step-guide-using-the-java-sdk/
答案 1 :(得分:0)
在文件上写入一个字节后: 你可以玩这个功能:
void playSound(int resid) {
MediaPlayer eSound = MediaPlayer.create(context, resid);
Resources res = context.getResources();
AssetFileDescriptor afd = res.openRawResourceFd(resid);
eSound.reset();
eSound.setAudioStreamType(AudioManager.STREAM_SYSTEM);
try {
eSound.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(),
afd.getLength());
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
eSound.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
eSound.start();
}
您可以从此处获取文件信息:
byte[] getFileInformation(String filepath) {
MediaPlayer eSound = MediaPlayer.create(context, Uri.parse(filepath));
eSound.reset();
eSound.setAudioStreamType(AudioManager.STREAM_SYSTEM);
try {
eSound.setDataSource(filepath);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
eSound.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
int duration = eSound.getDuration() / 1000;
int height = 480;
int width = 640;
height = eSound.getVideoHeight();
width = eSound.getVideoWidth();
eSound.release();
File f = new File(filepath);
int size = (int) f.length();
byte[] b = new byte[16];
System.arraycopy(convertIntToByte(size), 0, b, 0, 4);
System.arraycopy(convertIntToByte(duration), 0, b, 4, 4);
System.arraycopy(convertIntToByte(width), 0, b, 8, 4);
System.arraycopy(convertIntToByte(height), 0, b, 12, 4);
return b;
}
答案 2 :(得分: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();
}
}