对于视频聊天,首先需要访问用户的音频和视频。
在web上,有getUserMedia API。调用此API,它会为您提供MediaStream对象,用于来自摄像头和麦克风的音频和视频。
下面是代码的实际应用。调用getUserMedia(),然后得到媒体流。
navigator.getUserMedia(constraints, onStream);
function onStream(localStream)
{
// do something with stream
}
Android上的等价的是VideoCapturer。 这涉及更多工作,但你基本上创建一个捕获器,然后使用它来创建一个轨道,最后将其放入MediaStream。
VideoCapturer c = VideoCapturer.create(device);
PeerConnectionFactory factory = new PeerConnectionFactory();
MediaStream localStream = factory.createLocalMediaStream(streamName);
VideoSource s = factory.createVideoSource(c, constraints);
VideoTrack t = factory.createVideoTrack(trackName, s);
localStream.addTrack(t);
一旦我们从摄像头和麦克风获得MediaStreams,我们需要建立一个网络连接来在用户之间传输流 - 从一个对等端到另一个对等端。
要在web上执行此操作,我们有RTCPeerConnection,用于音频和视频通信的JavaScript API。这是WebRTC的核心。 PeerConnection API做了很多! 信号处理,编解码处理,点对点通信,安全性,带宽管理…
下面是RTCPeerConnection的实际应用。onaddstream允许对等体处理传入的流。 addStream()使对等体能够发送MediaStream。PeerConnection还使对等体能够找到发送媒体的方式和位置。然后可以通过消息传递机制共享该信息,从而调用信令信道。
pc = new RTCPeerConnection(config);
pc.onaddstream = onRemoteStream;pc.addStream(localStream);
pc.createOffer(onCreateSuccess);
function onCreateSuccess(offer) { sendMessage(offer); }
在Android上,等效的API是PeerConnection。 在这里,我们使用观察者模式而不是直接传递回调。
PeerConnection pc =
factory.createPeerConnection(iceServers, constraints, observer);
pc.addStream(localStream);
pc.createOffer(this, offerConstraints);
public void onCreateSuccess(
final SessionDescription offer) { sendMessage(offer); }
因此,一旦我们在对等实体之间共享音频和视频,我们就需要显示它。
在Web上,我们可以使用createObjectURL()方法将MediaStream直接流式传输到视频元素。
在Android上,我们通过观察者得到通知,然后我们可以将流连接到基于OpenGL的渲染器。
public void onAddStream(final MediaStream stream) {
VideoTrack track = stream.getVideoTracks(0);
YuvImageRenderer renderer = remoteRenderer;
track.addRenderer(new VideoRenderer(renderer));}