【问题标题】:How to implement Audio calling on sockets in Android如何在 Android 中的套接字上实现音频调用
【发布时间】:2013-09-07 12:27:19
【问题描述】:

我已经搜索并找到了在简单插座上的两部安卓手机之间的语音流或音频通话代码。我已经实现了这个,但是这个代码不起作用。我听不到任何声音。

收货人代码:

    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

【问题讨论】:

    标签: android audio stream voip voice


    【解决方案1】:

    getMinBufferSize() 对于AudioRecordAudioTrack 可能不一样(很难学到)。确保您使用的是两者中较大的一个。

    【讨论】:

    • 这是解决方案吗?,不明白你的真正意思。
    • 正如您在他的代码中看到的,他假设 AudioRecord.getMinBufferSize() 中的 minBufSize 与 AudioTrack.getMinBufferSize() 的值相同。一段时间以来,这对我来说是一个障碍,因为我之前也做过这个假设。调试时我发现 AudioTrack.getMinBufferSize() 返回的大小是 AudioRecord.getMinBufferSize() 的两倍(或者相反,我不记得了),所以录音机没有用足够的数据填充 AudioTrack 来播放声音。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-05
      • 2011-04-14
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      • 2016-10-12
      • 2013-01-01
      • 1970-01-01
      相关资源
      最近更新 更多