5

mp3 ファイルを含む byte[] 配列があります。一時ファイルを作成せずに 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を取得しています。どこが間違っているか分かりますか?

4

5 に答える 5

2

私はあなたが使用していると仮定してMediaPlayerおり、最新の API までは(パス)、などbyte[]の形式でデータを設定する方法がないため、一時的な.StringFileDescriptorUriFile

于 2012-04-04T14:39:41.920 に答える
1

Android provide a very low level API (AudioTrack) to write raw PCM data directly to sound hardware.

于 2012-04-04T14:45:02.263 に答える
0

tmpFile を使用して、その投稿に従ってください: Android - Playing mp3 from byte[]

それでも問題が解決しない場合は、ファイル (tempMp3) が null でないかどうか、および Uri.fromFile が null ではなく uri を返すかどうかを確認します。

于 2012-04-04T15:45:33.077 に答える
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;
        }
    }
}
于 2016-03-11T13:11:03.107 に答える