我有byte []数组,其中包含mp3文件。有没有办法在不创建临时文件的情况下播放mp3文件?
由于
编辑:
我尝试过临时文件方法:
File tempMp3 = File.createTempFile("test", ".mp3", getCacheDir());
//tempMp3.deleteOnExit();
FileOutputStream fos = new FileOutputStream(tempMp3);
fos.write(bytes);
fos.close();
mediaPlayer = MediaPlayer.create(getApplicationContext(),Uri.fromFile(tempMp3));
mediaPlayer.start();
我仍然得到NullPointerException。我正在将字节数组(称为字节)写入文件,我保留其引用并使用它。但仍然获得NPE。你知道哪里出错了吗?
答案 0 :(得分:2)
我假设您使用的是MediaPlayer
,直到最新的API无法将byte[]
格式的数据设置为String
(路径),{{1} }或FileDescriptor
所以我担心你必须写一个临时的Uri
。
答案 1 :(得分:1)
Android提供了一个非常低级别的API(AudioTrack),可将原始PCM数据直接写入声音硬件。
答案 2 :(得分:0)
使用tmpFile,请关注该帖子:Android - Playing mp3 from byte[]
如果它仍然是npe,检查你的文件(tempMp3)是否为空,如果Uri.fromFile返回一个uri而不是null。
答案 3 :(得分:0)
private void playByteArray(byte[] mp3SoundByteArray) {
try {
File Mytemp = File.createTempFile("TCL", "mp3", getCacheDir());
Mytemp.deleteOnExit();
FileOutputStream fos = new FileOutputStream(Mytemp);
fos.write(mp3SoundByteArray);
fos.close();
MediaPlayer mediaPlayer = new MediaPlayer();
FileInputStream MyFile = new FileInputStream(Mytemp);
mediaPlayer.setDataSource(Mytemp.getFD());
mediaPlayer.prepare();
mediaPlayer.start();
} catch (IOException ex) {
String s = ex.toString();
ex.printStackTrace();
}
}
答案 4 :(得分:0)
我知道这是旧的,但是我搜索了一个答案,并没有发现任何真正允许从没有临时文件的字节数组中播放,实际上有一种非常简单的方法,创建一个自定义MediaDataSource。
我在这里发布了Xamarin Android的代码,但它很容易移植到Java,问题是你可以看到这样做的方法。
请注意,这些方法已添加到android 6.0 SDK中,如果您定位较低版本的Android,则必须使用正确的兼容性支持库。
public class AudioPlayer
{
MediaPlayer currentPlayer;
public void Play(byte[] AudioFile, bool Loop)
{
Stop();
currentPlayer = new MediaPlayer();
currentPlayer.Prepared += (sender, e) =>
{
currentPlayer.Start();
};
currentPlayer.Looping = Loop;
currentPlayer.SetDataSource(new StreamMediaDataSource(new System.IO.MemoryStream(AudioFile)));
currentPlayer.Prepare();
}
public void Stop()
{
if (currentPlayer == null)
return;
currentPlayer.Stop();
currentPlayer.Dispose();
currentPlayer = null;
}
}
public class StreamMediaDataSource : MediaDataSource
{
System.IO.Stream data;
public StreamMediaDataSource(System.IO.Stream Data)
{
data = Data;
}
public override long Size
{
get
{
return data.Length;
}
}
public override int ReadAt(long position, byte[] buffer, int offset, int size)
{
data.Seek(position, System.IO.SeekOrigin.Begin);
return data.Read(buffer, offset, size);
}
public override void Close()
{
if (data != null)
{
data.Dispose();
data = null;
}
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (data != null)
{
data.Dispose();
data = null;
}
}
}