2015-08-27 75 views
2

我正在尝试创建一个应用程序,以将音频从一个设备中的本地文件流式传输到使用Nearby通信API的其他设备。 问题是我设法传输音频,但我在远程设备上听到的唯一东西是某种无意义的开裂噪声。 到目前为止,我所读到的是我需要调整minBufferSize中使用的值和sampleRate中的值,但我一直在尝试这一点,而且我没有取得多大成就。在Android中流式传输音频时出现噪声

这是我的代码发送字节块:

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"); 

     } 
} 

谁能帮我这个??

谢谢!

+0

你能分享一下你的代码吗?因为我也在使用相同的 – Sharmilee

+0

我可以使用Nearby Message API来执行此操作吗? – Sharmilee

回答

0

在尝试播放之前,您需要在客户端上缓冲一些音频。很可能你会得到一些数据并播放它,下一批数据还没有及时到达。

关于缓冲数据和流式音频,请参见this postthis post