[{"data":1,"prerenderedAt":634},["ShallowReactive",2],{"course-rust-voip-kurento-media-server":3,"courses-list":22},{"slug":4,"title":5,"shortDescription":6,"description":7,"category":8,"level":9,"totalDuration":10,"totalLessons":11,"tags":12,"createdAt":13,"updatedAt":13,"rating":14,"reviewCount":15,"thumbnail":16,"instructor":17,"lessons":21},"rust-voip-kurento-media-server","Rust VoIP: Kurento Media Server","Khóa học này hướng dẫn bạn xây dựng hệ thống WebRTC Media Server chuyên sâu với Kurento Media Server\n và Rust Programming Language để tạo các ứng dụng realtime communication, SIP gateway và media processing ở mức low-level. Kurento là một media server mạnh mẽ hỗ trợ WebRTC, RTP, recording, transcoding, media routing và tích hợp OpenCV cho xử lý video realtime.","Khóa học này giúp bạn hiểu sâu cách hoạt động của một WebRTC Media Server thực thụ bằng cách sử dụng Kurento Media Server\n kết hợp với Rust Programming Language để xây dựng các hệ thống realtime communication, SIP gateway và media processing chuyên nghiệp.\n\nKhác với các nền tảng abstraction cao như LiveKit hay Twilio, Kurento cho phép bạn kiểm soát media flow ở mức rất sâu:\n\nRTP packet\nSDP negotiation\nMedia pipeline\nTranscoding\nRecording\nMedia filtering\nRouting\nMixing\nComputer Vision processing\n\nKurento là một Open Source WebRTC media server được xây dựng trên GStreamer, hỗ trợ:\n\nWebRTC\nRTP\nRTSP\nHTTP streaming\nRecording\nMixing\nTranscoding\nMCU\u002FSFU functionality\nOpenCV integration\n\nTrong khóa học này, bạn sẽ không chỉ “dùng API”, mà sẽ hiểu cách media server hoạt động thực sự phía bên dưới.\n\nBạn sẽ hiểu:\n\nVì sao cần media server\nPeer-to-peer limitations\nSFU vs MCU\nRTP routing\nCodec adaptation\nICE negotiation\nNAT traversal\nTURN\u002FSTUN\nSIP interoperability\nWebRTC media flow\n\nKhóa học bắt đầu bằng việc giải thích nền tảng WebRTC:\n\nOffer\u002FAnswer\nSDP\nICE Candidate\nRTP\nSRTP\nDTLS\nNAT traversal\nMedia transport\n\nSau đó bạn sẽ học kiến trúc của Kurento:\n\nMedia Pipeline\nMedia Element\nWebRtcEndpoint\nRtpEndpoint\nPlayerEndpoint\nRecorderEndpoint\nComposite\nHub\nDispatcher\n\nKurento được thiết kế theo mô hình modular pipeline, nơi media được xử lý bằng cách kết nối các component với nhau giống Lego blocks.\n\nBạn sẽ học cách:\n\nTạo media pipeline\nKết nối media element\nPublish\u002Fsubscribe media\nRoute media stream\nRecord media\nMix audio\u002Fvideo\nBroadcast stream\nHandle multiple participants\n1. Call App ↔ App\n\nBạn sẽ xây dựng hệ thống gọi điện realtime giữa:\n\nBrowser ↔ Browser\nMobile ↔ Browser\nDesktop ↔ Browser\n\nBao gồm:\n\nAudio Call\nVideo Call\nScreen Sharing\nRecording\nMulti-user room\nGroup call\nBroadcasting\n\nQuan trọng hơn, bạn sẽ hiểu:\n\nMedia flow bên trong media server\nRTP packet routing\nWebRTC endpoint hoạt động thế nào\nSFU forwarding\nMedia synchronization\nCodec transcoding\n\nBạn cũng sẽ tự xây signaling server bằng Rust:\n\nWebSocket signaling\nSDP exchange\nICE candidate exchange\nRoom management\nParticipant state\nSession lifecycle\n\nRust sẽ được sử dụng để xây:\n\nHigh-performance signaling server\nRealtime event handling\nAsync networking với Tokio\nSIP bridge service\nGateway service\n2. Call SIP → App\n\nĐây là phần cực kỳ quan trọng nếu bạn muốn làm VoIP hoặc AI Telephony.\n\nBạn sẽ học cách:\n\nNhận SIP INVITE\nParse SDP\nBridge SIP RTP vào WebRTC\nKết nối SIP phone với browser\nRoute media từ PSTN vào app\n\nFlow thực tế:\n\nSIP Phone gọi vào server\nSIP server gửi RTP\nKurento tạo RtpEndpoint\nBridge sang WebRtcEndpoint\nBrowser nhận audio\u002Fvideo realtime\n\nBạn sẽ hiểu sâu:\n\nSIP signaling\nINVITE\u002FACK\u002FBYE\nRTP media transport\nCodec negotiation\nG711\nOPUS\nH264\nDTMF\nSIP trunk\n\nKhóa học sẽ hướng dẫn cách kết nối:\n\nFreeSWITCH\nKamailio\nAsterisk\nSIP provider\nPSTN gateway\n\nSau phần này, bạn có thể tự xây:\n\nSIP Gateway\nAI Phone Bot\nAI Call Center\nPBX integration\nTelecom platform\n3. Call App → SIP\n\nChiều ngược lại cũng rất quan trọng:\n\nTừ browser gọi ra số điện thoại SIP\u002FPSTN.\n\nBạn sẽ học:\n\nRTP generation\nSIP dialing\nSIP registration\nOutbound calling\nSIP authentication\nRTP bridging\n\nFlow:\n\nUser click Call trên Web App\nRust backend gửi signaling\nKurento tạo media pipeline\nSIP gateway gửi INVITE\nRTP bridge WebRTC ↔ SIP\nĐiện thoại nhận cuộc gọi\n\nĐây là nền tảng để xây:\n\nSoftphone\nBrowser Phone\nCRM Calling\nAI Outbound Calling\nClick-to-call system\n4. Advanced Media Processing\n\nĐiểm mạnh lớn nhất của Kurento là media processing.\n\nBạn sẽ học:\n\nRecording stream\nMedia transcoding\nMedia mixing\nBroadcasting\nRTP forwarding\nRTSP integration\nIP Camera integration\n\nKurento hỗ trợ:\n\nRTSP camera\nRTP stream\nHTTP stream\nRecording MP4\u002FWebM\nTranscoding codec realtime\n\nNgoài ra:\n\nOpenCV integration\nFace recognition\nObject tracking\nAugmented reality\nVideo filtering\n\nĐây là phần cực kỳ hữu ích cho:\n\nAI Vision\nSmart Camera\nSurveillance system\nVideo analytics\nAI streaming platform\n5. Production Architecture\n\nKhóa học cũng đi sâu vào production deployment.\n\nBạn sẽ học:\n\nDocker deployment\nTURN\u002FSTUN setup\nNAT traversal\nTLS\u002FHTTPS\nScaling signaling server\nMonitoring\nRTP debugging\nWebRTC internals\nPerformance tuning\n\nBạn cũng sẽ hiểu:\n\nVì sao media server tốn CPU\nBottleneck của transcoding\nScaling challenge của MCU\u002FSFU\nRTP optimization\nMulti-node architecture\n\nKurento mạnh về khả năng media processing nhưng cần kiến trúc tốt để scale production lớn.","Backend","Advanced","5",0,"[\"kurento\",\"bytebuffer\",\"RTP\"]","2026-05-13 03:01:26",4,150,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1778641249115-63e9889f-c5f1-4ffe-9ec7-c9ff5ef677f7.png",{"name":18,"title":19,"bio":20},"ByteBuffer","Coder cỏ tại DTS Group và IPAS","Chuyên gia về Rust và hệ thống VoIP\u002FWebRTC. Nhiều năm kinh nghiệm xây dựng các hệ thống real-time communication với hiệu năng cao và độ trễ thấp.",[],[23,26,38,310,322,623],{"slug":4,"title":5,"shortDescription":6,"description":7,"category":8,"level":9,"totalDuration":10,"totalLessons":11,"tags":12,"createdAt":13,"updatedAt":13,"rating":14,"reviewCount":15,"thumbnail":16,"instructor":24,"lessons":25},{"name":18,"title":19,"bio":20},[],{"slug":27,"title":28,"shortDescription":29,"description":30,"category":8,"level":31,"totalDuration":10,"totalLessons":11,"tags":32,"createdAt":33,"updatedAt":33,"rating":14,"reviewCount":34,"thumbnail":35,"instructor":36,"lessons":37},"rust-voip-livekit-media-server","Rust VoIP: LiveKit Media Server","Khóa học này giúp bạn xây dựng hệ thống Voice\u002FVideo Call hoàn chỉnh với LiveKit\n và ngôn ngữ Rust Programming Language, tập trung vào kiến trúc realtime hiện đại dành cho VoIP, AI Voice Agent và ứng dụng WebRTC quy mô lớn.\n\nBạn sẽ học cách xây dựng từ đầu một nền tảng gọi điện realtime sử dụng LiveKit làm media server và Rust làm backend xử lý signaling, SIP routing, authentication, room management và business logic. Khóa học không chỉ dừng ở video call cơ bản mà còn đi sâu vào tích hợp SIP Telephony để kết nối giữa WebRTC và hệ thống điện thoại truyền thống.","Khóa học này hướng dẫn bạn xây dựng một hệ thống realtime communication hoàn chỉnh bằng LiveKit\n kết hợp với Rust Programming Language — một trong những stack hiện đại và mạnh mẽ nhất hiện nay dành cho Voice AI, WebRTC và SIP Telephony.\n\nTrong nhiều năm, việc xây dựng hệ thống gọi điện realtime thường phụ thuộc vào các nền tảng phức tạp như Asterisk, FreeSWITCH hoặc các giải pháp C\u002FC++ khó mở rộng và khó maintain. Với sự phát triển của WebRTC và LiveKit, việc xây dựng hệ thống voice\u002Fvideo realtime đã trở nên linh hoạt hơn rất nhiều. LiveKit cung cấp SFU media server hiện đại cùng hệ sinh thái SDK mạnh mẽ, hỗ trợ voice, video, screen sharing, AI Agents và SIP Telephony.\n\nTrong khóa học này, bạn sẽ không chỉ học cách “gọi video” đơn giản, mà sẽ hiểu cách xây dựng toàn bộ kiến trúc realtime communication thực tế để deploy production.\n\nBạn sẽ bắt đầu bằng việc tìm hiểu:\n\nWebRTC hoạt động như thế nào\nSFU là gì\nMedia flow giữa browser và server\nRTP\u002FSRTP\nICE, STUN, TURN\nSignaling architecture\nSIP và PSTN hoạt động ra sao\nLiveKit bridge SIP ↔ WebRTC như thế nào\n\nSau phần nền tảng, khóa học sẽ đi vào xây dựng backend bằng Rust với kiến trúc async hiệu năng cao sử dụng Tokio. Bạn sẽ học cách:\n\nTạo API backend cho LiveKit\nGenerate JWT token\nQuản lý room\nQuản lý participant\nDispatch user vào room\nXây signaling service riêng\nTheo dõi trạng thái cuộc gọi realtime\nScale realtime system\n\nRust được lựa chọn vì khả năng:\n\nHiệu năng cao\nMemory-safe\nAsync concurrency mạnh\nPhù hợp cho realtime networking\nTriển khai production ổn định\n\nĐây là stack rất phù hợp để xây:\n\nVoice AI\nCall Center\nCustomer Support Platform\nTelephony Gateway\nOmnichannel Communication\nSIP\u002FWebRTC Gateway\nAI Calling Platform\n\nMột phần quan trọng của khóa học là xây dựng các flow gọi điện thực tế.\n\n1. Call App ↔ App\n\nBạn sẽ học cách xây dựng hệ thống gọi giữa:\n\nBrowser ↔ Browser\nMobile ↔ Browser\nDesktop ↔ Mobile\n\nBao gồm:\n\nAudio Call\nVideo Call\nScreen Share\nRealtime Events\nParticipant Management\nRoom State\nMute\u002FUnmute\nRecording\n\nBạn cũng sẽ hiểu:\n\nMedia publish\u002Fsubscribe\nTrack management\nSFU forwarding\nLow latency optimization\n2. Call SIP → App\n\nĐây là phần rất quan trọng dành cho VoIP và Telephony.\n\nBạn sẽ học cách:\n\nNhận cuộc gọi từ SIP trunk\nKết nối từ PSTN\u002FSIP vào LiveKit room\nDispatch SIP participant vào ứng dụng\nBridge audio từ điện thoại vào WebRTC app\n\nFlow thực tế:\n\nNgười dùng gọi số điện thoại\nSIP provider gửi INVITE vào LiveKit\nLiveKit tạo SIP participant\nRust backend xử lý routing\nAgent\u002FWeb App tham gia room\nAudio được bridge RTP ↔ WebRTC\n\nBạn sẽ học:\n\nSIP INVITE\nSDP negotiation\nCodec negotiation\nRTP flow\nSIP trunk configuration\nDispatch rule\nDTMF handling\n\nSau phần này, bạn có thể xây:\n\nTổng đài AI\nHotline support\nSIP gateway\nAI receptionist\nVirtual call center\n3. Call App → SIP\n\nKhóa học cũng hướng dẫn chiều ngược lại:\n\nTừ WebRTC App gọi ra số điện thoại SIP\u002FPSTN\n\nBạn sẽ học:\n\nOutbound SIP trunk\nDialing flow\nSIP authentication\nCaller ID\nOutbound routing\nSIP participant creation\n\nFlow:\n\nUser click Call trong app\nRust backend tạo SIP participant\nLiveKit gửi SIP INVITE tới provider\nProvider route tới PSTN\nĐiện thoại nhận cuộc gọi\n\nĐây là nền tảng để xây:\n\nSoftphone\nAI outbound calling\nAuto-call system\nTelemarketing platform\nCRM Calling System\n4. Production Architecture\n\nKhóa học không chỉ demo local mà còn tập trung vào kiến trúc production thực tế.\n\nBạn sẽ học:\n\nSelf-host LiveKit\nRedis integration\nHorizontal scaling\nMonitoring\nLogging\nSIP gateway deployment\nTURN server setup\nTLS\u002FHTTPS\nDocker deployment\nReverse proxy\nLoad balancing","Intermediate","[\"livekit\",\"bytebuffer\"]","2026-05-13 02:50:39",130,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1778640418253-386ef4a2-6cbc-42ad-80ed-3301d8d1e613.png",{"name":18,"title":19,"bio":20},[],{"slug":39,"title":40,"shortDescription":41,"description":42,"category":8,"level":31,"totalDuration":43,"totalLessons":44,"tags":45,"createdAt":46,"updatedAt":47,"rating":14,"reviewCount":48,"thumbnail":49,"instructor":50,"lessons":51},"rust-voip-janus-media-server","Rust VoIP: Janus Media Server","Chinh phục VoIP với khóa học \"Lập trình VoIP với Rust: Janus Media Server\". Bước tiếp từ nền tảng WebRTC P2P để xây dựng các hệ thống Media Server quy mô lớn, có khả năng scale thực tế và dùng trong production. Bạn sẽ làm chủ Janus Audiobridge để giải quyết triệt để các bài toán về băng thông, ghi âm tập trung và kết nối đa phương thức từ App-to-App đến SIP","Nâng tầm ứng dụng WebRTC của bạn lên quy mô Production\nNếu bạn đã hiểu cách các trình duyệt kết nối trực tiếp qua WebRTC P2P, thì đây chính là bước đi tiếp theo để đưa ứng dụng của bạn vào thực tế\n\nMô hình P2P rất tuyệt vời cho các kết nối đơn giản, nhưng khi đối mặt với các bài toán lớn hơn, nó bộc lộ 4 hạn chế nghiêm trọng:\n1. Khả năng mở rộng: Với 10 người dùng, hệ thống P2P cần tới 90 kết nối trực tiếp, khiến việc mở rộng là gần như không thể\n2. Tốn tài nguyên: Client phải upload đồng thời nhiều luồng media, gây ngốn CPU và nhanh hết pin, đặc biệt là trên thiết bị di động\n3. Không thể ghi âm tập trung: Media truyền trực tiếp giữa các peer nên không có cách nào ghi lại cuộc gọi một cách tập trung tại server\n4. Vấn đề NAT: Khoảng 15% người dùng gặp lỗi kết nối do NAT nghiêm ngặt\n\nGiải pháp đột phá với Janus Media Server\nKhóa học này sẽ hướng dẫn bạn sử dụng Janus Media Server – một thành phần trung gian mạnh mẽ để thay thế mô hình kết nối trực tiếp\n. Thay vì gửi dữ liệu cho nhau, tất cả client sẽ gửi media lên server để server xử lý và phân phối lại\nChúng ta sẽ tập trung sâu vào kiến trúc Modular của Janus, đặc biệt là Audiobridge plugin\nCơ chế Mixing: Server sẽ trộn (mix) các luồng audio lại thành một luồng duy nhất, giúp giảm đáng kể băng thông và tải cho phía người dùng\n\nKhả năng Scale: Hệ thống có thể đáp ứng hàng trăm, thậm chí hàng nghìn người dùng cùng lúc\n\nBạn sẽ học được gì?\nXuyên suốt khóa học, chúng ta sẽ cùng nhau lập trình bằng ngôn ngữ Rust để xây dựng một hệ thống hoàn chỉnh với các tính năng thực tế nhất:\n\nCall App to App: Kết nối giọng nói giữa hai ứng dụng WebRTC.\nCall App to SIP: Tích hợp gọi từ Web\u002FApp sang hệ thống tổng đài SIP truyền thống.\nCall SIP to App: Nhận cuộc gọi ngược lại từ hệ thống SIP về Web\u002FApp.\nAuto Callout: Phát triển hệ thống tự động gọi ra chuyên nghiệp.\n\nMục tiêu khóa học\nToàn bộ nội dung được thiết kế theo lộ trình từ cơ bản đến nâng cao, giúp bạn không chỉ hiểu về mặt lý thuyết mà còn có đủ kỹ năng để tự tay xây dựng một hệ thống Voice IP thực tế.","3",26,"[\"janus\",\"kamailio\",\"rtpengine\",\"b2bua\",\"rust\",\"bytebuffer\"]","2026-04-09 09:50:16","2026-05-06 15:07:02",190,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1775728211540-3d1f7ec5-ba21-4176-9aa3-ca9775e232ba.png",{"name":18,"title":19,"bio":20},[52,62,72,82,91,101,111,121,131,141,151,161,171,181,191,201,211,221,231,241,251,261,271,281,291,301],{"slug":53,"title":54,"description":55,"duration":56,"youtubeId":57,"order":58,"thumbnail":59,"createdAt":60,"updatedAt":61},"rust-voip-janus-media-server-1-gioi-thieu-khoa-hoc","Rust VoIP - Janus Media Server #1: Giới thiệu khóa học","Chào mừng các bạn đến với khóa học: Lập trình VoIP với Rust: Janus Media Server.\nSau khi đã hoàn thành series WebRTC Peer-to-Peer (P2P), chúng ta sẽ bước sang một cấp độ mới: xây dựng hệ thống VoIP thực tế có khả năng scale và chạy production bằng Media Server.\n\nTrong video mở đầu này, chúng ta sẽ cùng phân tích những hạn chế của mô hình P2P và tìm hiểu cách Janus Media Server trở thành giải pháp tối ưu cho các hệ thống Voice IP hiện đại.","3:46","Yn69fThI0Hg",1,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1777516323031-5d7bee10-a3a5-4286-bb2a-8d4d830e62f5.webp","2026-04-30 02:33:10","2026-04-30 02:33:20",{"slug":63,"title":64,"description":65,"duration":66,"youtubeId":67,"order":68,"thumbnail":69,"createdAt":70,"updatedAt":71},"rust-voip-janus-media-server-2-setup-janus-media-server","Rust VoIP - Janus Media Server #2: Setup Janus Media Server","Sau khi đã nắm vững lý thuyết về Media Server ở bài 1, trong video này chúng ta sẽ bắt đầu thực hành bằng cách cài đặt và triển khai Janus Media Server phiên bản 1.4.0 theo cách hiện đại, tối ưu và sẵn sàng cho production.","8:38","-OPBJaOqjRY",2,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1777605821094-4f4f68f8-e270-4320-ae4d-7c47dfcb49a9.jpg","2026-05-01 03:29:04","2026-05-01 03:29:33",{"slug":73,"title":74,"description":75,"duration":76,"youtubeId":77,"order":78,"thumbnail":79,"createdAt":80,"updatedAt":81},"rust-voip-janus-media-server-3-setup-codebase-config-janus","Rust VoIP - Janus Media Server #3: Setup Codebase + Config Janus","Trong video này, chúng ta sẽ bắt đầu xây dựng nền tảng codebase cho toàn bộ hệ thống VoIP. Thay vì viết lại từ đầu, chúng ta sẽ tận dụng và tối ưu lại codebase từ series WebRTC P2P trước đó, đồng thời refactor để phù hợp với mô hình Media Server sử dụng Janus.","16:14","JpzsRi8woaE",3,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1777734586801-ca933f87-d03b-438a-afd3-afccd8930252.png","2026-05-02 15:12:00","2026-05-02 15:34:42",{"slug":83,"title":84,"description":85,"duration":86,"youtubeId":87,"order":14,"thumbnail":88,"createdAt":89,"updatedAt":90},"rust-voip-janus-media-server-4-code-test-janus-api","Rust VoIP - Janus Media Server #4: Code + Test Janus API","Trong video này, chúng ta sẽ bắt đầu hiện thực hóa toàn bộ lý thuyết bằng code thực tế: từ deploy ứng dụng Rust lên server, cấu hình môi trường cho đến việc viết các service quan trọng để điều khiển Janus Media Server thông qua HTTP API và WebSocket.\n\nĐây là bước then chốt giúp bạn hiểu rõ cách Janus quản lý session, plugin và cách Rust Server có thể làm chủ hệ thống Audio Room trong thực tế.\n","29:18","LAiLHcPJuaE","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1777821272050-d30cd83d-92f2-443b-ab15-940825aa45f9.png","2026-05-03 15:16:54","2026-05-03 15:17:04",{"slug":92,"title":93,"description":94,"duration":95,"youtubeId":96,"order":97,"thumbnail":98,"createdAt":99,"updatedAt":100},"rust-voip-janus-media-server-5-call-app-to-app-setup-call","Rust VoIP - Janus Media Server #5: Call App to App - Setup Call","Trong bài học này, chúng ta sẽ bắt đầu hiện thực hóa tính năng quan trọng nhất: Cuộc gọi App-to-App (ứng dụng gọi ứng dụng). Thay vì kết nối trực tiếp P2P như trước, chúng ta sẽ để Rust Server điều phối toàn bộ quá trình thiết lập cuộc gọi thông qua Janus Media Server.\n\nVideo sẽ hướng dẫn bạn cách thiết kế cấu trúc cuộc gọi, làm việc với Janus API và xây dựng State Machine để quản lý toàn bộ lifecycle của call.","42:50","LQv_TsMxffE",5,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1777913016312-9f137fde-6b89-4edb-a8c6-624d82051c3b.png","2026-05-04 16:45:20","2026-05-04 16:45:30",{"slug":102,"title":103,"description":104,"duration":105,"youtubeId":106,"order":107,"thumbnail":108,"createdAt":109,"updatedAt":110},"rust-voip-janus-media-server-6-call-app-to-app-waiting-caller-sdp","Rust VoIP - Janus Media Server #6: Call App to App - Waiting Caller SDP","Trong bài học này, chúng ta sẽ đi sâu vào việc hiện thực hóa State Machine cho cuộc gọi App-to-App, với trọng tâm là trạng thái Waiting Caller SDP – bước quan trọng để thiết lập kết nối Media giữa Client và Janus Media Server.\n\nBạn sẽ học cách quản lý session, xử lý SDP Offer\u002FAnswer và hoàn tất quá trình handshake WebRTC giữa trình duyệt và Media Server.","45:37","x0I2XvmY3s4",6,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1777996201433-4d12daf8-15ca-4037-954a-bcf1b8909e02.png","2026-05-05 15:51:42","2026-05-05 15:51:52",{"slug":112,"title":113,"description":114,"duration":115,"youtubeId":116,"order":117,"thumbnail":118,"createdAt":119,"updatedAt":120},"rust-voip-janus-media-server-7-call-app-to-app-connect-to-callee","Rust VoIP - Janus Media Server #7: Call App to App - Connect to Callee","Trong bài học trước, chúng ta đã hoàn tất việc trao đổi SDP giữa Caller và Janus. Trong phần này, chúng ta sẽ bước sang một giai đoạn quan trọng tiếp theo: kết nối tới người nhận (Callee).\n\nĐây là bước xử lý signaling giữa Server và nhiều client, bao gồm việc gửi thông báo incoming call, nhận phản hồi từ callee và điều phối state machine tương ứng.","24:20","Njas98M9haM",7,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1778079658942-fbcfb353-2a9d-4500-bfdc-c8b39683fe74.png","2026-05-06 15:02:33","2026-05-06 15:02:44",{"slug":122,"title":123,"description":124,"duration":125,"youtubeId":126,"order":127,"thumbnail":128,"createdAt":129,"updatedAt":130},"rust-voip-janus-media-server-8-call-app-to-app-talking-state","Rust VoIP - Janus Media Server #8: Call App to App - Talking State","Hôm nay, chúng ta sẽ hoàn thiện bước cuối cùng để thiết lập một cuộc gọi App-to-App hoàn chỉnh: xử lý trạng thái Waiting Callee SDP và chuyển chính thức sang Talking State – trạng thái hai người dùng bắt đầu đàm thoại thực tế.\nVideo này sẽ giúp bạn hiểu sâu cách Rust Server phối hợp với Janus Media Server để quản lý Handle, xử lý SDP Answer và điều phối State Machine trong hệ thống VoIP production-ready.","27:43","3BQKNHshNss",8,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1778113800978-2b2a5344-e1e2-4b57-97fb-52437cad8b6d.png","2026-05-07 00:32:38","2026-05-07 00:32:45",{"slug":132,"title":133,"description":134,"duration":135,"youtubeId":136,"order":137,"thumbnail":138,"createdAt":139,"updatedAt":140},"rust-voip-janus-media-server-9-call-app-to-app-end-state-keep-alive","Rust VoIP - Janus Media Server #9: Call App to App - End State + Keep Alive","Trong bài học này, chúng ta sẽ hoàn thiện những mảnh ghép cuối cùng của luồng gọi App-to-App. Trọng tâm của video là xử lý Talking State, End State và thiết lập cơ chế Keep Alive để duy trì kết nối ổn định giữa Rust Server và Janus Media Server.\n\nViệc quản lý tài nguyên (Resource Management) là cực kỳ quan trọng trong các hệ thống Media Server. Bạn sẽ học cách giải phóng sạch sẽ Session, Handle và Room sau khi cuộc gọi kết thúc để đảm bảo hệ thống luôn hoạt động ổn định và không bị memory leak.","19:16","ZmpNseImpVo",9,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1778248694955-4d5b1236-dfcb-4266-9892-a5f1677a0ebf.png","2026-05-08 14:01:38","2026-05-08 14:01:50",{"slug":142,"title":143,"description":144,"duration":145,"youtubeId":146,"order":147,"thumbnail":148,"createdAt":149,"updatedAt":150},"rust-voip-janus-media-server-10-call-app-to-app-tong-ket","Rust VoIP - Janus Media Server #10: Call App to App - Tổng kết","Đây là bài học khép lại chương về luồng gọi App-to-App. Sau khi đã hiện thực hóa thành công toàn bộ hệ thống, hôm nay chúng ta sẽ cùng nhìn lại bức tranh tổng quan để hiểu rõ bản chất của việc kết nối qua Media Server khác biệt như thế nào so với mô hình WebRTC P2P truyền thống.\n\nVideo này sẽ giúp bạn hệ thống hóa lại toàn bộ quy trình signaling, phân tích luồng media thực tế thông qua Sequence Diagram và chuẩn bị nền tảng cho các chương nâng cao như SIP Integration.","10:29","zhnMLQ1GnW4",10,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1778301141606-20df2c2b-0ab4-4666-aad2-1fc46a814096.png","2026-05-09 04:35:32","2026-05-09 04:50:11",{"slug":152,"title":153,"description":154,"duration":155,"youtubeId":156,"order":157,"thumbnail":158,"createdAt":159,"updatedAt":160},"rust-voip-janus-media-server-11-setup-telco-simulator","Rust VoIP - Janus Media Server #11: Setup Telco Simulator","Sau khi đã hoàn thành luồng gọi App-to-App (Web ↔ Web) ở các bài trước, hôm nay chúng ta sẽ bước sang một chương hoàn toàn mới và cực kỳ quan trọng trong hệ thống VoIP thực tế: kết nối giữa Web\u002FApp (WebRTC) và Phone\u002FSIP.\n\nTrong môi trường production, việc kết nối trực tiếp tới các nhà mạng (Telco) như Viettel, Vinaphone hoặc Mobifone thường rất phức tạp, tốn kém và khó test. Vì vậy, trong video này chúng ta sẽ cùng xây dựng một hệ thống Telco Simulator bằng Kamailio + Docker để giả lập hạ tầng viễn thông thực tế.","25:09","zJHrJyoujgA",11,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1778349798865-8f7a4b58-5074-4a97-ab15-6f71fe10060e.png","2026-05-09 18:05:59","2026-05-09 18:06:07",{"slug":162,"title":163,"description":164,"duration":165,"youtubeId":166,"order":167,"thumbnail":168,"createdAt":169,"updatedAt":170},"rust-voip-janus-media-server-12-setup-sip-server-rtp-engine","Rust VoIP - Janus Media Server #12: Setup SIP server & RTP-engine","Nếu như ở bài trước chúng ta đã thiết lập Telco Simulator để phục vụ việc test, thì từ bài học này chúng ta sẽ bắt đầu xây dựng những thành phần cốt lõi của một hệ thống VoIP Production thực tế.","26:08","3ay4s5xqPuk",12,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1778506468290-f62a272b-e9c1-48b0-8ff9-8f5787f1e70b.png","2026-05-11 13:36:44","2026-05-11 13:36:52",{"slug":172,"title":173,"description":174,"duration":175,"youtubeId":176,"order":177,"thumbnail":178,"createdAt":179,"updatedAt":180},"rust-voip-janus-media-server-13-route-from-phone-to-rust-server","Rust VoIP - Janus Media Server #13: Route from Phone to Rust Server","Trong bài học này, chúng ta sẽ bắt đầu hiện thực hóa luồng kết nối từ \"thế giới bên ngoài\" vào hệ thống nội bộ.\n\nCụ thể, chúng ta sẽ cấu hình để một cuộc gọi từ điện thoại (thông qua Softphone Zoiper) có thể đi xuyên qua nhiều lớp trung gian và đi đến Rust Server của chúng ta.\n\nĐây là bước cực kỳ quan trọng để backend Rust có thể nhận diện được cuộc gọi đến và chuẩn bị tài nguyên trên Janus Media Server cho luồng SIP-to-App.","33:00","PzBPUkLoPDY",13,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1778594064646-5aeda5fd-1629-4744-8691-015e2e3991f9.png","2026-05-12 13:56:11","2026-05-12 13:56:20",{"slug":182,"title":183,"description":184,"duration":185,"youtubeId":186,"order":187,"thumbnail":188,"createdAt":189,"updatedAt":190},"rust-voip-janus-media-server-14-sip-to-app-create-call-and-define-call-state","Rust VoIP - Janus Media Server #14: Sip To App - Create Call and Define Call State","Trong bài học này, chúng ta sẽ bắt đầu hiện thực hóa luồng SIP-to-App, kết nối thế giới điện thoại truyền thống với ứng dụng WebRTC.\nTrọng tâm của video là cách xử lý bản tin SIP INVITE từ nhà mạng, khởi tạo tài nguyên trên Janus Media Server và xây dựng State Machine chuyên biệt cho luồng gọi SIP-to-App.\nBạn sẽ học cách lập trình Rust để \"hiểu\" các gói tin SIP\u002FUDP từ Kamailio và cách quản lý lifecycle của cuộc gọi.","33:30","AymBcvdDs0I",14,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1778681710629-c7ed353a-5cc1-491f-8999-5fddf03c7f38.png","2026-05-13 14:17:02","2026-05-13 14:17:12",{"slug":192,"title":193,"description":194,"duration":195,"youtubeId":196,"order":197,"thumbnail":198,"createdAt":199,"updatedAt":200},"rust-voip-janus-media-server-15-sip-to-app-join-sip-member-state","Rust VoIP - Janus Media Server #15: Sip To App - Join SIP Member State","Tiếp tục hành trình xây dựng tính năng SIP-to-App, video hôm nay sẽ dẫn dắt bạn đi sâu vào việc lập trình trạng thái đầu tiên sau khi nhận cuộc gọi: Join SIP Member To Room.\nĐây là giai đoạn cực kỳ quan trọng để \"bắt tay\" giữa giao thức SIP truyền thống và Media Server hiện đại.\nBạn sẽ học cách quản lý các bản tin SIP đang chờ xử lý (Pending Transactions), kỹ thuật bóc tách dữ liệu SDP để lấy thông tin media và cách đưa một luồng RTP trực tiếp vào phòng họp của Janus.","32:15","hTZ5PF6lskU",15,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1778811938620-8463785f-e4b5-4de5-b279-628414b63145.jpg","2026-05-15 02:27:58","2026-05-16 17:24:32",{"slug":202,"title":203,"description":204,"duration":205,"youtubeId":206,"order":207,"thumbnail":208,"createdAt":209,"updatedAt":210},"rust-voip-janus-media-server-16-sip-to-app-join-sip-member-state-sip-sdp-processing","Rust VoIP - Janus Media Server #16: Sip To App - Join SIP Member State: SIP SDP Processing","Trong bài học này, chúng ta sẽ đi sâu vào một trong những phần khó và quan trọng nhất của hệ thống VoIP thực tế:\n→ Điều phối luồng Media giữa:\n• SIP Phone\n• RTPEngine\n• Janus Media Server\nVideo tập trung vào cách tích hợp RTPEngine với Kamailio, xử lý các vấn đề NAT\u002FLocal IP và sử dụng Janus Admin API để lấy thông tin RTP thực tế phục vụ cho SIP-to-App flow.\nĐây là bước cực kỳ quan trọng trước khi chúng ta xây dựng SDP Answer hoàn chỉnh để kết nối media giữa Phone và WebRTC Client.","45:32","mjjyMDtdDCo",16,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1778850470687-823a7c4f-46f3-4ea9-a506-f16be9c36f20.jpg","2026-05-15 13:11:02","2026-05-16 17:24:57",{"slug":212,"title":213,"description":214,"duration":215,"youtubeId":216,"order":217,"thumbnail":218,"createdAt":219,"updatedAt":220},"rust-voip-janus-media-server-17-sip-to-app-join-sip-member-state-finish","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:\n\n→ Join SIP Member To Room\n\nĐâ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:\n\n📞 SIP Phone\n↔ RTPEngine\n↔ Janus Media Server\n\nVideo 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.","30:37","gHeivJ6qqwA",17,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1778952995672-add35f45-001b-4f51-b49d-eb15e221cf10.png","2026-05-16 17:39:24","2026-05-16 17:39:34",{"slug":222,"title":223,"description":224,"duration":225,"youtubeId":226,"order":227,"thumbnail":228,"createdAt":229,"updatedAt":230},"rust-voip-janus-media-server-18-sip-to-app-connect-to-agent","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:\n\n→ Kết nối với WebRTC Client (Agent)\n\nMặ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ề:\n\n• WebSocket Events\n• Janus Events\n• State Machine\n• SDP Signaling\n\nVideo 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.","24:49","49TTx-lZ5rw",18,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1779030645122-3b6972ed-0a86-49f3-8049-070f5276413b.png","2026-05-17 15:12:29","2026-05-17 15:12:41",{"slug":232,"title":233,"description":234,"duration":235,"youtubeId":236,"order":237,"thumbnail":238,"createdAt":239,"updatedAt":240},"rust-voip-janus-media-server-19-sip-to-app-end-state-and-edge-case","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:\n→ End State\n→ SIP Edge Cases\n→ Resource Cleanup\n→ SIP Dialog Management\n\nVideo sẽ hướng dẫn cách xử lý các SIP message như:\n• CANCEL\n• BYE\n• ACK\n• PRACK\nđồ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.\n\nĐây là bước cực kỳ quan trọng để tránh:\n• Memory leak\n• SIP retransmission loop\n• Zombie session\n• Treo signaling\n• Room\u002FHandle không được cleanup","27:42","U6w6css4QXM",19,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1779108882667-ac46f71e-10e9-4c2f-9178-915f30b222e3.png","2026-05-18 12:56:43","2026-05-18 12:56:55",{"slug":242,"title":243,"description":244,"duration":245,"youtubeId":246,"order":247,"thumbnail":248,"createdAt":249,"updatedAt":250},"rust-voip-janus-media-server-20-sip-to-app-talking-state","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\".\n\nSau 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:\n\n→ Talking State\n\nĐâ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:\n\n📞 SIP Phone\n↔ RTP\n↔ Janus Media Server\n↔ WebRTC Browser\n\nTrong 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.","19:07","_lodSSKa7-c",20,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1779202016573-aef84b9b-e887-4063-bdc8-26f2404e6a61.png","2026-05-19 14:48:54","2026-05-19 14:49:08",{"slug":252,"title":253,"description":254,"duration":255,"youtubeId":256,"order":257,"thumbnail":258,"createdAt":259,"updatedAt":260},"rust-voip-janus-media-server-21-sip-to-app-debug-rtp-media","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\".","13:39","QZra2Xi8-EE",21,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1779300155714-89fafa47-3a66-488f-830d-cb62d5ec7838.png","2026-05-20 18:05:57","2026-05-20 18:06:07",{"slug":262,"title":263,"description":264,"duration":265,"youtubeId":266,"order":267,"thumbnail":268,"createdAt":269,"updatedAt":270},"rust-voip-janus-media-server-22-app-to-sip-setup-call","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.\n\n","24:42","eGdvnoDsC98",22,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1779374627371-6af0878c-d12d-48f4-b06c-e36bc6722549.png","2026-05-21 14:46:13","2026-05-21 14:46:38",{"slug":272,"title":273,"description":274,"duration":275,"youtubeId":276,"order":277,"thumbnail":278,"createdAt":279,"updatedAt":280},"rust-voip-janus-media-server-23-app-to-sip-waiting-caller-sdp-state","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\u002FTelco.","30:51","xl8G5x-fKuk",23,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1779410950781-23b55e4e-1f61-46f3-91d0-d7614510bc18.png","2026-05-22 00:52:02","2026-05-22 00:52:18",{"slug":282,"title":283,"description":284,"duration":285,"youtubeId":286,"order":287,"thumbnail":288,"createdAt":289,"updatedAt":290},"rust-voip-janus-media-server-24-app-to-sip-build-deploy-debug-app-to-sip","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.\nBạ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.","16:01","N0gBEN7EFBk",24,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1779553941282-ec512ecb-df02-4966-8f03-a8f296bc2924.jpg","2026-05-23 16:34:15","2026-05-23 16:34:26",{"slug":292,"title":293,"description":294,"duration":295,"youtubeId":296,"order":297,"thumbnail":298,"createdAt":299,"updatedAt":300},"rust-voip-janus-media-server-25-app-to-sip-connect-to-sip-state","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.\nBạ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).","1:09:22","LKVQf2YkFu8",25,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1779585256004-d60691a7-84c4-4526-80dd-7624ac8ab253.png","2026-05-24 01:15:58","2026-05-24 01:16:11",{"slug":302,"title":303,"description":304,"duration":305,"youtubeId":306,"order":44,"thumbnail":307,"createdAt":308,"updatedAt":309},"rust-voip-janus-media-server-26-app-to-sip-talking-state-end-state","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.\n\nBạ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.","24:51","UCAX2geC8dU","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1779754548269-71f33830-4a77-4580-9fe2-27cb449c315c.png","2026-05-26 00:17:12","2026-05-26 00:17:21",{"slug":311,"title":312,"shortDescription":313,"description":314,"category":8,"level":9,"totalDuration":315,"totalLessons":11,"tags":316,"createdAt":317,"updatedAt":318,"rating":11,"reviewCount":11,"thumbnail":319,"instructor":320,"lessons":321},"rust-voip-freeswitch-media-server","Rust VoIP: Freeswitch Media Server","Khám phá sức mạnh của FreeSWITCH trong việc xây dựng hệ thống VoIP production-ready. Từ nền tảng WebRTC P2P, bạn sẽ tiến tới kiến trúc Media Server có khả năng scale lớn, xử lý hàng nghìn cuộc gọi đồng thời.","FreeSWITCH mang lại những tính năng mạnh mẽ:\n\n1. Xử lý SIP call linh hoạt (inbound\u002Foutbound, gateway, trunking)\n2. Hỗ trợ codec đa dạng (Opus, G.711, G.729…)\n3. Conference (multi-party call) với khả năng scale cao\n4. IVR (Interactive Voice Response) tùy biến bằng XML\u002FLua\n5. Ghi âm cuộc gọi (call recording) và media processing\n6. Event Socket (ESL) cho phép control realtime từ backend (Rust, Java…)\n7. Tích hợp WebRTC ↔ SIP bridge\n8. Load balancing & clustering cho hệ thống lớn\n\nPhù hợp để xây dựng các hệ thống như call center, voice app, hoặc bridge giữa WebRTC và hạ tầng viễn thông truyền thống.","4","[\"freeswitch\",\"rust\",\"bytebuffer\"]","2026-04-11 13:07:47","2026-04-11 13:07:57","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1775912828865-ef7f2462-4ba9-4256-b115-8ee175030134.png",{"name":18,"title":19,"bio":20},[],{"slug":323,"title":324,"shortDescription":325,"description":326,"category":8,"level":31,"totalDuration":327,"totalLessons":328,"tags":329,"createdAt":330,"updatedAt":331,"rating":332,"reviewCount":333,"thumbnail":334,"instructor":335,"lessons":336},"rust-webrtc-p2p","WebRTC Peer to Peer với Rust","Xây dựng Signaling Server bằng Rust để thiết lập cuộc gọi audio\u002Fvideo P2P giữa hai trình duyệt với WebRTC.","Khóa học thực chiến giúp bạn xây dựng từ đầu một Signaling Server bằng Rust, xử lý các cuộc gọi audio\u002Fvideo trực tiếp giữa hai trình duyệt thông qua WebRTC Peer-to-Peer mà không cần Media Server.\n\nBạn sẽ nắm vững kiến trúc WebRTC signaling, cách trao đổi SDP Offer\u002FAnswer và ICE Candidates giữa các peer thông qua WebSocket. Khóa học sử dụng Axum + Tokio cho backend, MongoDB để lưu trữ dữ liệu, và JWT để xác thực người dùng.\n\nĐây là Phần 1 trong series 7 phần về Lập trình Rust với VoIP, bao gồm: WebRTC P2P, Media Server (Janus, LiveKit, Kurento, Asterisk, FreePBX), và hệ thống CRM\u002FQueue\u002Fnhạc chờ\u002Fchuyển tiếp cuộc gọi.\n\nYêu cầu tiên quyết: Kiến thức cơ bản về Rust (Ownership, Lifetimes, Traits, Async\u002FAwait).","5 giờ",32,"[\"Rust\",\"WebRTC\",\"VoIP\",\"P2P\",\"Axum\",\"Tokio\",\"WebSocket\",\"MongoDB\",\"JWT\"]","2026-04-06 16:39:52","2026-04-10 00:15:52",4.8,320,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1775495865592-4cdf9be1-d9ed-459c-b59b-178041ba66b5.png",{"name":18,"title":19,"bio":20},[337,345,353,361,369,377,385,394,403,411,420,429,438,447,456,465,474,483,492,501,510,519,528,537,546,555,564,574,584,594,604,614],{"slug":338,"title":339,"description":340,"duration":341,"youtubeId":342,"order":58,"thumbnail":343,"createdAt":330,"updatedAt":344},"gioi-thieu-khoa-hoc","Rust WebRTC P2P #1 - Giới thiệu khóa học","Chào mừng bạn đến với series Rust VoIP! Trong bài mở đầu, bạn sẽ nắm được bức tranh toàn cảnh: mục tiêu xây dựng Signaling Server bằng Rust, kiến trúc P2P (Browser ↔ Rust Server ↔ Browser), tech stack sử dụng (Axum, Tokio, WebSocket, MongoDB, JWT), và lộ trình 7 phần của toàn bộ series từ WebRTC đến CRM\u002FQueue.","5:29","Gj9wYJ57qfA","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1775495174815-9cda6d98-4692-4476-815d-0437bad01c59.webp","2026-04-11 05:30:00",{"slug":346,"title":347,"description":348,"duration":349,"youtubeId":350,"order":68,"thumbnail":351,"createdAt":330,"updatedAt":352},"voip-la-gi-webrtc-la-gi","Rust WebRTC P2P #2 - VoIP là gì? WebRTC là gì?","Hiểu bản chất VoIP — công nghệ truyền thoại\u002Fvideo qua mạng IP đứng sau Skype, Zoom, Google Meet. Sau đó khám phá WebRTC — bộ tiêu chuẩn cho phép trình duyệt giao tiếp trực tiếp peer-to-peer: media đi thẳng giữa hai browser, server chỉ làm nhiệm vụ signaling duy nhất.","7:13","Ih1lcfZwzeE","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1775495227568-62ba7951-3528-4c10-973d-13f726732f56.webp","2026-04-06 17:07:52",{"slug":354,"title":355,"description":356,"duration":357,"youtubeId":358,"order":78,"thumbnail":359,"createdAt":330,"updatedAt":360},"sip-overview-why-rust","Rust WebRTC P2P #3 - SIP overview + Why choose Rust","So sánh SIP (giao thức signaling truyền thống trong telephony) với WebRTC signaling nhẹ hơn, phù hợp browser. Đi sâu vào 4 lý do chọn Rust: hiệu năng không GC pause, safety ngăn data race từ compile time (Arc, DashMap, mpsc), async mạnh mẽ với Tokio, và cơ chế bắt buộc xử lý lỗi — yếu tố sống còn khi server chịu hơn 100K cuộc gọi\u002Fngày.","3:23","SVOsqmEs2SQ","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1775495301130-3cedf79b-354f-4035-bad9-1d2166099956.webp","2026-04-06 17:08:23",{"slug":362,"title":363,"description":364,"duration":365,"youtubeId":366,"order":14,"thumbnail":367,"createdAt":330,"updatedAt":368},"install-rust-rustrover-cargo","Rust WebRTC P2P #4 - Install Rust + RustRover + Cargo Commands","Thực hành cài đặt Rust Toolchain qua rustup.rs trên Windows\u002FLinux\u002FmacOS và xác thực bằng rustc, cargo, rustup. Khám phá RustRover — IDE chuyên biệt giúp code Rust nhanh hơn VS Code. Làm quen 4 lệnh Cargo thiết yếu: cargo new, cargo build, cargo build --release và cargo run.","7:36","Pzj8FiXvmwo","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1775495334946-b2e8a644-6797-4a0a-8aa8-bc9f6926fb1b.webp","2026-04-06 17:08:56",{"slug":370,"title":371,"description":372,"duration":373,"youtubeId":374,"order":97,"thumbnail":375,"createdAt":330,"updatedAt":376},"hello-world-tokio-runtime-cargo-toml","Rust WebRTC P2P #5 - Hello World + Tokio Runtime + Cargo.toml","Khám phá Cargo.toml — trái tim quản lý dependencies của mọi dự án Rust. Khai báo các thư viện sẽ dùng xuyên suốt khóa học: Axum, Tokio, Serde, DashMap, UUID, Log4rs, Anyhow. Cấu hình Tokio Runtime biến hàm main thành async, tận dụng thread pool xử lý hàng nghìn kết nối đồng thời. Kết thúc bằng việc chạy thành công project Hello World đầu tiên.","5:13","HIcUJYrI_7U","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1775495371395-6e99fb8b-7734-479f-9386-6a4bc75d6cff.webp","2026-04-06 17:09:32",{"slug":378,"title":379,"description":380,"duration":381,"youtubeId":382,"order":107,"thumbnail":383,"createdAt":384,"updatedAt":384},"axum-server-config-loading","Rust WebRTC P2P #6 - Axum Server + Config Loading","Chào mừng bạn quay trở lại với series WebRTC Peer-to-Peer (P2P) với Rust\n\nTrong phần 6 này:\nChúng ta bắt đầu xây dựng backend\n→ Thiết lập hệ thống cấu hình (Config)\n→ Khởi tạo Axum HTTP Server","42:44","DmHrozL4its","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1775495482671-3d9accc9-dbe7-45e4-bdaa-2b4361dc3b34.webp","2026-04-06 17:12:39",{"slug":386,"title":387,"description":388,"duration":389,"youtubeId":390,"order":117,"thumbnail":391,"createdAt":392,"updatedAt":393},"mongodb-logging-with-log4rs","Rust WebRTC P2P #7 - MongoDB + Logging with log4rs","Chào mừng bạn quay trở lại với series WebRTC Peer-to-Peer (P2P) bằng Rust\n\nTrong video 7 này:\nChúng ta hoàn thiện nền tảng Signaling Server với 2 phần quan trọng:\n- Cấu hình MongoDB\n- Thiết lập hệ thống Logging với log4rs","15:44","K9D_tT1iJQ8","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1775495650431-ec57a6c7-3937-48b5-ac5d-7c2b105d32b4.webp","2026-04-06 17:14:11","2026-04-06 17:15:17",{"slug":395,"title":396,"description":397,"duration":398,"youtubeId":399,"order":127,"thumbnail":400,"createdAt":401,"updatedAt":402},"create-websocket-endpoint-with-axum","Rust WebRTC P2P #8 - Create WebSocket Endpoint with Axum","WebSocket là giao thức giữ kết nối hai chiều liên tục — khác HTTP request\u002Fresponse. Trong signaling server, mỗi user kết nối WebSocket và giữ kết nối suốt session\n","15:45","dX4phlMs4b4","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1775574741518-39f6b0a5-0899-4775-bae8-2c07da84f8ee.webp","2026-04-07 15:20:06","2026-04-07 15:29:25",{"slug":404,"title":405,"description":406,"duration":407,"youtubeId":408,"order":137,"thumbnail":409,"createdAt":410,"updatedAt":410},"connectionstate-client-online-management","Rust WebRTC P2P #9 - ConnectionState — Client Online management","Chào mừng bạn quay trở lại với series WebRTC Peer-to-Peer (P2P) bằng Rust\n\nTrong phần 9 này:\nChúng ta xây dựng một thành phần cốt lõi của Signaling Server\n→ Quản lý trạng thái kết nối (Connection State)\n→ Quản lý danh sách user đang online","8:46","DSWewq_Ft48","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1775657276388-20da4fcb-6126-4224-b333-16adac68afe2.webp","2026-04-08 14:14:48",{"slug":412,"title":413,"description":414,"duration":415,"youtubeId":416,"order":147,"thumbnail":417,"createdAt":418,"updatedAt":419},"message-routing-dispatcher-pattern","Rust WebRTC P2P #10 - Message Routing — Dispatcher Pattern","Trong phần 10 này, chúng ta sẽ tiến hành chuẩn hóa cách thức trao đổi dữ liệu giữa Client và Server thông qua WebSocket bằng cách xây dựng hệ thống Message Routing và áp dụng Dispatcher Pattern.","9:37","w1o6z46nbgs","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1775726962635-205922a3-435d-455d-bf21-f41c57ca7436.webp","2026-04-09 09:33:02","2026-04-10 00:14:36",{"slug":421,"title":422,"description":423,"duration":424,"youtubeId":425,"order":157,"thumbnail":426,"createdAt":427,"updatedAt":428},"nginx-config-deploy-live-on-vps","Rust WebRTC P2P #11 - Nginx Config + Deploy Live on VPS","Chúng ta đưa Signaling Server từ local lên VPS thực tế\n→ Cấu hình domain\n→ Setup Nginx\n→ Thiết lập HTTPS (SSL)","16:28","CQKW3uUgm_Y","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1775831831726-148865ca-dcbf-4682-9e0b-41435a17be0d.jpg","2026-04-10 14:40:09","2026-04-11 02:04:35",{"slug":430,"title":431,"description":432,"duration":433,"youtubeId":434,"order":167,"thumbnail":435,"createdAt":436,"updatedAt":437},"user-model-mongodb-queries","Rust WebRTC P2P #12 - User Model + MongoDB Queries","Trong phần này, mình bắt đầu xây dựng Data Layer cho hệ thống, bao gồm User Model và các truy vấn MongoDB. Đây là nền tảng quan trọng để triển khai Login và Authentication cho cả REST API và WebSocket server.","4:34","Ov54lD682Kw","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1775911639340-b03d16cc-a0a8-4233-a5e1-50a94743f954.png","2026-04-11 12:51:02","2026-04-11 12:51:13",{"slug":439,"title":440,"description":441,"duration":442,"youtubeId":443,"order":177,"thumbnail":444,"createdAt":445,"updatedAt":446},"login-service-jwt-argon2","Rust WebRTC P2P #13 - Login Service + JWT + Argon2","Trong phần 13 này, chúng ta triển khai một trong những tính năng quan trọng nhất của backend: Login Service. Mục tiêu là xây dựng cơ chế xác thực an toàn, sử dụng JWT và các tiêu chuẩn bảo mật hiện đại để bảo vệ thông tin người dùng.","22:03","sICzdbRpwnw","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1775983603748-ad6186f1-5c2f-4cf2-8e07-29b6880a9c55.png","2026-04-12 08:47:56","2026-04-12 08:48:12",{"slug":448,"title":449,"description":450,"duration":451,"youtubeId":452,"order":187,"thumbnail":453,"createdAt":454,"updatedAt":455},"auth-middleware-http-websocket-auth-flow","Rust WebRTC P2P #14 - Auth Middleware HTTP + WebSocket Auth Flow","Trong phần 14 này, chúng ta thực hiện một bước rất quan trọng để bảo vệ hệ thống: xây dựng Middleware cho HTTP Server và thiết lập luồng xác thực cho WebSocket. Đây là lớp bảo vệ giúp đảm bảo chỉ những người dùng hợp lệ mới có thể truy cập API và thiết lập kết nối signaling.","50:35","Maz-uKSzoto","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1776072985484-4936c485-dfcb-4919-8b83-6e364e6a1255.webp","2026-04-13 09:37:58","2026-04-13 09:38:16",{"slug":457,"title":458,"description":459,"duration":460,"youtubeId":461,"order":197,"thumbnail":462,"createdAt":463,"updatedAt":464},"demo-login-websocket-auth-tu-postman","Rust WebRTC P2P #15 - Demo Login + WebSocket Auth từ Postman","Trong phần 15 này, chúng ta thực hiện demo toàn bộ quy trình xác thực đã xây dựng ở các phần trước. Sử dụng Postman để mô phỏng client, chúng ta sẽ kiểm tra cách server xử lý token thông qua cả HTTP và WebSocket.","5:12","8GmuMOpl_JQ","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1776176649415-701f3222-2da2-43a7-b9ad-7f52a41386b4.webp","2026-04-14 14:25:25","2026-04-14 14:25:35",{"slug":466,"title":467,"description":468,"duration":469,"youtubeId":470,"order":207,"thumbnail":471,"createdAt":472,"updatedAt":473},"state-pattern-p2pcallstatehandler-trait","Rust WebRTC P2P #16 - State Pattern — P2PCallStateHandler Trait","Trong phần 16 này, chúng ta đi vào một thành phần rất quan trọng trong kiến trúc của signaling server: State Pattern. Đây là phần “trái tim” giúp điều khiển toàn bộ luồng xử lý của một cuộc gọi, từ lúc bắt đầu cho đến khi kết thúc.","12:04","6BrjxQmROU0","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1776240875283-0880cb67-c8fd-4f77-975f-0d05d3fa6394.png","2026-04-15 08:17:01","2026-04-15 08:17:23",{"slug":475,"title":476,"description":477,"duration":478,"youtubeId":479,"order":217,"thumbnail":480,"createdAt":481,"updatedAt":482},"callactor-event-loop-timer-management","Rust WebRTC P2P #17 - CallActor - Event Loop + Timer Management","Trong phần 17 này, chúng ta thiết kế một thành phần rất quan trọng trong hệ thống: CallActor (Connector). Đây là nơi tiếp nhận toàn bộ sự kiện của cuộc gọi, quản lý timer và điều phối logic xử lý, đóng vai trò như “bộ não” của signaling server.","4:25","YELAgVosv2A","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1776335165827-54c2c9e3-c018-4405-8095-c7880397b5f4.webp","2026-04-16 10:28:43","2026-04-16 10:29:10",{"slug":484,"title":485,"description":486,"duration":487,"youtubeId":488,"order":227,"thumbnail":489,"createdAt":490,"updatedAt":491},"callsupervisor-call-lifetime-management","Rust WebRTC P2P #18 - CallSupervisor - Call lifetime management","Trong phần này, chúng ta xây dựng CallSupervisor – thành phần quản lý trung tâm chịu trách nhiệm điều phối và quản lý vòng đời của các cuộc gọi trong hệ thống signaling server. Đây là lớp giúp hệ thống kiểm soát tài nguyên, điều phối message và đảm bảo hoạt động ổn định khi có nhiều cuộc gọi đồng thời.","23:08","rf2PzQm4DMA","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1776415950702-29af7f20-e004-4d40-86e3-3c3c7fc7a10b.webp","2026-04-17 08:53:46","2026-04-17 08:53:57",{"slug":493,"title":494,"description":495,"duration":496,"youtubeId":497,"order":237,"thumbnail":498,"createdAt":499,"updatedAt":500},"architecture-offeranswerice-overview","Rust WebRTC P2P #19 - P2P Architecture + Offer\u002FAnswer\u002FICE Overview","Trong phần 19 này, chúng ta sẽ tạm dừng việc viết code để cùng nhìn lại một cách chi tiết và hệ thống nhất về kiến trúc P2P thực tế mà chúng ta đang xây dựng. Video này sẽ giúp bạn hình dung rõ nét cách các bản tin Offer, Answer và ICE Candidate di chuyển qua lại giữa Caller, Callee và Rust Signaling Server","2:31","DcRrOSEZKaI","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1776525459714-02251de5-48df-49ed-8cfb-2b82559c440a.png","2026-04-18 15:21:03","2026-04-18 15:21:30",{"slug":502,"title":503,"description":504,"duration":505,"youtubeId":506,"order":247,"thumbnail":507,"createdAt":508,"updatedAt":509},"sdp-chi-tiet-ipv4-port-codec","Rust WebRTC P2P #20 - SDP Detail — ipv4, Port, Codec","Trong phần 20 này, chúng ta sẽ đi sâu vào \"trái tim\" của quá trình Signaling: SDP (Session Description Protocol). Đây là bản tin mô tả phiên làm việc giúp hai trình duyệt hiểu được nhau về mặt kỹ thuật, từ loại dữ liệu truyền tải cho đến các chuẩn nén âm thanh","4:10","AYIV_g8vdE4","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1776615165942-3c7804c1-9896-4663-b407-37bee19ffc8b.png","2026-04-19 16:13:45","2026-04-19 16:14:03",{"slug":511,"title":512,"description":513,"duration":514,"youtubeId":515,"order":257,"thumbnail":516,"createdAt":517,"updatedAt":518},"ice-candidate-stunturncoturn","Rust WebRTC P2P #21 - ICE Candidate — STUN\u002FTURN\u002FcoTURN","Trong phần 21 này, chúng ta tìm hiểu về ICE Candidate – thành phần giúp hai trình duyệt thực sự kết nối được với nhau trong môi trường thực tế. Nếu SDP là bản thỏa thuận, thì ICE Candidate chính là “tọa độ mạng” giúp các peer vượt qua NAT và firewall.","5:04","ZOPr-Lgx4b8","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1776615904522-a5950a49-c4b8-4c63-bb87-aae1640829c2.png","2026-04-19 16:25:28","2026-04-20 17:54:08",{"slug":520,"title":521,"description":522,"duration":523,"youtubeId":524,"order":267,"thumbnail":525,"createdAt":526,"updatedAt":527},"chrome-webrtc-internals-firefox-aboutwebrtc","Rust WebRTC P2P #22 - Chrome webrtc-internals + Firefox about:webrtc","Trong phần 22 này, chúng ta sẽ tạm rời xa code để làm quen với những công cụ debug cực kỳ quan trọng giúp bạn kiểm tra và giám sát kết nối WebRTC trực tiếp trên trình duyệt. Đây là bước không thể thiếu để xác định Signaling Server hoạt động đúng hay chưa và liệu luồng media đã được thiết lập thành công hay chưa.","3:00","zbA6onXn-pg","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1776708888639-1fe16a59-b013-4fa3-b4c4-178ca019a8d3.png","2026-04-20 18:16:15","2026-04-20 18:16:43",{"slug":529,"title":530,"description":531,"duration":532,"youtubeId":533,"order":277,"thumbnail":534,"createdAt":535,"updatedAt":536},"state-machine-co-che-transition","Rust WebRTC P2P #23 - State Machine + Cơ chế Transition","Trong phần 23 này, chúng ta bắt đầu hiện thực hóa kiến trúc đã thiết kế bằng cách xây dựng State Machine và cơ chế transition cho hệ thống signaling. Đây là một bước rất quan trọng để quản lý logic cuộc gọi một cách rõ ràng, chặt chẽ và an toàn.","6:50","RpXhBqmNk7c","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1776783343994-ba548841-5db5-412a-bcda-203cd2b95f33.png","2026-04-21 14:56:29","2026-04-21 14:56:48",{"slug":538,"title":539,"description":540,"duration":541,"youtubeId":542,"order":287,"thumbnail":543,"createdAt":544,"updatedAt":545},"rust-webrtc-p2p-24-call-start-state","Rust WebRTC P2P #24 - Call Start State","Trong phần 24 này, chúng ta bắt đầu viết những dòng code đầu tiên cho nghiệp vụ cuộc gọi bằng cách xây dựng handler xử lý lệnh call_start_request. Đây là bước khởi đầu quan trọng để server xác thực yêu cầu và chuẩn bị tài nguyên trước khi hai bên bắt đầu trao đổi SDP.","15:53","KnKWZ4hFVxw","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1776873563139-292333ff-26c2-465b-b01c-30ad11723f2f.png","2026-04-22 16:00:49","2026-04-22 16:00:58",{"slug":547,"title":548,"description":549,"duration":550,"youtubeId":551,"order":297,"thumbnail":552,"createdAt":553,"updatedAt":554},"p2pwaitingcallersdpstate-caller-sdp-waiting","Rust WebRTC P2P #25 - P2PWaitingCallerSdpState — Caller SDP Waiting","Trong phần 25 này, chúng ta bắt đầu implement trạng thái đầu tiên trong bộ máy điều khiển cuộc gọi: **P2PWaitingCallerSdpState**. Đây là trạng thái có nhiệm vụ chờ đợi bản tin SDP Offer từ phía Caller sau khi quá trình khởi tạo cuộc gọi đã hoàn tất.","17:23","JHxGt3pEvKI","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1776942152770-4e5939ef-fa3e-4ad0-8848-d954a77e0b9c.png","2026-04-23 11:03:26","2026-04-23 11:03:36",{"slug":556,"title":557,"description":558,"duration":559,"youtubeId":560,"order":44,"thumbnail":561,"createdAt":562,"updatedAt":563},"p2pconnecttocalleestate-incoming-call","Rust WebRTC P2P #26 - P2PConnectToCalleeState - Incoming Call","Trong phần 26 này, chúng ta sẽ xây dựng một trong những state phức tạp và thú vị nhất của Signaling Server: P2PConnectToCalleeState. Đây là giai đoạn server thực hiện kết nối tới người bị gọi, điều phối bản tin giữa các thiết bị và xử lý các phản hồi chấp nhận hoặc từ chối cuộc gọi.","16:33","4eFYIC6v9Co","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1777051005241-955db861-41bf-40aa-a24c-f077fd7e486f.png","2026-04-24 17:17:58","2026-04-24 17:18:08",{"slug":565,"title":566,"description":567,"duration":568,"youtubeId":569,"order":570,"thumbnail":571,"createdAt":572,"updatedAt":573},"callanswerreq-codes-100180486","Rust WebRTC P2P #27 - call_answer_req — Codes 100\u002F180\u002F486","Trong phần 27 này, chúng ta tiếp tục hoàn thiện logic phía Server bằng cách xây dựng lệnh call_answer_req. Đây là bước quan trọng giúp người bị gọi (Callee) phản hồi lại yêu cầu từ người gọi, thông báo trạng thái đổ chuông, từ chối hoặc chấp nhận cuộc gọi theo các mã chuẩn trong signaling.","11:05","omS550Fc-OU",27,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1777116711181-52bb555b-9093-4761-bd65-7f861a52368c.png","2026-04-25 11:32:50","2026-04-25 11:33:03",{"slug":575,"title":576,"description":577,"duration":578,"youtubeId":579,"order":580,"thumbnail":581,"createdAt":582,"updatedAt":583},"p2pwaitingcalleesdpstate-p2ptalkingstate","Rust WebRTC P2P #28 - P2PWaitingCalleeSDPState → P2PTalkingState","Trong phần 28 này, chúng ta sẽ thực hiện bước cuối cùng trong quy trình Signaling: Triển khai trạng thái P2PWaitingCalleeSDPState. Đây là giai đoạn quan trọng để Server điều phối bản tin SDP Answer từ người bị gọi (Callee) quay trở lại cho người gọi (Caller), đồng thời hoàn tất việc trao đổi các ICE Candidates để hai bên có thể thiết lập kết nối Media.","12:34","RwSCW7omH-c",28,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1777204197874-fc3d7d15-eccf-4d21-857f-1c8f59c1f4cf.png","2026-04-26 11:51:11","2026-04-26 11:51:21",{"slug":585,"title":586,"description":587,"duration":588,"youtubeId":589,"order":590,"thumbnail":591,"createdAt":592,"updatedAt":593},"p2ptalkingstate-heartbeat-timeout","Rust WebRTC P2P #29 - P2PTalkingState — Heartbeat + Timeout","Trong phần 29 này, chúng ta sẽ tiến tới trạng thái quan trọng nhất trong vòng đời cuộc gọi: P2PTalkingState. Đây là giai đoạn hai người dùng đang đàm thoại trực tiếp với nhau. Tuy nhiên, vì đây là kết nối P2P (media không đi qua server), chúng ta cần một cơ chế để server biết cuộc gọi còn đang diễn ra hay đã bị ngắt kết nối một cách “im lặng”.","18:26","YXEw4XYJoXY",29,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1777299316144-7266ad71-4734-48ff-80a9-3087540e7032.png","2026-04-27 14:15:53","2026-04-27 14:16:04",{"slug":595,"title":596,"description":597,"duration":598,"youtubeId":599,"order":600,"thumbnail":601,"createdAt":602,"updatedAt":603},"ice-candidate-forwarding-trong-talking-state-end-state","Rust WebRTC P2P #30 - ICE Candidate Forwarding trong Talking State - End State","Trong phần 30 này, chúng ta sẽ hoàn thiện mảnh ghép cuối cùng trong vòng đời cuộc gọi: EndState. Đây là trạng thái đảm nhiệm việc kết thúc cuộc gọi một cách an toàn, đảm bảo hệ thống không bị rò rỉ tài nguyên và tất cả các bên đều được thông báo chính xác khi cuộc gọi dừng lại.","17:20","CTJSx4ngEzA",30,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1777373551460-992e255c-f65c-49e7-bf0b-3b822b79d2de.webp","2026-04-28 10:53:19","2026-04-28 10:53:29",{"slug":605,"title":606,"description":607,"duration":608,"youtubeId":609,"order":610,"thumbnail":611,"createdAt":612,"updatedAt":613},"test-end-to-end-2-real-browser","Rust WebRTC P2P #31 - Test End-to-End: 2 real browser","Trong phần 31 này, chúng ta sẽ thực hiện bước quan trọng nhất sau toàn bộ quá trình xây dựng hệ thống: Test End-to-End (E2E) với hai trình duyệt thật. Đây là bước kiểm chứng toàn bộ pipeline từ build, deploy cho đến thực hiện cuộc gọi P2P thực tế giữa hai user.","15:21","g2VUgdszcjo",31,"https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1777428562735-ff26061b-ed2f-4a71-bc78-41b73584768d.jpg","2026-04-29 02:10:11","2026-04-29 02:27:06",{"slug":615,"title":616,"description":617,"duration":618,"youtubeId":619,"order":328,"thumbnail":620,"createdAt":621,"updatedAt":622},"tong-ket-va-ke-hoach-tiep-theo","Rust WebRTC P2P #32 - Tổng kết và kế hoạch tiếp theo","Sau một hành trình dài từ những dòng code đầu tiên, trong video này chúng ta sẽ cùng nhìn lại toàn bộ hệ thống đã xây dựng, tổng kết những gì đã đạt được, đồng thời phân tích các hạn chế của mô hình P2P và định hướng lộ trình học tập tiếp theo với các hệ thống Media Server chuyên nghiệp.","3:44","ilktCRe9p_c","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1777434502681-16641947-5848-496e-a05a-f4569f9bc595.jpg","2026-04-29 03:51:03","2026-04-30 02:06:10",{"slug":624,"title":625,"shortDescription":626,"description":627,"category":8,"level":9,"totalDuration":315,"totalLessons":11,"tags":628,"createdAt":629,"updatedAt":630,"rating":11,"reviewCount":11,"thumbnail":631,"instructor":632,"lessons":633},"rust-voip-asterisk-media-server","Rust VoIP: Asterisk Media Server","Làm chủ công nghệ VoIP với khóa học \"Lập trình VoIP với Rust: Asterisk Media Server\". Vượt qua những giới hạn của WebRTC P2P để xây dựng hệ thống tổng đài và media server chuyên nghiệp. Khám phá sức mạnh của Asterisk kết hợp cùng Rust để xử lý các bài toán quy mô lớn, từ gọi App-to-App đến tích hợp hệ thống SIP và Auto Callout mạnh mẽ.","Từ WebRTC P2P đến Hệ thống Media Server thực thụ\nNếu bạn đã hiểu cách kết nối trực tiếp giữa các trình duyệt qua WebRTC P2P, bạn sẽ nhận ra rằng mô hình đó chỉ là bước khởi đầu\n. Để xây dựng những ứng dụng Voice IP có thể scale lớn và dùng trong sản xuất (production), chúng ta cần một giải pháp mạnh mẽ hơn để giải quyết 4 vấn đề cốt lõi của P2P:\n\n- Khả năng mở rộng không giới hạn: Thay vì để 10 người tạo ra 90 kết nối chéo gây nghẽn mạng\n, chúng ta sẽ tập trung mọi luồng media về một điểm duy nhất.\n- Tối ưu tài nguyên thiết bị: Giảm tải tối đa CPU và pin cho người dùng mobile bằng cách không bắt thiết bị phải upload nhiều luồng media cùng lúc\n- Ghi âm tập trung (Centralized Recording): Dễ dàng lưu trữ và quản lý mọi cuộc gọi ngay tại server, điều mà mô hình P2P gần như không thể thực hiện\n- Vượt qua rào cản NAT: Xử lý triệt để vấn đề NAT nghiêm ngặt (NAT strict) vốn chiếm tới 15% người dùng, giúp kết nối luôn thông suốt mà không làm tăng chi phí relay phức tạp.\n\nTại sao lại là Asterisk và Rust?\nTrong khóa học này, chúng ta sẽ sử dụng Asterisk — một tượng đài trong thế giới VoIP — làm Media Server trung gian. Thay vì để các peer kết nối trực tiếp, tất cả client sẽ gửi dữ liệu lên Asterisk để server xử lý và phân phối lại.\n\nViệc kết hợp với ngôn ngữ Rust mang lại hiệu suất tối ưu và tính an toàn cao khi xây dựng các logic điều khiển cuộc gọi. Asterisk đóng vai trò là \"trái tim\" xử lý WebRTC, signaling và networking, giúp hệ thống dễ dàng scale lên hàng trăm, thậm chí hàng nghìn người dùng\n\nNội dung thực hành trọng tâm\nKhóa học sẽ dẫn dắt bạn đi từ những bước cơ bản nhất đến khi hoàn thiện một hệ thống Voice IP thực tế với đầy đủ các tính năng\n\n1. Call App to App: Lập trình cuộc gọi giữa hai ứng dụng WebRTC thông qua Asterisk.\n2. Call App to SIP: Kết nối thế giới Web\u002FApp với hệ thống tổng đài SIP truyền thống.\n3. Call SIP to App: Nhận cuộc gọi ngược lại từ các đầu số SIP về trình duyệt hoặc ứng dụng di động.\n4. Auto Callout: Xây dựng hệ thống tự động gọi ra chuyên nghiệp phục vụ cho thông báo hoặc CSKH.\n\nKết quả đạt được\nToàn bộ khóa học được thiết kế để bạn có thể tự mình xây dựng, vận hành và triển khai một hệ thống VoIP thực tế\n. Đây không chỉ là lý thuyết, mà là những kỹ năng thực chiến để bạn làm chủ công nghệ truyền thông thời gian thực.","[\"asterisk\",\"rust\",\"b2bua\",\"kamailio\"]","2026-04-09 10:01:22","2026-04-09 14:19:52","https:\u002F\u002Fpub-cd0f133a6f7640ca947255f10fb6c328.r2.dev\u002Fthumbnails\u002F1775728872332-8cae7a0a-719d-4c6f-bf67-8829e2a9cf42.png",{"name":18,"title":19,"bio":20},[],1779754811120]