PCM Raw Bytes [] для аудио на Android
В настоящее время у меня есть аудио PCM в виде массива байтов. Формат подписан 16-битным малым значком. Я хотел бы преобразовать это в какой-нибудь воспроизводимый формат на Android, желательно версии 3.2 или выше. Кто-нибудь имеет предложения о том, как это можно сделать? Я провел некоторое исследование и попробовал следующее ниже, но ни один из них не был успешным. Было бы очень признательно, если кто-нибудь может предложить лучший способ или указать, где я поступил неправильно.
Я попытался создать AudioFormat с правильными настройками звука, однако Android не поддерживает библиотеку javax.sound.sampled.
Я также пробовал записывать данные PCM в волновой файл, но я столкнулся с проблемой получения всей необходимой информации заголовка wav.
Я также попытался использовать класс AudioTrack, предлагаемый Android, для воспроизведения данных 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");
}
}
Любые предложения будут оценены.
Ответы
Ответ 1
http://developer.android.com/reference/android/media/AudioTrack.html
Этот класс выглядит так, как будто он вам нужен!
write(byte[] audioData, int offsetInBytes, int sizeInBytes)
Записывает аудиоданные в аудиооборудование для воспроизведения.
ИЗМЕНИТЬ
Измените свой поток на AudioManager.STREAM_MUSIC
Ответ 2
Вопрос заключается в том, хотите ли вы воспроизводить образцы PCM, которые вы получаете из какого-либо источника непосредственно в приложении Android, или если у вас есть внешние файлы, которые вам нужно преобразовать. В первом случае перейдите к описанию 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 файла, открывать его в редакторе и сохранять в нужном формате...