Giả sử là ta bỏ qua các bước xác thực, tập trung vào khung thiết kế ứng dụng.
Vấn đề đặt ra là khi vào một phòng họp truyền hình trực tuyến làm thế nào để tất cả những người tham gia kết nối video được với nhau mà mỗi người chỉ gọi 1 lần (nghĩa là 2 người không bị gọi lặp nhau 2 lần).

video_chat_webrtc

Khi làm việc với WebRTC, có rất nhiều thư viện hỗ trợ bạn thiết kế ứng dụng gọi truyền hình hội nghị trực tuyến. Một trong số đó là EasyRTC, rất mạnh và API dễ dàng sử dụng để thiết kế một ứng dụng như vậy.

Thay vì thiết kế tập trung vào gọi một người mới khi tham gia, ta thiết kế ngược lại, để người mới tham gia sẽ gọi tất cả những người có mặt trong phòng họp trực tuyến. Theo cách này, bạn có thiết kế như sau:

1. X join vào phòng R
2. Y join vào phòng R

  • 1. danh sách người tham gia cập nhật cho X
  • 2. Y thực hiện gọi video cho X

3. Z join vào phòng R

  • 1. danh sách người tham gia cập nhật cho X và Y
  • 2. Z thực hiện gọi cho X
  • 3. Z thực hiện gọi cho Y

Và cứ tiếp tục như thế: Với cách thiết kế này thì tất cả mọi người có thể gọi được cho nhau.
Nhưng do giao diện ứng dụng được thiết kế là như nhau cho tất cả người tham gia, bạn phải có cách nào đây để biết được đâu là người mới khi gia nhập vào phòng.

Với EasyRTC API có 2 sự kiện lắng nghe và được thực thi theo thứ tự là:

  • RoomEntry Listener
  • RoomOccupant Listener

Đối với mỗi người đã tham gia vào phòng, sự kiện nghe RoomEntry Listener chỉ được gọi 1 lần. Nghĩa là, khi mới vào phòng bạn sẽ nhận được một danh sách những người tham gia đang có mặt trong phòng. Và bạn phải gọi cho người có mặt trong phòng và chờ họ trả lời. Sau thời điểm này bạn sẽ không phải gọi cho bất kì ai nữa, và người mới sẽ gọi cho bạn khi vào phòng!

Giải pháp thực hiện với EasyRTC API được thực hiện như sau:

var needToCallOtherUsers;

easyrtc.setRoomEntryListener(function(entry, roomName) {
    needToCallOtherUsers = true;
});

easyrtc.setRoomOccupantListener(function(roomName, userList, selfInfo) {
    var easyrtcid;
    if (needToCallOtherUsers) {
        for (easyrtcid in userList) {
            easyrtc.call(
                easyrtcid,
                function success(otherCaller, mediaType) {
                    console.log('success: ', otherCaller, mediaType);
                },
                function failure(errorCode, errorMessage) {
                    console.log('failure: ', errorCode, errorMessage);
                }
            );
        }
        needToCallOtherUsers = false;
    }
});

Một vài ứng dụng tôi đã thử nghiệm, các bạn có thể tham khảo:

About The Author

  • Nguyễn Tuấn Hưng

    có bộ thự viện nào hỗ trợ cho android không vậy anh?

  • vicky

    Hay quá, nếu có một demo code để mọi người hiểu cụ thể và dễ hình dung hơn thì tuyệt vời. Thk Admin

    • Đây là tư tưởng thiết kế phòng họp khi có nhiều người tham gia. Còn demo code thì các bạn có thể tham khảo bài lab này 😀 http://bit.ly/1RyLtnG