如何播放字节流? (设备之间的语音通话)

时间:2017-09-12 15:53:02

标签: android bluetooth streaming android-bluetooth voice

目标是在两台设备之间组织语音通话。问题在于重拾部分,我得到很高的噪音,所以不可能理解这个演讲。这是我的代码:

发送部分:

    public void startRecording() {

//  private static final int RECORDER_SAMPLERATE = 44100;
//  private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_STEREO;
//  private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
//  bufferSize = AudioRecord.getMinBufferSize(8000,
                AudioFormat.CHANNEL_CONFIGURATION_MONO,
                AudioFormat.ENCODING_PCM_16BIT);

    recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
            RECORDER_SAMPLERATE, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING, bufferSize);

    int i = recorder.getState();
    if (i == 1)
        recorder.startRecording();
    isRecording = true;
    recordingThread = new Thread(new Runnable() {

        @Override
        public void run() {
            byte data[] = new byte[bufferSize];
            bluetoothCall.sendMessage(data);
        }
    }, "AudioRecorder Thread");
    recordingThread.start();
}

接收部分(可能问题在于此部分):

    private final Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {

            case MESSAGE_WRITE:
                 // ...
            case MESSAGE_READ:
                try{

                //  private int sampleRate = 44100 ;
                //  int bufferSize = AudioRecord.getMinBufferSize(8000,
                                     AudioFormat.CHANNEL_CONFIGURATION_MONO,
                                     AudioFormat.ENCODING_PCM_16BIT);

                    byte[] readBuf = (byte[]) msg.obj;

                    mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT, bufferSize, AudioTrack.PERFORMANCE_MODE_LOW_LATENCY);

                    mAudioTrack.play();

                    mAudioTrack.write(readBuf, 0, readBuf.length);
                    mAudioTrack.release();
                }
                catch (Exception e){
                }
                break;
        }
    }
};

1 个答案:

答案 0 :(得分:2)

VoIP质量通常受以下几个因素的影响:

  • 延迟(数据包的端到端时间)
  • 抖动(延迟差异)
  • 丢包

VoIP实施中的大多数问题通常都是关于延迟和抖动的问题,但根据您对噪声的描述,听起来更像是丢失数据或以某种方式损坏数据。

无论哪种方式,除非你是为了学习或学术目的而这样做,否则使用可以解决这些问题的VoIP库可能会更容易 - 信令和语音通信都有很多复杂性。 VoIp电话。

Android现在有一个内置的SIP库:

这确实需要某种SIP服务器,即使你将它构建到你的客户端,也可能不是你想要的。

您还可以围绕RTP(语音数据传输部分)构建自己的解决方案,但这需要更多的工作来发现IP地址等:

您可以经常使用没有服务器的SIP客户端,但您需要计算出IP地址,更巧妙的是端口(https://stackoverflow.com/a/44449337/334402)。

如果您确实想使用SIP,则可以使用opeusource SIP服务器 - 例如: