Android Play PCM байтовый массив из конвертированных из Base64 String Slow Sounds
Как видно из очень длинного заголовка, у меня возникают проблемы при воспроизведении аудио из аудио, которое я посылаю по сети черезPubNunb, Что я делаю, я посылаю аудио во время записи из AudioRecord, используя этот код:
AudioConfig audioConfig = getValidSampleRates(AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
buffer = new byte[audioConfig.getBufferSize()];
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, audioConfig.getSampleSize(), AudioFormat.CHANNEL_IN_MONO, AUDIO_FORMAT, audioConfig.getBufferSize());
Записанные данные отправляются, когда пользователь удерживает кнопку нажатой:
private class RecorderRunnable implements Runnable {
@Override
public void run() {
while(mRecording) {
Log.d("RECORDER_STATE", "Recording LOOP");
recorder.read(buffer, 0, buffer.length);
String base64EncodedBuffer = Base64.encodeToString(buffer, Base64.NO_WRAP);
pubnub.publish(MainActivity.CHANNEL_ID, base64EncodedBuffer, new Callback() {
@Override
public void successCallback(String channel, Object message) {
super.successCallback(channel, message);
}
});
}
}
}
Получить код:
@Override
public void successCallback(String channel, final Object message) {
byte[] decodedBase64 = Base64.decode(message.toString(), Base64.NO_WRAP);
speaker.write(decodedBase64, 0, decodedBase64.length);
}
Выпуск: Я получаю звук, но получаю очень медленные звуки. «Привет» будет звучать так: «Хи- * статический * -ll- * статический * -оо»
Чтобы исключить возможные причины, я попытался немедленно воспроизвести звук (без сети):
while(mRecording) {
Log.d("RECORDER_STATE", "Recording LOOP");
recorder.read(buffer, 0, buffer.length);
String base64EncodedBuffer = Base64.encodeToString(buffer, Base64.NO_WRAP);
byte[] decodedBase64 = Base64.decode(base64EncodedBuffer, Base64.NO_WRAP);
speaker.write(decodedBase64, 0, decodedBase64.length);
}
(Примечание: я специально сделал конвертацию в base64 и обратно в байтовый массив.)
Результат для кода выше (непосредственно проигрывается после записи) довольно хорош. Так что мне интересно, что я делаю неправильно, обрабатывая его по сети.
Любое предложение приветствуется. Спасибо.
Изменить: 28.08.2015 Нашел хорошее объяснение этомуВот, Но теперь вопрос в том, каков наилучший способ обработки дрожания / буферизации сети и потери пакетов с использованием моей текущей реализации.