当前位置: 首页 > 知识库问答 >
问题:

在Android中从内存流播放WAV音频

皇甫琛
2023-03-14

我将从REST服务接收非常短的音频数据。它们将以WAV格式到达。然后我需要在Android设备上播放它们。我想在不将数据保存到文件的情况下完成这项工作——这只会让它变得比需要的更复杂。然而,我无法从内存流让它工作。下面是我正在使用的测试代码(使用assets文件夹中的.wav文件):

public void PlayAudioFile(string fileName)
    {
        bool useMemoryStream = true;

        if (useMemoryStream)
        {
            //this doesn't work
            MemoryStream ms = GetMS(fileName);
            byte[] msData = new byte[ms.Length];
            ms.Position = 0;
            ms.Read(msData, 0, (int)ms.Length);
            String base64EncodedString = Base64.EncodeToString(msData, Base64Flags.Default);

            String url = "data:audio/wav;base64," + base64EncodedString;
            MediaPlayer player = new MediaPlayer();

            player.Prepared += (s, e) =>
            {
                player.Start();
            };

            player.SetDataSource(url);
            player.Prepare();
        }
        else
        {
            //this works
            MediaPlayer player = new MediaPlayer();

            var fd = global::Android.App.Application.Context.Assets.OpenFd(fileName);
            player.Prepared += (s, e) =>
            {
                player.Start();
            };

            player.SetDataSource(fd.FileDescriptor, fd.StartOffset, fd.Length);
            player.Prepare();
        }
    }

    private MemoryStream GetMS(string fileName)
    {
        MemoryStream ms = new MemoryStream();

        Context context = Android.App.Application.Context;

        using (System.IO.Stream stream = context.Assets.Open(fileName))
        {
            stream.CopyTo(ms);
        }

        return ms;
    }

当我从文件中播放它时,它是好的,但是内存流方法给了我一个IO异常准备失败错误。我怀疑问题可能是音频/wav值。我找不到任何支持值的留档。当我用MP3文件尝试并将其更改为音频/mp3时,它从内存流中工作正常。任何想法!

共有1个答案

濮阳唯
2023-03-14

你应该使用AudioTrack。

在这种情况下,您可以为wav文件指定音频参数:

  • 在HZ中的采样率
  • 编码类型(例如8bit或16bit pcm)
  • 频道(单声道\立体声)

然后设置缓冲区大小和传输模式。调用播放。

例子:

    int minBufferSize = AudioTrack.getMinBufferSize(16000, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT);
    track =  new AudioTrack.Builder().setAudioFormat(new AudioFormat.Builder()
                                        .setChannelMask(AudioFormat.CHANNEL_OUT_STEREO)
                                        .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
                                        .setSampleRate(44100)
                                        .build())
                                .setTransferMode(AudioTrack.MODE_STREAM)
                                .setBufferSizeInBytes(minBufferSize)
                                .build();
track.play();

如果一切正常。您可以开始将数据写入缓冲区(使用后台线程)。

 int size = 512;//(for example)
 byte[] veryShortPiecesOfAudioAataFromRESTService = new byte[size];
 track.write(veryShortPiecesOfAudioAataFromRESTService, 0, size);
 类似资料:
  • 我无法从sd卡播放wav音频文件: 这是我的代码: 文件名路径的格式为:/storage/emulated/0/MyApp/name。wav 这是我得到的错误代码: 我希望你能帮我? 谢谢

  • 我正在读一本书。wav文件在C中,然后我尝试使用一些QT函数播放音频文件。以下是我如何阅读该文件: 所以我的音频文件在里面。的每个元素都是无符号的16位整数。 为了播放声音,我将每个16位无符号整数分成两个字符,然后每隔3毫秒(使用计时器)向音频卡发送256个字符。假设是256个字符的字符数组,我这样做(每隔3毫秒)来播放声音: 此外,定义为: 并且定义为: 并且音频格式设置正确为: 然而,当我试

  • 我想使用android<code>MediaPlayer</code>将文件中的音频播放到手机的耳机(或已连接的耳机)中。我尝试使用本文中建议的MODE_IN_CALL hack-Android-通过耳机播放音频,但没有帮助。该应用程序还具有android.com权限。MODIFY_AUDIO_SETTINGS权限,但对<code>m_amAudioManager的任何调用。无线电话(假) 被忽略

  • 问题内容: 如何在Java应用程序中播放和文件?我正在使用。我尝试在互联网上查找类似以下示例的内容: 但是,这只会播放文件。 问题答案: 如何在Java应用程序中播放和文件?我正在使用。我尝试在互联网上查找类似以下示例的内容: 但是,这只会播放文件。

  • 音乐播放器在没有外置存储器的智能手机上运行,应用程序会崩溃,而在有外置存储器的智能手机上运行。你能告诉我为什么。 Java类 activity XML listitem.xml 错误日志 谢谢你的帮助