Потрескивающий шум при потоковой передаче аудио в Android

Я пытаюсь создать приложение для потоковой передачи звука из локального файла на одном устройстве на другое устройство с помощью API-интерфейса Nearby Communications. Проблема в том, что мне удается транслировать звук, но единственное, что я слышу на удаленном устройстве, — это какой-то бессмысленный треск. Что я прочитал до сих пор, так это то, что мне нужно настроить значение в minBufferSize, которое я использую, и значение в sampleRate, но я пытался это сделать, и я не добился многого.

Это мой код для отправки фрагментов байтов:

AudioTrack speaker;
//Audio Configuration.    
private int sampleRate = 16000;      //How much will be ideal?
private int channelConfig = AudioFormat.CHANNEL_OUT_MONO;
private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    minBufSize=2048;
    speaker = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, channelConfig, audioFormat, 10*minBufSize, AudioTrack.MODE_STREAM);
   }



    final InputStream file;
            final byte [] arrayStream = new byte [minBufSize];
            try {
                file= new FileInputStream (filepath);
                bytesRead = file.read(arrayStream);
                while (bytesRead!=-1) {
                    new Thread(new Runnable() {
                        public void run() {
                            sendMessage(arrayStream);
                        }
                    }).start();
                    bytesRead = file.read(arrayStream);
                }
                Toast.makeText(this, "Mensaje totalmente completado",Toast.LENGTH_SHORT).show();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

private void sendMessage(byte [] payload) {

    Nearby.Connections.sendReliableMessage(mGoogleApiClient, mOtherEndpointId, payload);

    //mMessageText.setText(null);
}

А это код для получения и воспроизведения сообщения на удаленном устройстве:

    @Override
public void onMessageReceived(String endpointId, byte[] payload, boolean isReliable) {
    // A message has been received from a remote endpoint.
    Toast.makeText(this,"Mensaje recibido",Toast.LENGTH_SHORT).show();
    debugLog("onMessageReceived:" + endpointId + ":" + new String(payload));

        playMp3(payload);

}
private void playMp3(final byte[] mp3SoundByteArray) {

    if (isPlaying==false){
        speaker.play();
        isPlaying=true;
    }else{
                //sending data to the Audiotrack obj i.e. speaker
                speaker.write(mp3SoundByteArray, 0, minBufSize);
                Log.d("VR", "Writing buffer content to speaker");

        }
}

Кто-нибудь может мне с этим помочь??

Спасибо!


person Pablo Ávila Flores    schedule 27.08.2015    source источник
comment
не могли бы вы поделиться своим кодом? так как я также работаю над тем же   -  person Sharmilee    schedule 28.10.2015
comment
Могу ли я выполнить это с помощью Nearby Message API?   -  person Sharmilee    schedule 28.10.2015


Ответы (1)


Вам нужно буферизовать звук на клиенте, прежде чем пытаться его воспроизвести. Скорее всего, вы получаете какие-то данные и воспроизводите их, а следующий блок данных не приходит вовремя.

См. этот пост и этот пост о буферизации данных и потоковом аудио.

person jaybers    schedule 03.09.2015