SIPSorcery 10.0.10
Prefix Reserveddotnet add package SIPSorcery --version 10.0.10
NuGet\Install-Package SIPSorcery -Version 10.0.10
<PackageReference Include="SIPSorcery" Version="10.0.10" />
<PackageVersion Include="SIPSorcery" Version="10.0.10" />
<PackageReference Include="SIPSorcery" />
paket add SIPSorcery --version 10.0.10
#r "nuget: SIPSorcery, 10.0.10"
#:package SIPSorcery@10.0.10
#addin nuget:?package=SIPSorcery&version=10.0.10
#tool nuget:?package=SIPSorcery&version=10.0.10
License
BSD 3-Clause License with an explicit prohibition on use by entities contributing to Israeli occupation or genocide.
For full license see LICENSE.
The SIPSorceryMediaFFmpeg library is licensed separately under GNU LGPL v2.1 see License
SIPSorcery Repository Overview
This repository is the home of the SIPSorcery project - a comprehensive real-time communications library for .NET that enables developers to add VoIP and WebRTC capabilities to their applications. The project consists of multiple packages and extensive examples to help you get started quickly.
Core Packages
| Package | Version | Downloads | Description | README |
|---|---|---|---|---|
| SIPSorcery | Core library with SIP, WebRTC, RTP, ICE, STUN, and SDP support | README | ||
| SIPSorceryMedia.Abstractions | Interfaces for audio/video encoders and device access | README | ||
| SIPSorceryMedia.Windows | Windows-specific audio capture and playback and video capture | README | ||
| SIPSorceryMedia.FFmpeg | Cross-platform media support using FFmpeg | README | ||
| SIPSorcery.OpenAI.Realtime | Support for OpenAI's Realtime WebRTC and SIP end points | README | ||
| SIPSorcery.VP8 | Pure C# VP8 video codec implementation | README |
Examples
This repository includes 70+ example projects demonstrating various SIP and WebRTC scenarios:
- SIP Examples - Basic calling, transfers, DTMF, registration, and more (README)
- WebRTC Examples - Video streaming, data channels, signaling patterns (README)
- SIP Scenarios - Call transfers, load testing, complex call flows (README)
- WebRTC Scenarios - Advanced WebRTC use cases (README)
- Softphone - Full-featured Windows Forms softphone application (README)
- OpenAI - Example applications for interacting with OpenAI's Realtime WebRTC and SIP end poiints (README)
What Is It?
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 SIPSorcery and associated libraries can help.

Supports both VoIP (get started) and WebRTC (get started).
Some of the protocols supported:
- Session Initiation Protocol (SIP),
- Real-time Transport Protocol (RTP),
- Web Real-time Communications (WebRTC), as of 26 Jan 2021 now an official IETF and W3C specification,
- Interactive Connectivity Establishment (ICE),
- SCTP, SDP, STUN and more.
Media End Points - Audio/Video Sinks and Sources:
The main
SIPSorcerylibrary does not provide access to audio and video devices or native codecs. Two separate library packages can be used depending on the runtime target:- SIPSorceryMedia.Windows: A Windows specific library that provides audio capture and playback.
- SIPSorceryMedia.FFmpeg: A cross platform library that can be used for high performance video codecs using PInvoke and FFmpeg.
This library includes audio codecs G711, G722, G729 and, thanks to Concentus, OPUS.
A C# port of the VP8 video codec is available at SIPSorcery.VP8 directory but it should be considered experimental and performs poorly at 1080p and greater. The advantage of the VP8 .NET port is it allows video streaming with NO native dependencies required.
High performance native video codecs (VP8, VP9, H264, H265 and AV1) are available via the SIPSorcery FFmpeg package which in turn depends on FFmpeg being available at runtime. These video codecs (H264 is the fastest) can be used to stream 4k video at 30fps on a typical Windows machine. See Video Pipeline Capacity below for some benchmarking results.
Installation
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 SIPSorcery
With Visual Studio Package Manager Console (or search for SIPSorcery on NuGet):
Install-Package SIPSorcery
FFmpeg Install
For Windows the easiest option is:
winget install "FFmpeg (Shared)" --version 8.1
Video Pipeline Capacity
Video processing — and encoding in particular — is generally the bottleneck in most real-time communications libraries. The original goal of the SIPSorcery library was to support 1080p video at 30 frames per second.
In June 2026, the new SIPSorcery.Cli tool was conceived to test various SIP, ICE, WebRTC, and benchmarking scenarios. The benchmarking has revealed that, thanks to the capabilities of the FFmpeg project (and the various libraries it in turn wraps), the SIPSorcery library running on a typical Windows machine with the H264 video codec is capable of processing 4K video at over 30fps and 1080p at over 100fps.
Sample test results are shown below.
Machine
| CPU | Cores | Logical processors | Memory |
|---|---|---|---|
| Intel(R) Core(TM) i9-10900 CPU @ 2.80GHz | 10 | 20 | 31.8 GB |
Results
| Preset | Encode vp8.net | Encode ffmpeg H264 | Encode ffmpeg VP8 | Decode H264 (ffmpeg) | Decode VP8 (ffmpeg) | Decode VP8 (vp8.net) | Plumbing (no codec) |
|---|---|---|---|---|---|---|---|
| 480p | 74.9 | 500.1 | 361.5 | 120 | 120 | 60 | 6435.4 |
| 720p | 23.3 | 341.1 | 132.4 | 120 | 120 | 30 | 1735.5 |
| 1080p | 9 | 174.3 | 52.8 | 120 | 120 | 15 | 1084.9 |
| 1440p | 5.1 | 95.1 | 37.7 | 90 | 90 | n/a | 525.3 |
| 4k | 1.9 | 48.7 | 31.6 | 30 | 30 | n/a | 367.3 |
Generated 2026-06-16 09:31; duration 6s/run, 1 run(s)/point.
Documentation
Class reference documentation and articles explaining common usage are available at https://sipsorcery-org.github.io/sipsorcery/.
Getting Started VoIP
The simplest possible example to place an audio-only SIP call is shown below. This example relies on the Windows specific SIPSorceryMedia.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 SIPSorcery
dotnet add package SIPSorceryMedia.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 SIPSorcery.SIP.App.SIPUserAgent();
var winAudio = new SIPSorceryMedia.Windows.WindowsAudioEndPoint(new SIPSorcery.Media.AudioEncoder());
var voipMediaSession = new SIPSorcery.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.
Getting Started WebRTC
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:
- Run the
dotnetconsole application, - Open an HTML page in a browser on the same machine.
The full project file and code are available at WebRTC Get Started.
Step 1:
dotnet new console --name WebRTCGetStarted
cd WebRTCGetStarted
dotnet add package SIPSorcery
dotnet add package SIPSorcery.VP8
# Paste the code below into Program.cs.
dotnet run
using System;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using SIPSorcery.Media;
using SIPSorcery.Net;
using Vpx.Net;
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 VP8Codec());
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 is compatible. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 is compatible. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
| .NET Framework | net461 was computed. net462 is compatible. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETCoreApp 3.1
- BouncyCastle.Cryptography (>= 2.6.2)
- Concentus (>= 2.2.2)
- DnsClient (>= 1.8.0)
- Makaretu.Dns.Multicast (>= 0.27.0)
- SIPSorcery.WebSocketSharp (>= 0.0.1)
- SIPSorceryMedia.Abstractions (>= 10.0.10)
-
.NETFramework 4.6.2
- BouncyCastle.Cryptography (>= 2.6.2)
- Concentus (>= 2.2.2)
- DnsClient (>= 1.8.0)
- Makaretu.Dns.Multicast (>= 0.27.0)
- Microsoft.Bcl.HashCode (>= 6.0.0)
- SIPSorcery.WebSocketSharp (>= 0.0.1)
- SIPSorceryMedia.Abstractions (>= 10.0.10)
- System.Memory (>= 4.6.3)
- System.Net.Security (>= 4.3.2)
- System.Net.WebSockets.Client (>= 4.3.2)
- System.ValueTuple (>= 4.5.0)
-
.NETStandard 2.0
- BouncyCastle.Cryptography (>= 2.6.2)
- Concentus (>= 2.2.2)
- DnsClient (>= 1.8.0)
- Makaretu.Dns.Multicast (>= 0.27.0)
- Microsoft.Bcl.HashCode (>= 6.0.0)
- SIPSorcery.WebSocketSharp (>= 0.0.1)
- SIPSorceryMedia.Abstractions (>= 10.0.10)
- System.Memory (>= 4.6.3)
-
.NETStandard 2.1
- BouncyCastle.Cryptography (>= 2.6.2)
- Concentus (>= 2.2.2)
- DnsClient (>= 1.8.0)
- Makaretu.Dns.Multicast (>= 0.27.0)
- SIPSorcery.WebSocketSharp (>= 0.0.1)
- SIPSorceryMedia.Abstractions (>= 10.0.10)
-
net10.0
- BouncyCastle.Cryptography (>= 2.6.2)
- Concentus (>= 2.2.2)
- DnsClient (>= 1.8.0)
- Makaretu.Dns.Multicast (>= 0.27.0)
- SIPSorcery.WebSocketSharp (>= 0.0.1)
- SIPSorceryMedia.Abstractions (>= 10.0.10)
-
net5.0
- BouncyCastle.Cryptography (>= 2.6.2)
- Concentus (>= 2.2.2)
- DnsClient (>= 1.8.0)
- Makaretu.Dns.Multicast (>= 0.27.0)
- SIPSorcery.WebSocketSharp (>= 0.0.1)
- SIPSorceryMedia.Abstractions (>= 10.0.10)
-
net6.0
- BouncyCastle.Cryptography (>= 2.6.2)
- Concentus (>= 2.2.2)
- DnsClient (>= 1.8.0)
- Makaretu.Dns.Multicast (>= 0.27.0)
- SIPSorcery.WebSocketSharp (>= 0.0.1)
- SIPSorceryMedia.Abstractions (>= 10.0.10)
-
net8.0
- BouncyCastle.Cryptography (>= 2.6.2)
- Concentus (>= 2.2.2)
- DnsClient (>= 1.8.0)
- Makaretu.Dns.Multicast (>= 0.27.0)
- SIPSorcery.WebSocketSharp (>= 0.0.1)
- SIPSorceryMedia.Abstractions (>= 10.0.10)
-
net9.0
- BouncyCastle.Cryptography (>= 2.6.2)
- Concentus (>= 2.2.2)
- DnsClient (>= 1.8.0)
- Makaretu.Dns.Multicast (>= 0.27.0)
- SIPSorcery.WebSocketSharp (>= 0.0.1)
- SIPSorceryMedia.Abstractions (>= 10.0.10)
NuGet packages (23)
Showing the top 5 NuGet packages that depend on SIPSorcery:
| Package | Downloads |
|---|---|
|
SIPSorceryMedia
The SIPSorcery package for WebRTC plumbing and Windows audio and video capture. |
|
|
ivrToolkit.Plugin.SipSorcery
A SipSorcery plugin for the IvrToolkit. For use with ivrToolkit.Core. 100% c# SIP |
|
|
Resonance.WebRTC
WebRTC Adapter for Resonance. Resonance is a high-performance real-time C# communication library with built-in support for several different transcoding and delivery methods. This library provides an intuitive API for asynchronous communication between machines and devices by exposing a set of easy to use, pluggable components. |
|
|
WebRTCme
WebRTC library with a single, unified API for .NET MAUI and Blazor middlewares/applications. |
|
|
WebRTC.Healthcheck
Simple healthcheck for WebRTC |
GitHub repositories (5)
Showing the top 5 popular GitHub repositories that depend on SIPSorcery:
| Repository | Stars |
|---|---|
|
odedshimon/BruteShark
Network Analysis Tool
|
|
|
melihercan/WebRTCme
A cross-platform framework for adding WebRTC support to .NET MAUI, Blazor, and Desktop applications by using a single unified .NET/C# API.
|
|
|
qiuqiuqiu131/SukiChat.Client
|
|
|
friflo/Friflo.Json.Fliox
C# ORM - High Performance, SQL, NoSQL, Messaging, Pub-Sub
|
|
|
NethermindEth/dotnet-libp2p
A libp2p implementation for .NET in C#.
|
| Version | Downloads | Last Updated |
|---|---|---|
| 10.0.10 | 148 | 6/17/2026 |
| 10.0.9 | 2,370 | 6/7/2026 |
| 10.0.8 | 6,822 | 5/23/2026 |
| 10.0.7 | 2,252 | 5/18/2026 |
| 10.0.6 | 25,734 | 4/28/2026 |
| 10.0.5 | 5,172 | 4/24/2026 |
| 10.0.4-pre | 1,611 | 1/16/2026 |
| 10.0.3 | 82,336 | 1/15/2026 |
| 10.0.2 | 4,394 | 1/13/2026 |
| 10.0.1 | 4,847 | 1/10/2026 |
| 8.0.23 | 110,293 | 7/15/2025 |
| 8.0.22 | 23,001 | 6/4/2025 |
| 8.0.21-pre | 278 | 6/3/2025 |
| 8.0.20-pre | 335 | 6/1/2025 |
| 8.0.15-pre | 314 | 5/17/2025 |
| 8.0.14 | 29,707 | 5/8/2025 |
| 8.0.13 | 6,593 | 5/1/2025 |
| 8.0.12 | 7,141 | 4/24/2025 |
| 8.0.11 | 20,725 | 3/13/2025 |
| 8.0.10 | 5,680 | 3/9/2025 |
-v10.0.10: Bug fixes. Adjust restriction on remote peer endpoints when blocking WebRTC RTP traffic.
-v10.0.9: Fix for RTP and STUN packet minimum length DoS vulnerability.
-v10.0.8: Bug fixes.
-v10.0.7: Network address change fix for Unity.
-v10.0.6: Bug fixes.
-v10.0.5: Stable release. Bug fixes.
-v10.0.4-pre: New SRTP and DTLS implementation (huge thanks to @jimm98y).
-v10.0.3: Removed null SRTP ciphers.
-v10.0.2: Removed use of master key index for SRTP.
-v10.0.1: Support for .NET 10.0 added.
-v8.0.23: Bug fixes.
-v8.0.22: Stable release.
-v8.0.21-pre: Improvements to OPUS encoder wiring.
-v8.0.20-pre: Improvements to the audio pipeline to avoid consumers needing to handle raw RTP packets.
-v8.0.15-pre: BouncyCastle update (thanks to @joaoladeiraext).
-v8.0.14: Fix for OPUS codec using multiple channels.
-v8.0.13: Added ASP.NET web socket signalling option for WebRTC. Bug fixes.
-v8.0.12: Bug fixes.
-v8.0.11: Real-time text (thanks to @xBasov). Bug fixes.
-v8.0.10: H265 and MJEG packetisation (thanks to @Drescher86), RTCP feedback improvements (thanks to @ispysoftware).
-v8.0.9: Minor improvements and bug fixes.
-v8.0.7: Bug fixes and all sipsorcery packages release.
-v8.0.6: Nuget publish.
-v8.0.4: Bug fixes.
-v8.0.3: Bug fixes.
-v8.0.1-pre: Performance improvements (thanks to @weltmeyer). Add ECDSA as default option for WebRTC DTLS.
-v8.0.0: RTP header extension improvements (thanks to @ChristopheI). Major version to 8 to reflect highest .net runtime supported.