基于 C# 实现 P2P 视频聊天工具
基于 C# 实现 P2P 视频聊天工具,结合 UDP 协议和 OMCS 音视频框架,支持跨平台(Windows/Linux)运行。
一、项目架构与技术选型
| 模块 | 技术实现 |
|---|---|
| 音视频采集 | DirectShow(Windows) / V4L2(Linux) + OpenCV 预处理 |
| 网络传输 | UDP 套接字(支持 NAT 穿透) + 自定义信令协议 |
| 音视频编码 | H.264(视频) / AAC(音频) + MediaFoundation(Windows) / FFmpeg(Linux) |
| 信令控制 | 自定义 JSON 协议(含心跳、SDP 描述、ICE 候选) |
| 跨平台支持 | .NET 6 + C# 10 + P/Invoke 调用原生 API |
二、核心代码实现
1. 音视频采集与编码(Windows 示例)
using System;
using System.Drawing;
using DirectShowLib;
using MediaFoundation;
public class MediaCapture
{
private DsDevice _videoDevice;
private IMFSourceReader _videoReader;
private IMFSinkWriter _videoWriter;
public void InitializeCamera()
{
// 获取默认摄像头
_videoDevice = DsDevice.GetDevicesByClass(DsClass.VideoInputDevice).FirstOrDefault();
if (_videoDevice == null) throw new Exception("未检测到摄像头");
// 初始化 MediaFoundation 编码器
MFStartup(MF_VERSION);
_videoReader = new MFSourceReader();
_videoReader.SetDevice(_videoDevice.MonikerString);
// 配置编码参数(H.264 + AAC)
var 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 = new MFSinkWriter();
_videoWriter.AddStream(videoMediaType);
}
public Bitmap CaptureFrame()
{
// 从摄像头读取一帧
_videoReader.GetCurrentBuffer(out _videoReader.BufferCount, out _videoReader.Buffer);
return (Bitmap)_videoReader.Buffer.ToImage();
}
}
2. UDP 信令服务器(处理连接请求)
using System.Net;
using System.Net.Sockets;
using System.Text;
public class SignalServer
{
private UdpClient _udpServer;
private IPEndPoint _endPoint;
public SignalServer(int port)
{
_udpServer = new UdpClient(port);
_endPoint = new IPEndPoint(IPAddress.Any, 0);
}
public async Task ListenForRequests()
{
while (true)
{
var result = await _udpServer.ReceiveAsync();
string message = Encoding.UTF8.GetString(result.Buffer);
// 解析信令消息(如视频请求、ICE 候选)
HandleSignalingMessage(result.Buffer, result.RemoteEndPoint);
}
}
private void HandleSignalingMessage(byte[] data, IPEndPoint remoteEP)
{
// 示例:处理视频请求
var request = JsonSerializer.Deserialize<VideoRequest>(Encoding.UTF8.GetString(data));
if (request.Type == "video_invite")
{
// 回复 SDP 描述和 ICE 候选
var response = new VideoResponse { Type = "video_offer", Sdp = GenerateSdp() };
_udpServer.Send(Encoding.UTF8.GetBytes(JsonSerializer.Serialize(response)), response.Length, remoteEP);
}
}
}
3. P2P 连接建立(ICE 协商)
public class IceNegotiator
{
private List<IceCandidate> _localCandidates = new();
private UdpClient _iceSocket;
public void StartIceCandidateDiscovery()
{
// 生成本地 ICE 候选(STUN/TURN 服务器可选)
_localCandidates.Add(new IceCandidate { Candidate = "candidate:1", SdpMid = "0" });
// 发送候选到对端
SendCandidateToPeer(_localCandidates[0]);
}
private void SendCandidateToPeer(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 封装)
public class RtpStreamer
{
private UdpClient _rtpSocket;
private int _sequenceNumber = 0;
private DateTime _startTime;
public void SendPacket(byte[] payload, int payloadType)
{
// RTP 头部封装
byte[] header = new byte[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:19302) - TURN 服务器:中继传输(开源方案如
coturn) - ICE 框架:自动选择最佳路径(直连优先,失败切换 TURN)
2. 音视频同步
- 时间戳对齐:RTP 包携带 NTP 时间戳,客户端根据时间戳播放
- 抖动缓冲:动态调整缓冲区大小(默认 100ms ~ 500ms)
3. 性能优化
- 硬件加速:NVIDIA NVENC / Intel Quick Sync 编码(通过 MediaFoundation 调用)
- 码率自适应:根据网络状况动态调整分辨率(如 720p → 480p)
参考代码 P2P视频聊天工具源码(C#) www.youwenfan.com/contentcno/93858.html
四、依赖库与部署
| 组件 | 说明 | 安装命令 |
|---|---|---|
| OMCS | 音视频框架(支持多路混流、网络传输) | NuGet: Install-Package OMCS |
| FFmpeg.AutoGen | 跨平台音视频编解码(Linux 必需) | NuGet: Install-Package FFmpeg |
| WebRTC.Native | 提供 ICE/STUN/TURN 实现 | NuGet: Install-Package WebRTC |
部署步骤:
-
在 Visual Studio 2022 中创建 .NET 6 控制台项目
-
安装上述 NuGet 包
-
配置
appsettings.json:{ "StunServer": "stun:stun.l.google.com:19302", "TurnServer": "turn:your-turn-server:3478", "VideoCodec": "H264", "AudioCodec": "AAC" }
浙公网安备 33010602011771号