
Rust VoIP - Janus Media Server #21: Sip To App - Debug RTP Media
Chào mừng bạn đến với Bài 21 của khóa học: "Lập trình VoIP với Rust: Janus Media Server".
1. Ở bài trước, chúng ta đã hoàn thành toàn bộ signaling flow cho cuộc gọi SIP-to-App. Tuy nhiên, thực tế hệ thống vẫn chưa có âm thanh hai chiều giữa:
📞 SIP Phone
↔ Janus Media Server
↔ WebRTC Browser
Đây là một vấn đề cực kỳ phổ biến trong VoIP:
→ Signaling hoạt động
→ SIP call connect thành công
→ Nhưng media (RTP) lại không truyền được.
Trong video này, chúng ta sẽ đi sâu vào kỹ thuật debug RTP/media chuyên nghiệp để tìm ra nguyên nhân gốc rễ của lỗi mất tiếng và xử lý triệt để bằng:
• TCPDump
• Wireshark
• RTPEngine
• SDP Rewrite
2. Debug RTP với TCPDump & Wireshark
→ Capture packet trực tiếp trên server bằng:
• TCPDump
→ Phân tích SIP/SDP bằng:
• Wireshark
📌 Kiểm tra:
• INVITE SDP
• 200 OK SDP
• RTP IP
• RTP Port
→ So sánh media flow giữa:
• SIP Phone
• RTPEngine
• Janus
📌 Xác định media path thực tế.
3. Phát hiện Root Cause của lỗi mất tiếng
📌 Phân tích vấn đề:
→ SDP Offer:
• Đi qua RTPEngine
→ SDP Answer:
• Trả trực tiếp về Janus RTP Port
📌 Hậu quả:
• Media flow không đối xứng
• RTP không đi qua Media Proxy
• NAT traversal thất bại
• Không có âm thanh hai chiều
📌 Đây là lỗi cực kỳ phổ biến trong production VoIP system.
4. Cấu hình Kamailio xử lý SDP Answer
→ Update:
• kamailio.cfg
→ Xử lý SIP response có SDP bằng:
• rtpengine_manage()
📌 Rewrite lại:
• Origin
• Connection
• RTP Port
→ Ép toàn bộ media flow đi qua:
📌 RTPEngine Proxy
thay vì đi trực tiếp tới Janus.
📌 Mô hình media chuẩn:
📞 SIP Phone
↔ RTPEngine
↔ Janus AudioBridge
5. Verification & Testing thực tế
📞 Test cuộc gọi hai chiều:
• SIP → Browser
• Browser → SIP
📌 Kiểm tra:
• RTP packet flow
• Audio 2 chiều
• RTP port range
→ Media port sau khi rewrite nằm trong vùng:
• 30000 → 40000
📌 Xác nhận:
• RTP relay hoạt động chính xác
• NAT traversal thành công
• Audio truyền ổn định
6. 🚀 Kết quả đạt được:
→ Làm chủ kỹ thuật debug RTP/media
→ Sử dụng TCPDump & Wireshark cho VoIP
→ Hiểu sâu về SDP & RTP flow
→ Fix lỗi mất tiếng trong SIP ↔ WebRTC
→ Làm chủ RTPEngine media proxy
→ Xử lý NAT traversal trong production VoIP system
Đây là bước cực kỳ quan trọng trước khi triển khai:
• Production SIP ↔ WebRTC system
• App-to-SIP flow
• RTP optimization
• Large-scale VoIP architecture
Bài học liên quan
Xem khóa học
Rust VoIP - Janus Media Server #26: App To Sip: Talking State & End State
Trong bài học này, chúng ta sẽ hoàn thiện những bước cuối cùng của luồng gọi App-to-SIP với Rust và Janus Media Server. Sau khi đã kết nối thành công từ WebRTC Browser đến SIP Phone ở bài trước, video hôm nay sẽ tập trung vào việc triển khai Talking State và End State để quản lý toàn bộ vòng đời cuộc gọi VoIP từ khi bắt đầu đàm thoại đến lúc giải phóng tài nguyên hoàn toàn. Bạn sẽ học cách xử lý SIP 200 OK, quản lý SIP Dialog, xử lý sự kiện kết thúc cuộc gọi từ nhiều nguồn khác nhau và cleanup tài nguyên trên Janus Media Server một cách chính xác trong hệ thống SIP ↔ WebRTC production.
Bài 26
Rust VoIP - Janus Media Server #25: App To Sip: Connect To SIP State
Trong bài học này, chúng ta sẽ thực hiện một trong những bước quan trọng nhất của luồng App-to-SIP: Trạng thái Connect to SIP. Đây là giai đoạn hệ thống Rust Server của chúng ta đóng vai trò là một SIP Client (UAC) để khởi tạo cuộc gọi đến SIP Server (Kamailio) và chuyển tiếp yêu cầu từ người dùng WebRTC ra thế giới điện thoại. Bạn sẽ học cách build một bản tin SIP INVITE hoàn chỉnh, cách khai thác Janus Admin API để lấy thông tin media và cách cấu hình Kamailio để điều phối cuộc gọi đi (Outbound Call).
Bài 25
Rust VoIP - Janus Media Server #24: App To Sip: Build + Deploy + Debug App to SIP.
Trong bài học này, chúng ta sẽ tiếp tục hoàn thiện luồng App-to-SIP. Sau khi đã xử lý xong trạng thái chờ SDP từ người gọi, video hôm nay sẽ tập trung vào việc Build, Deploy và Debug thực tế để chuyển dịch sang trạng thái tiếp theo: Connect to SIP State. Bạn sẽ học cách định nghĩa cấu trúc trạng thái mới, xử lý các sự kiện bất đồng bộ từ WebSocket và Janus để đảm bảo điều kiện "webrtcup" được thỏa mãn trước khi thực hiện kết nối ra phía nhà mạng.
Bài 24
Rust VoIP - Janus Media Server #23: App To Sip: Waiting Caller SDP State
Sau khi đã xây dựng xong bộ khung cho luồng:📞 App-to-SIP, ở bài trước, hôm nay chúng ta sẽ bắt đầu hiện thực hóa state đầu tiên của outbound calling flow: → Waiting Caller SDP State. Đây là giai đoạn quan trọng để thiết lập media path từ WebRTC Browser trước khi hệ thống thực hiện cuộc gọi ra phía SIP/Telco.
Bài 23
Rust VoIP - Janus Media Server #22: App To Sip: Setup Call
Sau khi đã triển khai thành công các luồng gọi: App-to-App, SIP-to-App, trong bài học này, chúng ta sẽ bắt đầu xây dựng luồng ngược lại: 📞 App-to-SIP. Đây là tính năng cho phép WebRTC Browser thực hiện cuộc gọi trực tiếp tới số điện thoại SIP thông qua hệ thống Telco Simulator.
Bài 22
Rust VoIP - Janus Media Server #20: Sip To App - Talking State
Chào mừng bạn đến với Bài 20 của khóa học: "Lập trình VoIP với Rust: Janus Media Server". Sau khi đã xử lý xong các trạng thái chờ và các tình huống ngoại lệ (Edge Cases) ở bài trước, hôm nay chúng ta sẽ đi vào giai đoạn cuối cùng của luồng gọi SIP-to-App: → Talking State Đây là trạng thái đàm thoại chính thức, nơi các bản tin signaling cuối cùng được trao đổi để thiết lập luồng media hoàn chỉnh giữa: 📞 SIP Phone ↔ RTP ↔ Janus Media Server ↔ WebRTC Browser Trong video này, bạn sẽ học cách định nghĩa Talking State, build SIP 200 OK chuẩn RFC và quản lý toàn bộ signaling trong suốt thời gian cuộc gọi diễn ra.
Bài 20
Rust VoIP - Janus Media Server #19: Sip To App - End state and EDGE case
Trong bài học này, chúng ta sẽ chưa đi ngay vào trạng thái Talking mà tập trung xử lý một phần cực kỳ quan trọng trong hệ thống VoIP Production: → End State → SIP Edge Cases → Resource Cleanup → SIP Dialog Management Video sẽ hướng dẫn cách xử lý các SIP message như: • CANCEL • BYE • ACK • PRACK đồng thời đảm bảo mọi tài nguyên trên Janus Media Server được giải phóng chính xác khi cuộc gọi kết thúc. Đây là bước cực kỳ quan trọng để tránh: • Memory leak • SIP retransmission loop • Zombie session • Treo signaling • Room/Handle không được cleanup
Bài 19
Rust VoIP - Janus Media Server #18: Sip To App - Connect to Agent
Sau khi đã hoàn thành việc đưa SIP Member vào phòng họp ở bài trước, hôm nay chúng ta sẽ thực hiện bước tiếp theo trong luồng SIP-to-App: → Kết nối với WebRTC Client (Agent) Mặc dù logic này có nhiều điểm tương đồng với cuộc gọi App-to-App, nhưng việc tích hợp vào luồng SIP đòi hỏi sự quản lý chặt chẽ hơn về: • WebSocket Events • Janus Events • State Machine • SDP Signaling Video này sẽ hướng dẫn cách gửi thông báo cuộc gọi, xử lý phản hồi từ trình duyệt và hoàn tất quá trình bắt tay WebRTC để chuẩn bị bước sang Talking State.
Bài 18
Rust VoIP - Janus Media Server #17: Sip To App - Join SIP Member State: Finish
Trong bài học này, chúng ta sẽ đi đến những bước cuối cùng để hoàn thiện trạng thái: → Join SIP Member To Room Đây là giai đoạn cực kỳ quan trọng, nơi chúng ta thực hiện việc "đấu nối" thực tế luồng Media giữa: 📞 SIP Phone ↔ RTPEngine ↔ Janus Media Server Video tập trung vào cách sử dụng Janus Admin API để lấy RTP information thực tế, xây dựng SDP Answer chuẩn SIP và thiết lập Early Media trước khi kết nối tới WebRTC Client.
Bài 17Hiển thị 9 / 25 bài học