![]() |
VOOZH | about |
dotnet add package SipNet --version 12.8.3
NuGet\Install-Package SipNet -Version 12.8.3
<PackageReference Include="SipNet" Version="12.8.3" />
<PackageVersion Include="SipNet" Version="12.8.3" />Directory.Packages.props
<PackageReference Include="SipNet" />Project file
paket add SipNet --version 12.8.3
#r "nuget: SipNet, 12.8.3"
#:package SipNet@12.8.3
#addin nuget:?package=SipNet&version=12.8.3Install as a Cake Addin
#tool nuget:?package=SipNet&version=12.8.3Install as a Cake Tool
👁 alternate text is missing from this package README image
👁 alternate text is missing from this package README image
👁 alternate text is missing from this package README image
👁 alternate text is missing from this package README image
⚠️ License Update (16 Jan 2026)
Thanks to the excellent DTLS & SRTP implementation by @jimm98y, the AGPL-licensed classes have been removed and this library is now free of GPL/AGPL constraints.
BSD 3-Clause License with an explicit prohibition on use by entities contributing to Israeli occupation or genocide.
For full license see LICENSE.
This fully C# library can be used to add Real-time Communications, typically audio and video calls, to .NET applications.
The diagram below is a high level overview of a Real-time audio and video call between Alice and Bob. It illustrates where the SipNet and associated libraries can help.
Supports both VoIP (get started) and WebRTC (get started).
Some of the protocols supported:
Media End Points - Audio/Video Sinks and Sources:
The main SipNet library does not provide access to audio and video devices or native codecs. Providing cross platform access to to these features on top of .NET is a large undertaking. A number of separate demonstration libraries show some different approaches to accessing audio/video devices and wrapping codecs with .NET.
This library provides only a small number of audio and video codecs (G711, G722 and G729). OPUS is available via Concentus. Additional codecs, particularly video ones, require C or C++ libraries. An effort is underway to port the VP8 video codec to C# see VP8.Net.
The library should work with .NET Framework >= 4.6.1 and all .NET Core and .NET versions. The demo applications initially targetted .NET Core 3.1 and are updated to later .NET versions as time and interest permit. The library is available via NuGet.
dotnet add package SipNet
With Visual Studio Package Manager Console (or search for SipNet on NuGet):
Install-Package SipNet
Class reference documentation and articles explaining common usage are available at https://Sip-Net.github.io/SipNet/.
The simplest possible example to place an audio-only SIP call is shown below. This example relies on the Windows specific SipNetMedia.Windows library to play the received audio and only works on Windows (due to lack of .NET audio device support on non-Windows platforms).
dotnet new console --name SIPGetStarted --framework net10.0 --target-framework-override net10.0-windows10.0.17763.0
cd SIPGetStarted
dotnet add package SipNet
dotnet add package SipNetMedia.Windows
# Paste the code below into Program.cs.
dotnet run
# If successful you will hear a "Hello World" announcement.
string DESTINATION = "music@iptel.org";
Console.WriteLine("SIP Get Started");
var userAgent = new SipNet.SIP.App.SIPUserAgent();
var winAudio = new SipNetMedia.Windows.WindowsAudioEndPoint(new SipNet.Media.AudioEncoder());
var voipMediaSession = new SipNet.Media.VoIPMediaSession(winAudio.ToMediaEndPoints());
// Place the call and wait for the result.
bool callResult = await userAgent.Call(DESTINATION, null, null, voipMediaSession);
Console.WriteLine($"Call result {(callResult ? "success" : "failure")}.");
Console.WriteLine("Press any key to hangup and exit.");
Console.ReadLine();
The GetStarted example contains the full source and project file for the example above.
The three key classes in the above example are described in dedicated articles:
The examples folder contains sample code to demonstrate other common SIP/VoIP cases.
The WebRTC specifications do not include directions about how signaling should be done (for VoIP the signaling protocol is SIP; WebRTC has no equivalent). The example below uses a simple JSON message exchange over web sockets for signaling. Part of the reason the Getting Started WebRTC is longer than the Getting Started VoIP example is the need for custom signaling.
The example requires two steps:
dotnet console application,The full project file and code are available at WebRTC Get Started.
The example relies on the Windows specific SipNetMedia.Encoders package, which is mainly a wrapper around libvpx. Hopefully in the future there will be equivalent packages for other platforms.
Step 1:
dotnet new console --name WebRTCGetStarted
cd WebRTCGetStarted
dotnet add package SipNet
dotnet add package SipNetMedia.Encoders
# Paste the code below into Program.cs.
dotnet run
using System;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using SipNet.Media;
using SipNet.Net;
using SipNetMedia.Encoders;
using WebSocketSharp.Server;
namespace demo
{
class Program
{
private const int WEBSOCKET_PORT = 8081;
static void Main()
{
Console.WriteLine("WebRTC Get Started");
// Start web socket.
Console.WriteLine("Starting web socket server...");
var webSocketServer = new WebSocketServer(IPAddress.Any, WEBSOCKET_PORT);
webSocketServer.AddWebSocketService<WebRTCWebSocketPeer>("/", (peer) => peer.CreatePeerConnection = () => CreatePeerConnection());
webSocketServer.Start();
Console.WriteLine($"Waiting for web socket connections on {webSocketServer.Address}:{webSocketServer.Port}...");
Console.WriteLine("Press any key exit.");
Console.ReadLine();
}
private static Task<RTCPeerConnection> CreatePeerConnection()
{
var pc = new RTCPeerConnection(null);
var testPatternSource = new VideoTestPatternSource(new VpxVideoEncoder());
MediaStreamTrack videoTrack = new MediaStreamTrack(testPatternSource.GetVideoSourceFormats(), MediaStreamStatusEnum.SendOnly);
pc.addTrack(videoTrack);
testPatternSource.OnVideoSourceEncodedSample += pc.SendVideo;
pc.OnVideoFormatsNegotiated += (formats) => testPatternSource.SetVideoSourceFormat(formats.First());
pc.onconnectionstatechange += async (state) =>
{
Console.WriteLine($"Peer connection state change to {state}.");
switch(state)
{
case RTCPeerConnectionState.connected:
await testPatternSource.StartVideo();
break;
case RTCPeerConnectionState.failed:
pc.Close("ice disconnection");
break;
case RTCPeerConnectionState.closed:
await testPatternSource.CloseVideo();
testPatternSource.Dispose();
break;
}
};
return Task.FromResult(pc);
}
}
}
Step 2:
Create an HTML file, paste the contents below into it, open it in a browser that supports WebRTC and finally press the start button.
<!DOCTYPE html>
<head>
<script type="text/javascript">
const WEBSOCKET_URL = "ws://127.0.0.1:8081/"
var pc, ws;
async function start() {
pc = new RTCPeerConnection();
pc.ontrack = evt => document.querySelector('#videoCtl').srcObject = evt.streams[0];
pc.onicecandidate = evt => evt.candidate && ws.send(JSON.stringify(evt.candidate));
ws = new WebSocket(document.querySelector('#websockurl').value, []);
ws.onmessage = async function (evt) {
var obj = JSON.parse(evt.data);
if (obj?.candidate) {
pc.addIceCandidate(obj);
}
else if (obj?.sdp) {
await pc.setRemoteDescription(new RTCSessionDescription(obj));
pc.createAnswer()
.then((answer) => pc.setLocalDescription(answer))
.then(() => ws.send(JSON.stringify(pc.localDescription)));
}
};
};
async function closePeer() {
await pc?.close();
await ws?.close();
};
</script>
</head>
<body>
<video controls autoplay="autoplay" id="videoCtl" width="640" height="480"></video>
<div>
<input type="text" id="websockurl" size="40" />
<button type="button" class="btn btn-success" onclick="start();">Start</button>
<button type="button" class="btn btn-success" onclick="closePeer();">Close</button>
</div>
</body>
<script>
document.querySelector('#websockurl').value = WEBSOCKET_URL;
</script>
Result:
If successful the browser should display a test pattern image.
The examples folder contains sample code to demonstrate other common WebRTC cases.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 net5.0 is compatible. net5.0-windows net5.0-windows was computed. net6.0 net6.0 is compatible. net6.0-android net6.0-android was computed. net6.0-ios net6.0-ios was computed. net6.0-maccatalyst net6.0-maccatalyst was computed. net6.0-macos net6.0-macos was computed. net6.0-tvos net6.0-tvos was computed. net6.0-windows net6.0-windows was computed. net7.0 net7.0 was computed. net7.0-android net7.0-android was computed. net7.0-ios net7.0-ios was computed. net7.0-maccatalyst net7.0-maccatalyst was computed. net7.0-macos net7.0-macos was computed. net7.0-tvos net7.0-tvos was computed. net7.0-windows net7.0-windows was computed. net8.0 net8.0 is compatible. net8.0-android net8.0-android was computed. net8.0-browser net8.0-browser was computed. net8.0-ios net8.0-ios was computed. net8.0-maccatalyst net8.0-maccatalyst was computed. net8.0-macos net8.0-macos was computed. net8.0-tvos net8.0-tvos was computed. net8.0-windows net8.0-windows was computed. net9.0 net9.0 is compatible. net9.0-android net9.0-android was computed. net9.0-browser net9.0-browser was computed. net9.0-ios net9.0-ios was computed. net9.0-maccatalyst net9.0-maccatalyst was computed. net9.0-macos net9.0-macos was computed. net9.0-tvos net9.0-tvos was computed. net9.0-windows net9.0-windows was computed. net10.0 net10.0 is compatible. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 netcoreapp2.0 was computed. netcoreapp2.1 netcoreapp2.1 was computed. netcoreapp2.2 netcoreapp2.2 was computed. netcoreapp3.0 netcoreapp3.0 was computed. netcoreapp3.1 netcoreapp3.1 is compatible. |
| .NET Standard | netstandard2.0 netstandard2.0 is compatible. netstandard2.1 netstandard2.1 is compatible. |
| .NET Framework | net461 net461 was computed. net462 net462 is compatible. net463 net463 was computed. net47 net47 was computed. net471 net471 was computed. net472 net472 was computed. net48 net48 was computed. net481 net481 was computed. |
| MonoAndroid | monoandroid monoandroid was computed. |
| MonoMac | monomac monomac was computed. |
| MonoTouch | monotouch monotouch was computed. |
| Tizen | tizen40 tizen40 was computed. tizen60 tizen60 was computed. |
| Xamarin.iOS | xamarinios xamarinios was computed. |
| Xamarin.Mac | xamarinmac xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos xamarinwatchos was computed. |
Showing the top 1 NuGet packages that depend on SipNet:
| Package | Downloads |
|---|---|
|
SipNet.OpenAI.Realtime
A .NET library for interacting with OpenAI's real-time WebRTC API. It provides helper classes to negotiate peer connections, send and receive Opus audio frames and exchange control messages over a data channel. Not an official OpenAI package and no affiliation with OpenAI. |
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 12.8.3 | 2,770 | 5/3/2026 |
| 1.0.100 | 24,978 | 5/3/2026 |
| 1.0.99 | 24,939 | 5/3/2026 |
| 1.0.98 | 24,938 | 5/3/2026 |
| 1.0.97 | 24,943 | 5/3/2026 |
| 1.0.96 | 24,938 | 5/3/2026 |
| 1.0.95 | 24,937 | 5/3/2026 |
| 1.0.94 | 24,944 | 5/3/2026 |
| 1.0.93 | 24,943 | 5/3/2026 |
| 1.0.92 | 24,945 | 5/3/2026 |
| 1.0.91 | 24,943 | 5/3/2026 |
| 1.0.90 | 24,945 | 5/3/2026 |
| 1.0.89 | 24,997 | 5/3/2026 |
| 1.0.88 | 24,939 | 5/3/2026 |
| 1.0.87 | 24,941 | 5/3/2026 |
| 1.0.86 | 24,944 | 5/3/2026 |
| 1.0.85 | 24,940 | 5/3/2026 |
| 1.0.84 | 24,938 | 5/3/2026 |
| 1.0.83 | 24,941 | 5/3/2026 |
| 1.0.10 | 24,941 | 5/3/2026 |