Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-从byte[]阵列播放mp3_Android_File_Mp3_Bytearray - Fatal编程技术网

Android-从byte[]阵列播放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(

我有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。您知道错误在哪里吗?

我假设您正在使用,并且在最新的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上不起作用。它在真实设备中工作!