通过解码Base64播放音频

时间:2017-03-17 09:41:07

标签: java android

我的数据库有很多格式化base64的短音频。我想在点击按钮时播放音频。基本上,我写了这段代码,但它不起作用。 (如果可能,文件最好不写入存储,因为此过程有延迟)

playButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        try{
            String url = "data:audio/mp3;base64,"+base64FormattedString;
            MediaPlayer mediaPlayer = new MediaPlayer();
            mediaPlayer.setDataSource(url);
            mediaPlayer.prepare();
            mediaPlayer.start();
        }
        catch(Exception e){
            e.printStackTrace();
        }

    }
});

堆栈跟踪在这里:https://gist.github.com/AliAtes/aa46261aba3d755fbbd1eba300356a5f

2 个答案:

答案 0 :(得分:4)

使用API​​约束,您可以使用AudioTrack。此外,它非常简单。使用AudioTrack,您可以播放自API 3以来的byte[]音频数据。

您只需使用音频示例特性初始化AudioTrack对象:

AudioTrack audioTrack = new AudioTrack(...);

并致电:

audioTrack.play();

然后,您解码Base64数据:

byte[] data = Base64.decode(yourBase64AudioSample, Base64.DEFAULT);

并将其放入audioTrack进行播放:

int iRes = audioTrack.write(data, 0, data.length);

和TADAAA:)

...不要忘记在播放后发布

audioTrack.release();

答案 1 :(得分:2)

您应该可以通过扩展MediaDataSource并以setDataSource作为参数调用// first decode the data to bytes byte[] data = Base64.decode(base64FormattedString, Base64.DEFAULT); mediaPlayer.setDataSource(new MediaDataSource() { @Override public long getSize() { return data.length; } @Override public int readAt(long position, byte[] buffer, int offset, int size) { int length = getSize(); if (position >= length) return -1; // EOF if (position + size > length) // requested more than available size = length - position; // set size to maximum size possible // at given position System.arraycopy(data, (int) position, buffer, offset, size); return size; } @Override public synchronized void close() throws IOException { } }); 来实现这一目标。

也许尝试这样的事情:

MediaDataSource

有关实施byte[]的详情,您可以查看this article

编辑:此方法需要23作为API级别。在23之前,似乎几乎不可能从MediaPlayer(或除URL或文件之外的任何内容)提供播放数据。我找到的唯一的东西是this answer,它提供了与问题中显示的相同的代码。

编辑2:N0un在他的评论和answer中指出,自API级别3开始,可以使用AudioTrack代替config.exceptions_app = self.routes