我目前有一个字节数组形式的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");
}
}
任何建议将不胜感激。
答案 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文件,在编辑器中打开它并以您需要的格式保存...