Android – 从byte 播放mp3
我有我的mp3文件在字节[](从服务下载),我想在我的设备上播放类似于如何播放文件:
MediaPlayer mp = new MediaPlayer(); mp.setDataSource(PATH_TO_FILE); mp.prepare(); mp.start();
但我似乎无法find办法。 我不介意将文件保存到手机,然后播放它。 我该如何播放文件,或下载然后播放?
好的,谢谢大家,但我需要从字节[]播放MP3,因为我从.NET Web服务(不希望在服务器上存储dynamic生成的MP3)。
最后 – 还有一些“陷阱”可以播放简单的mp3 …这是任何需要它的人的代码:
private MediaPlayer mediaPlayer = new MediaPlayer(); private void playMp3(byte[] mp3SoundByteArray) { try { // create temp file that will hold byte array File tempMp3 = File.createTempFile("kurchina", "mp3", getCacheDir()); tempMp3.deleteOnExit(); FileOutputStream fos = new FileOutputStream(tempMp3); fos.write(mp3SoundByteArray); fos.close(); // resetting mediaplayer instance to evade problems mediaPlayer.reset(); // In case you run into issues with threading consider new instance like: // 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 ex) { String s = ex.toString(); ex.printStackTrace(); } }
编辑:我已经写了这个答案超过4年前 – 显然很多事情从那时起已经改变。 请参阅Justin关于如何重用MediaPlayer实例的评论。 另外,我不知道.deleteOnExit()现在是否适用于你 – 随意提出改进build议,以便临时文件不会堆积。
不知道bytearrays / bytestreams,但如果你有一个来自服务的URL,你可以尝试通过调用设置数据源到networkingURI
setDataSource(Context context, Uri uri)
查看API文档 。
我通过将我的MP3文件编码为Base64(我已经收到从Restful API服务编码的数据),然后创build一个URL对象,find了一个简单的解决scheme。 我在Android 4.1中testing了它。
public void PlayAudio(String base64EncodedString){ try { String url = "data:audio/mp3;base64,"+base64EncodedString; MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource(url); mediaPlayer.prepare(); mediaPlayer.start(); } catch(Exception ex){ System.out.print(ex.getMessage()); } }
使用MediaPlayer从Android中的URLstream式传输audio?
错误代码:
MediaPlayer mp = new MediaPlayer(); mp.setDataSource(PATH_TO_FILE); mp.prepare(); mp.start();
正确的代码:
MediaPlayer mp = new MediaPlayer(); mp.setDataSource(PATH_TO_FILE); mp.setOnpreparedListener(this); mp.prepare(); //Implement OnPreparedListener OnPrepared() { mp.start(); }
请参阅API演示
启动Android MarshMellow(版本号23),有一个新的API将使这成为可能。
MediaPlayer.setDataSource(android.media.MediaDataSource)
您可以提供MediaDataSource的自定义实现并包装一个字节[]。 下面给出一个基本的实现。
import android.annotation.TargetApi; import android.media.MediaDataSource; import android.os.Build; import java.io.IOException; @TargetApi(Build.VERSION_CODES.M) public class ByteArrayMediaDataSource extends MediaDataSource { private final byte[] data; public ByteArrayMediaDataSource(byte []data) { assert data != null; this.data = data; } @Override public int readAt(long position, byte[] buffer, int offset, int size) throws IOException { System.arraycopy(data, (int)position, buffer, offset, size); return size; } @Override public long getSize() throws IOException { return data.length; } @Override public void close() throws IOException { // Nothing to do here } }