Android-从byte[]阵列播放mp3
我有byte[]数组,它包含mp3文件。有没有办法在不创建临时文件的情况下播放mp3文件 谢谢 编辑: 我尝试过临时文件方法:Android-从byte[]阵列播放mp3,android,file,mp3,bytearray,Android,File,Mp3,Bytearray,我有byte[]数组,它包含mp3文件。有没有办法在不创建临时文件的情况下播放mp3文件 谢谢 编辑: 我尝试过临时文件方法: File tempMp3 = File.createTempFile("test", ".mp3", getCacheDir()); //tempMp3.deleteOnExit(); FileOutputStream fos = new FileOutputStream(
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。您知道错误在哪里吗?我假设您正在使用,并且在最新的API之前,无法将数据设置为
字节[]
格式,就像字符串(路径),文件描述符
一样,或者Uri
,因此我担心您将不得不编写一个临时文件
Android提供了一个非常低级的API(),以便将原始PCM数据直接写入声音硬件。对于tmpFile,请遵循以下帖子:
如果它仍然是npe,请检查您的文件(temp3)是否不为null,以及Uri.fromFile是否返回Uri且不为null。我知道这是旧的,但我搜索了答案,没有找到任何真正允许在没有temp文件的情况下从字节数组播放的方法,而且确实有一种非常简单的方法,创建自定义MediaDataSource
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();
}
}
我在这里发布了XamarinAndroid的代码,但是它很容易移植到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;
}
}
}
文件可以是.wav吗?(事实上,在PCM中)如果您使用mp3解码器将mp3字节数组解码为原始数据并将其馈送至AudioTrack,则会发生这种情况。请告诉我您是如何将mp3格式转换为字节数组的。这看起来很好,但Xamarin似乎当前未公开MediaDataSource类或使用MediaDataSource的SetDataSource api。呃。。。这段代码是从我的项目中提取出来的,我正在使用它……只要添加一个“使用Android.Media”和“使用Java.IO”,它就会工作。啊,我看到它是在Android 6.0/API 23中添加的。我想我们需要一个兼容库来支持早期的Android版本。是的,你是对的,我正在更新帖子来表示它。你知道要使用哪个兼容支持库吗?它似乎在Emulator上不起作用。它在真实设备中工作!