PCM Raw Bytes []到Android上的音频

时间:2012-06-29 19:16:53

标签: android audio bytearray pcm audiotrack

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

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

我也尝试将PCM数据写入wave文件,但是我遇到了所有必要的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");
    }
}

任何建议将不胜感激。

2 个答案:

答案 0 :(得分:20)

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

这个类看起来就像你需要的那样!

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

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

修改

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

答案 1 :(得分: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文件,在编辑器中打开它并以您需要的格式保存...