在Android上将PCM原始字节[]转换为音频

21
我目前有一个以字节数组形式表示的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");
    }
}

有任何建议都将不胜感激。

2个回答

22

感谢您指导我修复流的问题。这有助于解决错误。 - ShannonS
6
请选择正确答案,这将有助于您在未来获得更多的回答。 - Jack Satriano
我们可以将此内容写入文件并存储吗? - Feroz Siddiqui
这个怎么把它写入文件中? - Feroz Siddiqui

19

问题是您是否希望直接在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文件,在编辑器中打开并以所需格式保存...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接