如何在Android中实现套接字上的音频调用



我在简单的套接字上搜索并找到了两部android手机之间的语音流或音频呼叫代码。我已经实现了这个,但是这个代码不起作用。我听不见任何声音。

接收器代码:

    private int sampleRate = 44100;
    private int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;    
    private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;       
    int minBufSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);

public void startReceiving() {
        Thread receiveThread = new Thread (new Runnable() {
            @Override
            public void run() {
                try {
                    DatagramSocket socket = new DatagramSocket(50005);
                    Log.d("VR", "Socket Created");

                    byte[] buffer = new byte[256];
                    speaker = new AudioTrack(AudioManager.STREAM_MUSIC,sampleRate,channelConfig,audioFormat,minBufSize,AudioTrack.MODE_STREAM);

                    while(status == true) {
                        try {

                            DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
                            socket.receive(packet);
                            Log.d("VR", "Packet Received");
                            //reading content from packet
                            buffer=packet.getData();
                            Log.d("VR", "Packet data read into buffer");
                            //sending data to the Audiotrack obj i.e. speaker
                            speaker.write(buffer, 0, minBufSize);
                            Log.d("VR", String.valueOf(buffer));
                            speaker.play();
                        } catch(IOException e) {
                            Log.e("VR","IOException");
                        }
                    }

                } catch (SocketException e) {
                    Log.e("VR", "SocketException");
                }

            }
        });
        receiveThread.start();
    }

发件人代码:

public void startStreaming() {
        Thread streamThread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    DatagramSocket socket = new DatagramSocket();
                    Log.d("VS", "Socket Created");
                    byte[] buffer = new byte[minBufSize];
                    Log.d("VS","Buffer created of size " + minBufSize);
                    DatagramPacket packet;
                    final InetAddress destination = InetAddress.getByName("192.168.0.216");
                    Log.d("VS", "Address retrieved");

                    recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,sampleRate,channelConfig,audioFormat,minBufSize*10);
                    Log.d("VS", "Recorder initialized");
                    recorder.startRecording();

                    while(status == true) {

                        //reading data from MIC into buffer
                        minBufSize = recorder.read(buffer, 0, buffer.length);
                        //putting buffer in the packet
                        packet = new DatagramPacket (buffer,buffer.length,destination,port);
                        socket.send(packet);
                    }
                } catch(UnknownHostException e) {
                    Log.e("VS", "UnknownHostException");
                } catch (IOException e) {
                    e.printStackTrace();
                    Log.e("VS", "IOException");
                } 
            }
        });
        streamThread.start();
     }

我调试了代码,数据包成功传输,speaker.play()也被调用。但没有Voice

我在一个应用程序和活动中实现了这段代码。带两个按钮Start ListeningStart Streaming

getMinBufferSize()对于AudioRecordAudioTrack可能不一样(这是通过艰苦的方式学到的)。确保您使用的是两者中较大的一个。

对我来说一切都很好……我只想问一下如何在像119.43.214.5这样的公共IP上发送数据包。我做了两个应用程序,它们可以在localhost上发送数据包。客户端已经获得了服务器应用程序的IP地址。问题是IP是一个公共IP,客户端没有在该应用程序上发送数据。

最新更新