当前位置:  开发笔记 > 运维 > 正文

Android - 从byte []播放mp3

如何解决《Android-从byte[]播放mp3》经验,为你挑选了4个好方法。

我有一个字节[](从服务中下载),我的MP3文件,我想发挥它我的设备类似上你可以怎么玩的文件:

MediaPlayer mp = new MediaPlayer();
mp.setDataSource(PATH_TO_FILE);
mp.prepare();
mp.start();

但我似乎无法找到办法.我不介意将文件保存到手机然后播放.我该如何播放文件,或下载然后播放?



1> nikib3ro..:

好的,感谢你们所有人,但是我需要从byte []播放mp3,因为我从.NET webservice那里得到了它(不希望在服务器上存储动态生成的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()现在是否适合你 - 随意建议改进,以便临时文件不会堆积.


如果你像这样重复使用MediaPlayer,如果你多次调用代码,你最终会耗尽资源.您应该使用MediaPlayer的单个实例,但在mediaPlayer.setDataResource(..)之前调用mediaPlayer.reset(); 通过这种方式,您不会崩溃,也不会耗尽资源.
它对我不起作用它提供了错误01-27 15:39:44.686:W/System.err(1022):java.io.IOException:setDataSourceFD failed:status = 0x80000000

2> 小智..:

我通过将我的MP3文件编码为Base64(我已经收到Restful API服务编码的数据),然后创建一个URL对象,找到了一个简单的解决方案.我在Android 4.1中测试过它.

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());
        }
    }



3> krishnakumar..:

启动Android MarshMellow(版本代码23),有新的API可以实现这一目标.

MediaPlayer.setDataSource(android.media.MediaDataSource)

您可以提供MediaDataSource的自定义实现并包装byte [].下面给出的基本实现.

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
    }
}



4> Yoni Samlan..:

不确定bytearrays/bytestreams,但是如果你有来自服务的URL,你可以尝试通过调用将数据源设置为网络URI

setDataSource(Context context, Uri uri)

请参阅API文档.

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有