基于 C# 实现 P2P 视频和聊天工具结合 UDP 协议和 OMCS 音视频框架支持跨平台Windows/Linux运行。一、项目架构与技术选型模块技术实现音视频采集DirectShowWindows / V4L2Linux OpenCV 预处理网络传输UDP 套接字支持 NAT 穿透 自定义信令协议音视频编码H.264视频 / AAC音频 MediaFoundationWindows / FFmpegLinux信令控制自定义 JSON 协议含心跳、SDP 描述、ICE 候选跨平台支持.NET 6 C# 10 P/Invoke 调用原生 API二、核心代码实现1. 音视频采集与编码Windows 示例1234567891011121314151617181920212223242526272829303132333435363738usingSystem;usingSystem.Drawing;usingDirectShowLib;usingMediaFoundation;publicclassMediaCapture{privateDsDevice _videoDevice;privateIMFSourceReader _videoReader;privateIMFSinkWriter _videoWriter;publicvoidInitializeCamera(){// 获取默认摄像头_videoDevice DsDevice.GetDevicesByClass(DsClass.VideoInputDevice).FirstOrDefault();if(_videoDevice null)thrownewException(未检测到摄像头);// 初始化 MediaFoundation 编码器MFStartup(MF_VERSION);_videoReader newMFSourceReader();_videoReader.SetDevice(_videoDevice.MonikerString);// 配置编码参数H.264 AACvar videoMediaType MFMediaType.CreateVideo(MediaTypeGuids.H264);videoMediaType.SetUINT32(MF_MT_FRAME_RATE, 30);videoMediaType.SetUINT32(MF_MT_FRAME_SIZE_WIDTH, 640);videoMediaType.SetUINT32(MF_MT_FRAME_SIZE_HEIGHT, 480);_videoWriter newMFSinkWriter();_videoWriter.AddStream(videoMediaType);}publicBitmap CaptureFrame(){// 从摄像头读取一帧_videoReader.GetCurrentBuffer(out_videoReader.BufferCount,out_videoReader.Buffer);return(Bitmap)_videoReader.Buffer.ToImage();}}2. UDP 信令服务器处理连接请求123456789101112131415161718192021222324252627282930313233343536373839usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Text;publicclassSignalServer{privateUdpClient _udpServer;privateIPEndPoint _endPoint;publicSignalServer(intport){_udpServer newUdpClient(port);_endPoint newIPEndPoint(IPAddress.Any, 0);}publicasync Task ListenForRequests(){while(true){var result await _udpServer.ReceiveAsync();stringmessage Encoding.UTF8.GetString(result.Buffer);// 解析信令消息如视频请求、ICE 候选HandleSignalingMessage(result.Buffer, result.RemoteEndPoint);}}privatevoidHandleSignalingMessage(byte[] data, IPEndPoint remoteEP){// 示例处理视频请求var request JsonSerializer.DeserializeVideoRequest(Encoding.UTF8.GetString(data));if(request.Type video_invite){// 回复 SDP 描述和 ICE 候选var response newVideoResponse { Type video_offer, Sdp GenerateSdp() };_udpServer.Send(Encoding.UTF8.GetBytes(JsonSerializer.Serialize(response)), response.Length, remoteEP);}}}3. P2P 连接建立ICE 协商123456789101112131415161718192021publicclassIceNegotiator{privateListIceCandidate _localCandidates new();privateUdpClient _iceSocket;publicvoidStartIceCandidateDiscovery(){// 生成本地 ICE 候选STUN/TURN 服务器可选_localCandidates.Add(newIceCandidate { Candidate candidate:1, SdpMid 0});// 发送候选到对端SendCandidateToPeer(_localCandidates[0]);}privatevoidSendCandidateToPeer(IceCandidate candidate){var msg new{ Type ice_candidate, Candidate candidate };byte[] data Encoding.UTF8.GetBytes(JsonSerializer.Serialize(msg));_iceSocket.Send(data, data.Length, _peerEndPoint);}}4. 音视频传输RTP 封装123456789101112131415161718192021222324252627publicclassRtpStreamer{privateUdpClient _rtpSocket;privateint_sequenceNumber 0;privateDateTime _startTime;publicvoidSendPacket(byte[] payload,intpayloadType){// RTP 头部封装byte[] header newbyte[12]{(byte)(0x80 | payloadType),// 版本2 无填充 无扩展 CSRC计数0(byte)_sequenceNumber,(byte)(_sequenceNumber 8),(byte)(_timestamp 24),(byte)(_timestamp 16),(byte)(_timestamp 8),(byte)_timestamp,(byte)(_ssrc 24),(byte)(_ssrc 16),(byte)(_ssrc 8),(byte)_ssrc};_rtpSocket.Send(header.Concat(payload).ToArray(), _rtpSocket.Client.LocalEndPoint);}}三、关键功能实现说明1. NAT 穿透方案STUN 服务器获取公网 IP 和端口使用stun:stun.l.google.com:19302TURN 服务器中继传输开源方案如coturnICE 框架自动选择最佳路径直连优先失败切换 TURN2. 音视频同步时间戳对齐RTP 包携带 NTP 时间戳客户端根据时间戳播放抖动缓冲动态调整缓冲区大小默认 100ms ~ 500ms3. 性能优化硬件加速NVIDIA NVENC / Intel Quick Sync 编码通过 MediaFoundation 调用码率自适应根据网络状况动态调整分辨率如 720p → 480p四、依赖库与部署组件说明安装命令OMCS音视频框架支持多路混流、网络传输NuGet:Install-Package OMCSFFmpeg.AutoGen跨平台音视频编解码Linux 必需NuGet:Install-Package FFmpegWebRTC.Native提供 ICE/STUN/TURN 实现NuGet:Install-Package WebRTC部署步骤在 Visual Studio 2022 中创建 .NET 6 控制台项目安装上述 NuGet 包配置appsettings.json123456{StunServer:stun:stun.l.google.com:19302,TurnServer:turn:your-turn-server:3478,VideoCodec:H264,AudioCodec:AAC}以上就是基于C#实现的P2P视频 聊天工具的详细内容