WebRTC Android,无法得到我应该做的事情?

时间:2018-05-27 03:45:18

标签: android webrtc

我正在与WebRTC合作制作一个可在两部Android手机之间工作的基本视频通话应用程序,我已经搜索了大约10天以上,我已经了解了有关Android方面的一切,但我真的无法理解得到它在网络方面,信号,TURN和STUN。不幸的是,我不是一个网络人(至少现在不是),我对如何处理服务器设置非常困惑。我甚至不知道何时使用什么和为什么。让故事更短,我需要的是:

我需要一个路线图来继续进行服务器设置。 提前谢谢你。

更新: 后端已经实现,它似乎正在工作因为我没有任何问题接收语音,我也收到包含视频和音频的MediaStream,但没有显示视频。

private void gotRemoteStream(MediaStream stream) {
    //we have remote video stream. add to the renderer.
    Log.d("KingArmstring", "gotRemoteStream: 1 stream == null" + String.valueOf(stream == null));
    Log.d("KingArmstring", "the value of the received stream: " + String.valueOf(stream));
    final VideoTrack videoTrack = stream.videoTracks.get(0);
    Log.d("TAG", "gotRemoteStream: we get here");
    runOnUiThread(() -> {
        try {
            Log.d("TAG", "we get here");
            remoteRenderer = new VideoRenderer(new VideoRenderer.Callbacks() {
                @Override
                public void renderFrame(VideoRenderer.I420Frame i420Frame) {
                    Log.d("TAG", "renderFrame: we get here");
                }
            });
            remoteVideoView.setVisibility(View.VISIBLE);
            videoTrack.addRenderer(remoteRenderer);
        } catch (Exception e) {
            e.printStackTrace();
        }
    });

}

2 个答案:

答案 0 :(得分:3)

我在Android和网络上玩过webRTC。在这些项目的帮助下,我能够创建自己的项目:

我建议运行这些项目。成功完成后,您可以尝试更改代码以满足您的需求。现在我将解释有关TURN和STUN的一些细节。

  1. STUN - 这是一种了解你真正的ip的方法。如果您使用带有wifi的手机,那么您将拥有如下信息:192.168.1.14。这是内部ip。你真正的ip是别的东西。你需要像google这样的服务器来告诉你你真正的ip是什么。尝试在谷歌搜索中输入什么是我的IP,你会发现它与你在ifconfig中看到的不同。
  2. TURN - 这是语音/视频数据流的中继。由于某些原因,一些蜂窝载波切断语音/视频数据会发生什么,你可以做的就是使用TURN,你将数据发送到TURN并将其转移到另一侧。
  3. 信令 - 这是一方呼叫另一方的方式。假设你有两个想要通信的人,他们需要一种在呼叫开始前发送通信数据的方法。 webRTC没有给你一个机制。它给你一个json,你需要一个人把它发送给第二个人。我提供的链接使用socket.io,但还有其他实现,如FCM。旅行的数据是第一个人,他想要使用的密码,以及类似的东西。第二个人需要发送接受响应并开始语音通话。

答案 1 :(得分:3)

我终于想到了这个问题,多亏了Uriel cuz,他的回答帮助了我很多,我的答案不能单独表达,只能添加到他的答案中。您可以看到remoteRenderer已经以这种方式初始化:

remoteRenderer = new VideoRenderer(new VideoRenderer.Callbacks() {
            @Override
            public void renderFrame(VideoRenderer.I420Frame i420Frame) {
                Log.d("TAG", "renderFrame: we get here");
            }
        });

(我在我的qustion中的UPDATE中添加了它)

而不是我们应该这样初始化它:

remoteRenderer = new VideoRenderer(remoteVideoView);

当我完成应用程序的这一部分时,我将尝试为此webRTC部分添加一个git repo,以便任何人都可以利用它的任何部分。