我的数据库有很多格式化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
答案 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
。