android - 在Android中流式传输音频时产生噪音

标签 android audio audio-streaming google-nearby

我正在尝试创建一个应用,以使用附近的通信API将音频从一台设备中的本地文件传输到另一台设备。
问题是我设法流式传输音频,但是我只能在远程设备上听到的是某种无意义的破裂噪音。
到目前为止,我已经读到我需要调整我正在使用的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");

        }
}

谁能帮我这个??

谢谢!

最佳答案

您需要先在客户端上缓冲一些音频,然后再尝试播放。您很可能会获得一些数据并进行播放,而下一数据块却没有及时到达。

有关缓冲数据和流音频的信息,请参见this postthis post

关于android - 在Android中流式传输音频时产生噪音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32247663/

相关文章:

javascript - 如何使用 webRTC 和基于服务器的对等连接录制网络摄像头和音频

Android chrome不会在html中播放本地声音文件

iOS Swift malloc 错误

iphone - 有带控件的iOS音乐播放器吗?

Android 从 VLC/ffmpeg 接收 RTP/UDP 音频流

java - java Servlet 中磁盘的音频流

java - Firebase 并发锁定/解锁写访问多个设备

android - 从控制台仅对选定的文件运行 Lint

android - 检测穿戴式应用是否正在安装/已安装

javascript - 音频标签,播放请求被新的加载请求中断