android - 在Android中使用字符串/字节播放音频

标签 android string audio buffer

我一直在尝试使用MediaPlayer在android中通过字符串/字节播放音频,但可以实现结果。我正在使用的代码是

`
    String ret = "";
    try {
        InputStream inputStream = this.openFileInput(Name);

        if ( inputStream != null ) {
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String receiveString = "";
            StringBuilder stringBuilder = new StringBuilder();

            while ( (receiveString = bufferedReader.readLine()) != null ) {
                stringBuilder.append(receiveString);
            }

            inputStream.close();
            ret = stringBuilder.toString();

            String url = "data:audio/mp3;base64,"+ret;
            MediaPlayer mediaPlayer = new MediaPlayer();
            mediaPlayer.setDataSource(url);
            mediaPlayer.prepare();
            mediaPlayer.start();

        }

    }
    catch (FileNotFoundException e) {
        Toast.makeText(this, "File not found", Toast.LENGTH_LONG).show();
    } catch (IOException e) {
        Toast.makeText(this,String.valueOf(e), Toast.LENGTH_LONG).show();
    }
    catch (Exception e)
    {
        Toast.makeText(this,String.valueOf(e),Toast.LENGTH_LONG).show();
    }`

该文件是从服务器保存的歌曲的 Base64 编码。
我得到的异常是java.io.ioexception prepare failed status=0x800000000
我可以使用MediaPlayer使用字符串/字节播放音频吗?如果没有,有什么办法可以使我发挥同样的作用。请帮忙。

[编辑]
Android - Playing mp3 from byte[]这个可接受的答案对我有用。但是还有其他方法可以在不创建临时文件的情况下播放音频吗?

最佳答案

您正在调用mediaPlayer.setDataSource(url)方法。此处的url(字符串)必须是有效的互联网url。您尝试在此处以String形式传递数据。

第二,你还没有打电话

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

调用prepare()方法之前的方法。为了使目标流类型生效,此方法是必须调用的方法。

您可以通过三种方式使MediaPlayer正常工作。在下面的示例中查看它们:
    MediaPlayer mediaPlayer = new MediaPlayer();
    File file = new File("");// if you have a file object representing your audio file, you can start from here.
    Uri uri = Uri.fromFile(file);// if you have a valid uri representing your audio file (may be obtained from a content provider or any other means etc), you can start from here
    try {
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mediaPlayer.setDataSource(this,uri);
        mediaPlayer.prepare(); // or mediaPlayer.prepareAsync();
        mediaPlayer.start();
    } catch (IOException e) {
        e.printStackTrace();
    }

如果您具有有效的Internet UrlString,则:
    MediaPlayer mediaPlayer = new MediaPlayer();
    String urlString = "http://...";// like this
    try {
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mediaPlayer.setDataSource(urlString);
        mediaPlayer.prepare(); // or mediaPlayer.prepareAsync();
        mediaPlayer.start();
    } catch (IOException e) {
        e.printStackTrace();
    }

您将不需要陷入Input / Output流和所有流。

然后,尝试以下代码:
byte[] byteArray = // your byteArray
    try {
        File file = File.createTempFile("prefix","suffix");//creates temporary file
        FileOutputStream fos = new FileOutputStream(file);
        fos.write(byteArray);//your bytes written in that temporary file
    } catch (IOException e) {
        e.printStackTrace();
    }

在这里,您可以初始化mediaPlayer并使用此临时文件。

关于android - 在Android中使用字符串/字节播放音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45385244/

相关文章:

java - 无法访问在 Rhino 中运行的脚本中的 java.lang.String

c++ - 带有字符串和 bad_alloc 检查的构造函数

python - 在 Python 中使用从字符串中删除\xa0

iphone - 影响应用程序性能的 AVAudioPlayer 声音

batch-file - 使用 FFMPEG 批量删除音频结尾

java - Java中的噪音和静音清除

android - 为动态创建的元素创建 XML

java - 如何在 android 中动态地将项目添加到 ListView

java - 在 Android 上读/写外部存储

java - list 文件中的多个 Google api key (Android)