20

我目前有一个字节数组形式的 PCM 音频。格式是有符号的 16 位小端。我想将其转换为 Android 上的一些可播放格式,最好是 3.2 或更高版本。有人对如何做到这一点有建议吗?我做了一些研究并尝试了以下方法,但没有一个成功。如果有人能提出更好的方法或指出我哪里出错了,将不胜感激。

我尝试使用正确的音频设置创建 AudioFormat,但是 Android 不支持 javax.sound.sampled 库。

我也尝试将 PCM 数据写入波形文件,但在获取所有必要的 wav 标头信息时遇到了麻烦。

我还尝试使用 Android 提供的 AudioTrack 类来播放 PCM 数据。然而,我似乎听不到任何声音。这是我的方法:

    public void playback(){
         try{
              AudioTrack audioTrack = new  AudioTrack(AudioManager.STREAM_VOICE_CALL, 8000, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, 500000, AudioTrack.MODE_STATIC);
              audioTrack.write(audio, 0, 500000);

      } catch(Throwable t){
        Log.d("Audio","Playback Failed");
    }
}

任何建议,将不胜感激。

4

2 回答 2

22

http://developer.android.com/reference/android/media/AudioTrack.html

这个类看起来正是你所需要的!

write(byte[] audioData, int offsetInBytes, int sizeInBytes)

将音频数据写入音频硬件进行播放。

编辑

将您的信息流更改为AudioManager.STREAM_MUSIC

于 2012-06-29T19:19:59.860 回答
18

问题是您是否想直接在 Android 应用程序中播放从某个来源收到的 PCM 样本,或者如果您有一些需要转换的外部文件。在第一种情况下,按照 jack57 所描述的方式进行。这真的很容易,您甚至可以添加标记来精确计时。

int bufferSize = AudioTrack.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);

AudioTrack mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize, AudioTrack.MODE_STREAM);

mAudioTrack.play();

然后循环调用write方法:

mAudioTrack.write(buffer, 0, buffer.length);

在第二种情况下,只需使用一些免费的音频编辑器:http ://audacity.sourceforge.net/download/ 。您可以将 PCM 样本存储为 .txt 文件,在编辑器中打开它并以您需要的格式保存...

于 2012-06-29T19:32:44.270 回答