Android - 从byte []数组播放mp3

时间:2012-04-04 14:29:56

标签: android file mp3 bytearray

我有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。你知道哪里出错了吗?

5 个答案:

答案 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;
        }
    }
}