Chương 16 : Sử dụng UPDATE request thực hiện WEBCAM
Trong phần này, chúng ta sử dụng UPDATE để thực hiện tính năng webcam trong khi 2 peer đang thực hiện voice chat.
I. Tìm hiểu UPDATE request:
Nếu
trước đó bạn đã gởi 1 INVITE request dính kèm SDP yêu cầu thực hiện
tính năng voice. Sau đó, bạn muốn cập nhật lại SDP này để thực hiện thêm
tính năng video. Để làm điều này, bạn thực hiện như sau : bạn sử dụng
DIALOG (được tạo ra từ INVITE trước đó) tạo ra 1 UPDATE request và
dính kèm SDP mới được cập nhật.
“Tính năng của UPDATE đuuợc sử dụng để chỉnh sửa hay bổ sung các thông số của 1 INVITE đang tồn tại trước đó”.
Ví dụ : - SDP trước đó có thông số kỹ thuật về audio và video như sau:
m=audio 42000 RTP/AVP 0
m=video 0 RTP/AVP 0
(port dành cho video là 0, tức là tính năng video không thực hiện)
(port dành cho video là 0, tức là tính năng video không thực hiện)
- Sử dụng UPDATE để thay đổi port dành cho video, để thực hiện tính năng video, nên SDP mới sẽ được thay đổi như sau:
m=audio 42000 RTP/AVP 0
m=video 52000 RTP/AVP 0
II. Cách hoạt động VIDEO trong HelloPhone :
UPDATE
request chỉ được sử dụng khi tồn tại 1 DIALOG. Do đó, bắt buộc 2 peer
phải thực hiện voice chat trước tiên, rồi mới sử dụng UPDATE để cập nhật
video port và video format trong SDPOffer và SDPAnswer.
Trong
giao diện của HelloPhone, chúng ta đặt thêm 1 button VIDEO để thực hiện
tính năng video chat khi người dùng bấm vào button này, tính năng VIDEO
được xử lý như sau :
* Trường hợp 1 : chưa tồn tại ACK request
- Nếu chưa tồn tại ACK request, nghĩa là chưa tồn tại DIALOG, tính năng VIDEO không được thực hiện.
* Trường hợp 2 : đã khởi tạo RTP Session
-
Nếu cả hai UA đã khởi tạo thành công RTP Session trước đó, thì chỉ cần
bắt đầu và gởi video stream khi người dùng bấm vào button VIDEO.
* Trường hợp 3 : khác hai trường hợp trên
-
1 UPDATE request được tạo ra để cập nhật lại video port và video format
trong SDPOffer nếu là UAC, ngược lại là SDPAnswer nếu là UAS. Thông tin
này được dính kèm trong request dưới dạng SDP.
- UA gởi UPDATE mà không cần thông qua proxy server.
- UA nhận được UPDATE sẽ hiển thị hộp thoại thông báo "UA want to chat webcam! "
+
Nếu đồng ý, UA tạo ra 200 OK response và dính kèm SDP chứa thông tin
video port và video format của chính mình và đồng thời khởi tạo RTP
Session.
Lưu ý: chỉ khởi tạo RTP Session để nhận được video stream từ phía người gởi mà thôi.
+ Nếu không đồng ý, UA tạo ra "406 Not Acceptable" response.
-
Nếu UA nhận được 200 OK response, sẽ khởi tạo RTP Session, đồng thời
bắt đầu gởi video stream từ webcam đến người nhận. Ngược lại, UA nhận
được "406 Not Acceptable" response.
-
Người nhận cũng có thể gởi video stream bằng cách bấm vào button VIDEO.
Lúc này, HelloPhone gởi đi video stream mà không phải khởi tạo RTP
Session vì đã được thực hiện trước đó rồi.
III. Giao diện dành cho HelloPhone – class HelloPhoneListener :
Chúng
ta bổ sung button VIDEO để thực hiện tính năng video chat, còn button
YES trước đó được đổi tên thành VOICE để phân biệt với tính năng video,
code trước đó dành cho button VOICE vẫn giữ nguyên.
- Khi người dùng bấm vào button VIDEO thì gọi đến phương thức sendUpdate() của class HelloPhoneListener:
- Để chuẩn bị cho tính năng video : chúng ta bổ sung như sau :
+ Tạo class VideoTool
: tương tự như VoiceTool, nó tạo ra sự trao đổi video giữ 2 peer thông
qua mạng. Chỉ khác là VideoTool, sử dụng thêm 1 Frame để hiển thị video
trên đó.
+ Cập nhật class SDPInfo : bổ sung thêm 2 biến videoPort và videoFormat.
+ Cập nhật class SdpTool : bổ sung thêm đối tượng MediaDescription để miêu tả video. (những phần in đậm là những đoạn code được bổ sung vào SdpTool)
III. Bổ sung code trong class HelloPhoneListener:
- Tạo 2 đối tượng của VideoTool class làm biến toàn cục:
- Sử dụng biến isInitVideo kiểu boolean, cho biết UA đã khởi tạo RTP Session hay chưa. Nếu chưa, isInitVideo = false, ngược lại isInitVideo = true
- Trong hàm dựng HelloPhoneListener(…), chúng ta khởi tạo 2 đối tượng Video
* Quá trình bắt đầu thực hiện video chat giữa 2 peer :
- Bắt đầu từ UA bấm vào button VIDEO. Hành động này được thực hiện trong phương thức sendUpdate() :
- UA khác sẽ nhận và xử lý UPDATE request trong phương thức processRequest() :
- UA đã gởi UPDATE sẽ nhận được response phản hồi và xử lý chúng trong phương thức processResponse() :
IV: Chạy chương trình :
Tương tự như chương 15.
Lưu ý :
JMF chưa hổ trợ tính năng video cho win 64bit, nhưng mình đang xài win7
64bit, nên đoạn code về video của phần này chưa thật chạy tốt trên máy
mình. Mình chỉ muốn bổ sung phần video bởi yêu cầu của nhiều bạn. Nếu bị
lỗi, các bạn cho mình biết để mình cập nhật lại code. Chúc các bạn vui
khỏe và hạnh phúc.
Download code tại :
http://www.mediafire.com/download/4y9j2g22bji2kcj/HelloPhone_JAINSIP.rar
Không có nhận xét nào:
Đăng nhận xét