日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

WebRTC.Net庫開發進階,教你實現屏幕共享和多路復用!

來源: 責編: 時間:2023-08-05 11:46:09 4918觀看
導讀WebRTC.Net庫:讓你的應用更親民友好,實現視頻通話無痛接入! 除了基本用法外,還有一些進階用法可以更好地利用該庫。自定義 STUN/TURN 服務器配置WebRTC.Net 默認使用 Google 的 STUN 服務器和 Coturn 的 TURN 服務器。如

LZV28資訊網——每日最新資訊28at.com

WebRTC.Net庫:讓你的應用更親民友好,實現視頻通話無痛接入! 除了基本用法外,還有一些進階用法可以更好地利用該庫。LZV28資訊網——每日最新資訊28at.com

自定義 STUN/TURN 服務器配置

WebRTC.Net 默認使用 Google 的 STUN 服務器和 Coturn 的 TURN 服務器。如果你需要使用其他 STUN/TURN 服務器,則可以在初始化 PeerConnectionFactory 和 PeerConnection 時設置自定義配置。LZV28資訊網——每日最新資訊28at.com

例如,以下代碼設置了使用 coturn 服務器的 PeerConnectionFactory:LZV28資訊網——每日最新資訊28at.com

var config = new PeerConnectionConfiguration{   IceServers = new List<IceServer>   {      new IceServer{ Urls = new[] { "stun:stun.l.google.com:19302" }},      new IceServer{ Urls = new[] { "turn:my-turn-server.com" }, Username="myusername", Credential="mypassword" }   }};var factory = new PeerConnectionFactory(config);

在不同線程中創建和使用 PeerConnectionFactory 和 PeerConnection 對象:

WebRTC.Net 庫本質上是基于線程的,因此它的對象通常在單獨的線程中創建和使用。這樣可以避免在主線程中對 UI 線程造成大量負擔。LZV28資訊網——每日最新資訊28at.com

以下代碼在后臺線程中創建并使用 PeerConnection 對象LZV28資訊網——每日最新資訊28at.com

Task.Run(() =>{   var config = new PeerConnectionConfiguration { IceServers = new List<IceServer> { new IceServer { Urls = new[] { "stun:stun.l.google.com:19302" } } } };   var factory = new PeerConnectionFactory(config);   var pc = factory.CreatePeerConnection(config);      // 在這里使用 PeerConnection 對象,不會阻塞主線程}).Wait();

選擇視頻和音頻設備

在創建 PeerConnectionFactory 對象時,可以設置 defaultAudioDevice 和 defaultVideoDevice 參數以選擇默認的音頻和視頻設備。LZV28資訊網——每日最新資訊28at.com

例如,以下如何通過設備名稱選擇視頻和音頻設備:LZV28資訊網——每日最新資訊28at.com

var config = new PeerConnectionConfiguration{   IceServers = new List<IceServer> { new IceServer { Urls = new[] { "stun:stun.l.google.com:19302" } } },   DefaultVideoDevice = VideoCaptureDevice.GetDevices().FirstOrDefault(x => x.Name == "MyCameraName"),   DefaultAudioDevice = AudioCaptureDevice.GetDevices().FirstOrDefault(x => x.Name == "MyMicrophoneName")};var factory = new PeerConnectionFactory(config);

實現數據通道

WebRTC.Net 庫不僅支持音視頻傳輸,還支持實現數據通道(DataChannel)。使用數據通道,應用程序可以在客戶端之間傳輸任意類型的數據,例如聊天消息、游戲狀態等。LZV28資訊網——每日最新資訊28at.com

以下代碼如何創建數據通道:LZV28資訊網——每日最新資訊28at.com

// 創建 PeerConnection 對象var config = new PeerConnectionConfiguration { IceServers = new List<IceServer> { new IceServer { Urls = new[] { "stun:stun.l.google.com:19302" } } } };var factory = new PeerConnectionFactory(config);var pc = factory.CreatePeerConnection(config);// 創建數據通道var dcConfig = new DataChannelInit { Ordered = true };var dc = pc.CreateDataChannel("mydatachannel", dcConfig);// 監聽數據通道事件dc.MessageReceived += (sender, e) =>{   // 處理接收到的數據};

實現屏幕共享

除了音視頻傳輸和數據通道,WebRTC.Net 還支持屏幕共享。這意味著應用程序可以捕獲屏幕上的內容并將其共享給其他客戶端。LZV28資訊網——每日最新資訊28at.com

以下是使用 WinForm 技術棧和 WebRTC.Net 庫實現桌面共享的示例代碼。LZV28資訊網——每日最新資訊28at.com

using System;using System.Drawing;using System.Threading.Tasks;using System.Windows.Forms;using Windows.Graphics.Capture;using Windows.Graphics.DirectX.Direct3D11;using Microsoft.Toolkit.Win32.UI.Controls.Interop.WinRT;using Org.WebRtc;namespace DesktopStreaming{    public partial class MainForm : Form    {        private PeerConnection _peerConnection;        private DataChannel _dataChannel;        private Direct3D11CaptureFramePool _framePool;        private GraphicsCaptureSession _session;        private VideoTrack _videoTrack;        public MainForm()        {            InitializeComponent();            // 初始化 WebRTC            WebRTC.Initialize(new WebRTCInitializationOptions { EnableAudioBufferLog = false });            // 創建 PeerConnectionFactory 對象            var config = new PeerConnectionConfiguration { IceServers = new[] { new IceServer { Urls = new[] { "stun:stun.l.google.com:19302" } } } };            var factory = new PeerConnectionFactory(config);            // 創建 PeerConnection 對象            _peerConnection = factory.CreatePeerConnection();            // 創建數據通道            _dataChannel = _peerConnection.CreateDataChannel("mychannel");            // 訂閱數據通道的消息事件            _dataChannel.MessageReceived += (sender, args) =>            {                // 處理收到的消息            };            // 創建 Direct3D11CaptureFramePool 對象            var device = Direct3D11Helpers.CreateDevice();            var size = new Size(800, 600);            _framePool = Direct3D11CaptureFramePool.CreateFreeThreaded(                device,                Direct3DPixelFormat.B8G8R8A8UIntNormalized,                1,                size);            // 訂閱 FrameArrived 事件            _framePool.FrameArrived += (sender, args) =>            {                // 獲取最新的桌面幀                using var frame = sender.TryGetNextFrame();                if (frame == null) return;                // 將桌面幀轉換為 RTCVideoFrame 對象                var videoFrame = new RTCVideoFrame(frame.ContentSize.Width, frame.ContentSize.Height, RTCVideoFrameType.RTCVideoFrameTypeI420);                videoFrame.ConvertFromArgb32(frame.Surface.Direct3D11Device, frame.Surface);                // 將 RTCVideoFrame 對象轉換為 VideoTrack 對象并發送                if (_videoTrack != null)                    _videoTrack.PushFrame(videoFrame);            };            // 創建 GraphicsCaptureItem 對象            var item = ScreenCapture.GetDefault();            // 創建 GraphicsCaptureSession 對象            _session = _framePool.CreateCaptureSession(item);        }        private async void btnStart_Click(object sender, EventArgs e)        {            // 開始共享桌面            await _session.StartAsync();            // 創建視頻軌道            _videoTrack = await PeerConnectionFactory.GetVideoTrackSourceAsync(_framePool);            // 添加視頻軌道到 PeerConnection 對象            await _peerConnection.AddTrack(_videoTrack);            // 創建 Offer SDP 并設置本地描述符            var offerSdp = await _peerConnection.CreateOffer();            await _peerConnection.SetLocalDescription(offerSdp);            // 發送 Offer SDP 到遠端            SendSdp(offerSdp);        }        private void SendSdp(RTCSessionDescription sdp)        {            // 將 SDP 轉換為 JSON 格式并發送到遠端            var json = Newtonsoft.Json.JsonConvert.SerializeObject(new { type = sdp.Type, sdp = sdp.Sdp });            _dataChannel.Send(json);        }        private async void MainForm_FormClosing(object sender, FormClosingEventArgs e)        {            // 關閉 PeerConnection 和 GraphicsCaptureSession 對象            await _peerConnection.CloseAsync();            _session.Dispose();        }    }}

上述代碼中,我們使用了 ScreenCapture 類來獲取默認的桌面捕獲項目,然后創建了 GraphicsCaptureSession 對象來捕獲桌面幀。我們還使用了
Direct3D11CaptureFramePool 類來創建一個 Direct3D 11 幀池,并訂閱了 FrameArrived 事件以獲取最新的桌面幀。在每次收到桌面幀時,我們將其轉換為 RTCVideoFrame 對象,再將其發送到 WebRTC 連接中。通過這種方式,我們就實現了桌面共享的功能。
LZV28資訊網——每日最新資訊28at.com

需要注意的是,由于 WebRTC 是基于 p2p 的實時通信協議,因此本示例代碼中僅演示了如何將桌面共享的數據發送給遠端客戶端,而沒有涉及如何在遠端客戶端上解析和顯示收到的數據。LZV28資訊網——每日最新資訊28at.com

處理 ICE 連接狀態

WebRTC.Net 使用 ICE(Interactive Connectivity Establishment)協議來建立和維護客戶端之間的連接。ICE 協議涉及多個狀態和事件,例如 gathering、connected、disconnected 等等。應用程序可以訂閱 PeerConnection 對象上的各種事件來處理這些狀態。LZV28資訊網——每日最新資訊28at.com

以下代碼如何訂閱 PeerConnection 對象上的連接狀態:LZV28資訊網——每日最新資訊28at.com

// 創建 PeerConnection 對象var config = new PeerConnectionConfiguration { IceServers = new List<IceServer> { new IceServer { Urls = new[] { "stun:stun.l.google.com:19302" } } } };var factory = new PeerConnectionFactory(config);var pc = factory.CreatePeerConnection(config);// 訂閱 PeerConnection 對象上的連接狀態pc.IceStateChanged += (sender, iceState) =>{   if (iceState == IceConnectionState.Connected)   {      // 客戶端已成功連接   }   else if (iceState == IceConnectionState.Disconnected)   {      // 客戶端已斷開連接   }};

實現多路復用

WebRTC.Net 支持實現多路復用(Multiplexing),這意味著應用程序可以在同一個數據通道上同時傳輸多種類型的數據,例如音頻、視頻、文件等。LZV28資訊網——每日最新資訊28at.com

下面是使用 WinForm 技術棧和 WebRTC.Net 庫實現多路復用的示例代碼。LZV28資訊網——每日最新資訊28at.com

Copy Codeusing System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;using Microsoft.Toolkit.Win32.UI.Controls.Interop.WinRT;using Org.WebRtc;namespace WebRTC_Multiplexing{    public partial class Form1 : Form    {        private PeerConnection _peerConnection;        private List<DataChannel> _dataChannels = new List<DataChannel>();        public Form1()        {            InitializeComponent();            // 初始化 WebRTC            WebRTC.Initialize(new WebRTCInitializationOptions { EnableAudioBufferLog = false });            // 創建 PeerConnectionFactory 對象            var config = new PeerConnectionConfiguration { IceServers = new[] { new IceServer { Urls = new[] { "stun:stun.l.google.com:19302" } } } };            var factory = new PeerConnectionFactory(config);            // 創建 PeerConnection 對象            _peerConnection = factory.CreatePeerConnection();            // 訂閱 PeerConnection 的連接狀態改變事件            _peerConnection.ConnectionStateChanged += (sender, args) =>            {                // 處理連接狀態改變事件                BeginInvoke(new Action(() => txtOutput.AppendText($"連接狀態:{args.NewState.ToString()}/r/n")));            };            // 訂閱 PeerConnection 的數據通道回調事件            _peerConnection.DataChannelAdded += (sender, args) =>            {                // 處理數據通道回調事件                var dataChannel = args.Channel;                dataChannel.MessageReceived += DataChannel_MessageReceived;                _dataChannels.Add(dataChannel);                BeginInvoke(new Action(() => txtOutput.AppendText($"收到數據通道:{dataChannel.Label}/r/n")));            };        }        private async void btnCreateOffer_Click(object sender, EventArgs e)        {            // 創建 Offer SDP 并設置本地描述符            var offerSdp = await _peerConnection.CreateOffer();            await _peerConnection.SetLocalDescription(offerSdp);            // 發送 Offer SDP 到對端            SendSdp(offerSdp);        }        private void SendSdp(RTCSessionDescription sdp)        {            // 將 SDP 轉換為 JSON 格式并發送到對端            var json = Newtonsoft.Json.JsonConvert.SerializeObject(new { type = sdp.Type, sdp = sdp.Sdp });            _dataChannels.ForEach(dc => dc.Send(json));        }        private async void DataChannel_MessageReceived(object sender, DataChannelMessageEventArgs e)        {            // 收到數據通道消息后將其轉換為 RTCSessionDescription 對象            if (e.MessageType == DataMessageType.Text)            {                var text = e.Data;                var sdp = Newtonsoft.Json.JsonConvert.DeserializeObject<RTCSessionDescription>(text);                // 設置遠端描述符并完成連接                await _peerConnection.SetRemoteDescription(sdp);                if (sdp.Type == RTCSessionDescriptionType.Offer) await _peerConnection.CreateAnswer();            }        }    }}

上述代碼中,我們創建了一個 PeerConnectionFactory 對象和一個 PeerConnection 對象,用于建立 WebRTC 連接。我們還創建了一個 _dataChannels 列表來保存所有的數據通道對象,每當 PeerConnection 對象添加一個新的數據通道時,我們就將其添加到 _dataChannels 列表中。LZV28資訊網——每日最新資訊28at.com

在 btnCreateOffer_Click 事件處理方法中,我們創建了一個 Offer SDP 并設置本地描述符,然后將其發送到所有的數據通道對象中。當收到對端發送過來的 SDP 消息時,我們將其轉換為 RTCSessionDescription 對象,并調用 SetRemoteDescription 方法設置遠端描述符。如果收到來自對端的 Offer SDP,則執行 CreateAnswer 方法創建 Answer SDP 并將其發送回對端。LZV28資訊網——每日最新資訊28at.com

通過這種方式,我們就可以使用同一個 PeerConnection 對象來支持多路復用。每當需要發送數據時,只需要將數據發送到指定的數據通道對象即可。需要注意的是,在使用多路復用時,我們需要為不同的數據通道設置不同的標簽(Label),以便在接收端識別不同的通道。LZV28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-147-0.htmlWebRTC.Net庫開發進階,教你實現屏幕共享和多路復用!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 一個注解實現接口冪等,這樣才優雅!

下一篇: Python異步IO編程的進程/線程通信實現

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
久久精品男女| 亚洲欧美日韩在线不卡| 黄色欧美日韩| 亚洲国产成人91精品| 亚洲精品一区二区三区在线观看 | 国产精品毛片在线看| 国产日韩欧美一二三区| 亚洲电影专区| 日韩网站免费观看| 午夜精品久久久久久久久久久| 久久精品夜夜夜夜久久| 欧美精品一区二区精品网| 国产精品亚洲综合色区韩国| 在线观看91精品国产入口| 一区二区三区高清不卡| 久久久精品国产免大香伊| 欧美日韩免费看| 国内久久视频| 在线亚洲免费| 另类国产ts人妖高潮视频| 国产精品成人v| 亚洲第一天堂无码专区| 亚洲影音先锋| 欧美国产日韩一区二区| 国产视频亚洲精品| 一本色道久久综合亚洲精品不卡 | 久久精品国产99精品国产亚洲性色| 欧美风情在线观看| 国产伦精品免费视频| 91久久一区二区| 久久成人资源| 国产精品成人一区二区网站软件 | 国产综合香蕉五月婷在线| 一本色道久久综合| 美女黄毛**国产精品啪啪| 国产精品男女猛烈高潮激情 | 99精品国产在热久久下载| 久久爱另类一区二区小说| 欧美日韩一区二区免费在线观看| 黑人一区二区| 亚洲男女自偷自拍| 欧美日本韩国一区| 有码中文亚洲精品| 欧美在线中文字幕| 国产精品日韩专区| 妖精视频成人观看www| 另类图片国产| 合欧美一区二区三区| 亚洲欧美综合网| 欧美日韩在线第一页| 亚洲国产一区二区三区高清| 久久成人18免费观看| 国产精品欧美日韩一区| 99视频精品全部免费在线| 女人香蕉久久**毛片精品| 好吊日精品视频| 欧美在线一区二区三区| 国产精品一区视频| 亚洲一区三区在线观看| 欧美视频在线观看免费| 亚洲九九精品| 欧美激情1区| 亚洲区国产区| 欧美精品一区在线| 亚洲精品乱码久久久久久按摩观| 男女av一区三区二区色多| 黄色在线成人| 久久另类ts人妖一区二区| 国产综合亚洲精品一区二| 欧美中文字幕视频| 国产婷婷色一区二区三区| 欧美在线国产| 国产亚洲综合精品| 欧美一区二区三区视频在线| 国产欧美va欧美va香蕉在| 午夜免费在线观看精品视频| 国产精品一卡二| 欧美伊人久久| 国产亚洲午夜| 久久久高清一区二区三区| 国内精品久久久久久久影视麻豆| 久久国产一区| 影音先锋久久久| 免费欧美电影| 亚洲蜜桃精久久久久久久| 欧美日韩在线一二三| 亚洲午夜久久久久久久久电影院 | 国产精品一级久久久| 性色av香蕉一区二区| 国产欧美69| 久久久91精品国产一区二区精品| 国产字幕视频一区二区| 久久久久久免费| 在线看片成人| 欧美精品久久久久久久久久| 一本久久青青| 国产欧美高清| 久久性天堂网| 亚洲人成小说网站色在线| 欧美视频中文一区二区三区在线观看| 亚洲午夜精品17c| 国产午夜精品理论片a级大结局 | 亚洲另类自拍| 国产精品黄视频| 欧美在线亚洲综合一区| 影音先锋另类| 欧美日本韩国一区| 午夜欧美视频| 在线国产亚洲欧美| 欧美剧在线免费观看网站| 亚洲午夜视频在线观看| 国产一区二区福利| 欧美二区不卡| 亚洲综合色激情五月| 国自产拍偷拍福利精品免费一| 女主播福利一区| 亚洲午夜精品一区二区三区他趣| 国产午夜久久久久| 蜜臀99久久精品久久久久久软件 | 一本到12不卡视频在线dvd | 亚洲特黄一级片| 国产综合精品| 欧美日本一区二区高清播放视频| 亚洲欧美影音先锋| 亚洲二区在线观看| 国产精品v欧美精品v日韩精品| 久久国产88| 99re66热这里只有精品3直播| 国产欧美日韩中文字幕在线| 欧美va亚洲va日韩∨a综合色| 亚洲一区日韩在线| 亚洲国产精品一区二区三区 | 99日韩精品| 国产亚洲精品aa| 欧美日韩1区| 久久xxxx| 999在线观看精品免费不卡网站| 国产欧美在线观看| 欧美激情久久久| 欧美中文在线字幕| 99国产一区二区三精品乱码| 国产日韩亚洲| 欧美精品日日鲁夜夜添| 欧美在线一级va免费观看| 9色porny自拍视频一区二区| 狠狠干成人综合网| 国产精品r级在线| 欧美xxx在线观看| 欧美一级片在线播放| 日韩亚洲欧美一区| 欲色影视综合吧| 国产精品亚洲综合天堂夜夜 | 国产欧美日韩一区二区三区在线 | 久久在线播放| 午夜精品视频在线观看一区二区| 亚洲国产天堂久久综合| 国产日本精品| 欧美色视频在线| 欧美成人免费网站| 久久精品视频亚洲| 亚洲综合另类| 夜夜嗨av一区二区三区中文字幕 | a91a精品视频在线观看| 在线成人h网| 国产一区999| 国产精品一区二区久久久久| 欧美日韩人人澡狠狠躁视频| 久久综合给合久久狠狠色| 欧美影院午夜播放| 亚洲一区在线免费| 99精品国产在热久久| 最新国产成人av网站网址麻豆 | 欧美一级淫片播放口| 亚洲午夜精品久久久久久app| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲资源av| 在线一区二区三区四区五区| 亚洲精品国产无天堂网2021| 一区二区三区在线视频免费观看| 国产欧美一区二区三区另类精品| 国产精品成人一区二区网站软件 | 国产精品日韩欧美一区| 欧美三级日韩三级国产三级| 欧美精品一区二区蜜臀亚洲| 欧美高清成人| 欧美成人精品一区二区| 开心色5月久久精品| 久久免费高清视频| 久久影视精品| 麻豆av一区二区三区久久| 久久婷婷影院| 久久最新视频| 免费在线亚洲| 欧美大秀在线观看| 欧美成人激情视频| 欧美成年人在线观看| 欧美不卡视频一区发布| 美乳少妇欧美精品| 女人天堂亚洲aⅴ在线观看| 欧美~级网站不卡| 欧美激情第一页xxx| 欧美日本乱大交xxxxx| 欧美日韩国产另类不卡| 欧美日韩在线免费视频|