Last updated: September 2026
Media Player SDK .NET vs LibVLCSharp
Professioneller .NET Video-Player-Vergleich
Suchen Sie eine LibVLCSharp-Alternative mit DVD-Navigation, Audio-Effekten, virtuellem Kamera-Output und Bewegungserkennung? Dieser Vergleich bewertet VisioForge Media Player SDK .NET gegenüber LibVLCSharp für die .NET-Video-Player-Entwicklung — einschließlich WPF, WinForms, Avalonia und plattformübergreifender Wiedergabeszenarien. Ob Sie einen DirectShow-basierten Windows-Player oder eine GStreamer-basierte plattformübergreifende Lösung benötigen, dieser Leitfaden hilft Ihnen bei der Auswahl des richtigen .NET Media Player SDK.
Ab 250€/Jahr · Lifetime-Lizenz ab 750€
Zusammenfassung
| Aspekt | Media Player SDK .NET | LibVLCSharp |
|---|---|---|
| Architektur | Dual-Engine (DirectShow + GStreamer) | Monolithische VLC-Engine über libvlc C-Interop |
| Engines | MediaPlayerCore (Windows) + MediaPlayerCoreX (plattformübergreifend) | Einzelner LibVLC-Kern |
| Preise | EUR 250-500·Jahr oder EUR 750-1.500 lebenslang | Kostenlos (LGPL 2.1) |
| Ideal für | Professionelle Apps, DVD, Effekte, Broadcast | Einfache Wiedergabe, breiteste Formatunterstützung |
| Lernkurve | Moderat (zwei Engines, umfangreiche API) | Einfach (minimale API) |
Architektur im Detail
Media Player SDK .NET — Dual-Engine-Design
Zwei unabhängige Engines werden in einem einzigen SDK geliefert. MediaPlayerCore (Windows) bietet DirectShow / Media Foundation / FFMPEG- und VLC-Decoder mit DVD-Navigation, Playlist, PiP, OSD, virtueller Kamera, NDI-Output und über 40 Audio-Effekten. MediaPlayerCoreX (plattformübergreifend) nutzt eine GStreamer-basierte Pipeline mit Async-First-API für Windows, macOS, Linux, iOS und Android.
- ▶DirectShow / Media Foundation / FFMPEG- und VLC-Decoder unter Windows
- ▶DVD-Navigation, Playlist, PiP, OSD, virtuelle Kamera, NDI-Output
- ▶Über 40 Audio-Effekte einschließlich DirectSound-Effekte
- ▶Mehrere Wiedergabe-Engines über Source_Mode auswählbar
- ▶GStreamer-basierte plattformübergreifende Pipeline mit Async-First-API
- ▶VR/360-Video und Echtzeit-Video-/Audio-Effekte
LibVLCSharp — Einzelne VLC-Engine
LibVLCSharp umhüllt LibVLC (die VLC Media Player-Engine) und bietet eine einheitliche API über alle Plattformen hinweg. Es ist auf Wiedergabe fokussiert mit begrenzten Verarbeitungsmöglichkeiten, profitiert aber vom kampferprobten VLC-Decoder-Stack und der breitesten Formatkompatibilität.
- ▶Umhüllt LibVLC — die VLC Media Player-Engine
- ▶Einheitliche API über alle Plattformen
- ▶Auf Wiedergabe fokussiert mit begrenzten Verarbeitungsmöglichkeiten
- ▶Kampferprobter VLC-Decoder-Stack
- ▶Chromecast- und Netzwerk-Browsing-Unterstützung
- ▶Große Community und umfangreiche Dokumentation
Wichtige architektonische Unterschiede
| Aspekt | Media Player SDK | LibVLCSharp |
|---|---|---|
| Engine-Design | Dual-Engine: DirectShow-basiert (Windows) + GStreamer-basiert (plattformübergreifend) | Einzelne monolithische VLC-Engine |
| Audio-Verarbeitung | Über 40 typisierte Audio-Effekte mit Band-EQ, Kompressor, Reverb, Chorus | Nur grundlegende EQ-Presets |
| Video-Verarbeitung | CPU + GPU-Effekt-Pipelines, Chroma Key, PiP, OSD-Overlays | Grundlegende VLC-Filter über String-Optionen |
| Ausgabemöglichkeiten | Virtuelle Kamera, NDI, Multi-Screen-Anzeige | Chromecast, Netzwerk-Browsing (SMB, FTP, UPnP) |
| Erkennung | Gesichts-, Bewegungs-, Barcode-/QR-Erkennung integriert | Keine Erkennungsfähigkeiten |
| API-Stil | Stark typisierte .NET-API mit IntelliSense | Einfache API — Wiedergabe in 3 Zeilen C# |
Feature-für-Feature-Vergleich
Wiedergabe
| Feature | Media Player SDK | LibVLCSharp |
|---|---|---|
| Dateiwiedergabe (500+ Formate) | ✅ | ✅(Breiteste über VLC) |
| Netzwerk-Streaming (RTSP, RTMP, HLS, DASH) | ✅ | ✅ |
| DVD-Navigation (Menüs, Kapitel, Titel) | ✅ | ✅ |
| Blu-ray-Menüs | ❌ | ✅ |
| Untertitel (SRT, SSA/ASS, WebVTT, VobSub, PGS) | ✅ | ✅ |
| 360 / VR-Video | ✅ | ✅ |
| HDR-Wiedergabe | ⚠️ | ✅(Mit Tonemap) |
| MIDI-Wiedergabe | ✅ | ❌ |
| Verschlüsselte Medien | ✅ | ❌ |
| SRT / NDI-Eingang | ✅ | ❌ |
Audio
| Feature | Media Player SDK | LibVLCSharp |
|---|---|---|
| Audio-Effekte (40+ EQ, Reverb, Chorus, 3D) | ✅ | ⚠️(Nur grundlegender EQ) |
| Professionelles VU-Meter + FFT | ✅ | ❌ |
| Audio-Enhancer (Normalisierung, Auto-Gain) | ✅ | ❌ |
| Audio-Mixing (externe Spuren hinzufügen) | ✅ | ❌ |
| Kanal-Mapper | ✅ | ❌ |
Videoverarbeitung
| Feature | Media Player SDK | LibVLCSharp |
|---|---|---|
| Echtzeit-Videoeffekte (CPU + GPU) | ✅ | ⚠️(Grundlegende VLC-Filter) |
| Chroma Key (Greenscreen) | ✅ | ❌ |
| KI-Video-Upscaling | ✅ | ❌ |
| LUT-Farbkorrektur | ✅ | ❌ |
| Bild-in-Bild | ✅ | ❌ |
| OSD-Overlay-System (Multi-Layer) | ✅ | ⚠️(Einfaches Marquee) |
| Videokomposition | ✅ | ❌ |
Ausgabe
| Feature | Media Player SDK | LibVLCSharp |
|---|---|---|
| Virtuelle Kamera-Ausgabe | ✅ | ❌ |
| NDI-Ausgabe | ✅ | ❌ |
| Multi-Screen-Anzeige | ✅ | ❌ |
Erkennung und Analyse
| Feature | Media Player SDK | LibVLCSharp |
|---|---|---|
| Gesichtserkennung | ✅ | ❌ |
| Bewegungserkennung | ✅ | ❌ |
| KI-Objekterkennung | ❌ | ❌ |
| Barcode- / QR-Scanning | ✅ | ❌ |
Wiedergabesteuerung
| Feature | Media Player SDK | LibVLCSharp |
|---|---|---|
| Variable Geschwindigkeit | ✅ | ✅ |
| Frame-Stepping (Vorwärts + Rückwärts) | ✅ | ⚠️(Nur vorwärts) |
| Rückwärtswiedergabe | ✅ | ❌ |
| Frame-genaues Suchen | ✅ | ⚠️(Keyframe-basiert) |
| Playlist-Verwaltung (integriert) | ✅ | ⚠️(Manuell) |
| Schleife mit Ereignissen | ✅ | ✅ |
| Segmentwiedergabe | ✅ | ⚠️ |
Frame-Aufnahme
| Feature | Media Player SDK | LibVLCSharp |
|---|---|---|
| Snapshot in Datei (JPEG, PNG, BMP) | ✅ | ✅ |
| Snapshot in Bitmap / SKBitmap / byte[] | ✅ | ⚠️ |
Netzwerk
| Feature | Media Player SDK | LibVLCSharp |
|---|---|---|
| Chromecast | ❌ | ✅ |
| Netzwerk-Browsing (SMB, FTP, UPnP) | ❌ | ✅ |
| SSDP / UPnP-Erkennung | ❌ | ✅ |
Plattformunterstützung
Betriebssystemkompatibilität
| Plattform | Media Player SDK | LibVLCSharp |
|---|---|---|
| Windows 7-11 | ✅ | ✅ |
| macOS 10.15+ | ✅ | ✅(LibVLC unterstützt 10.7+) |
| Linux | ✅ | ✅ |
| Android 7.0+ | ✅ | ✅(LibVLC unterstützt 2.3+) |
| iOS 13+ | ✅ | ✅(LibVLC unterstützt 8.4+) |
| tvOS | ❌ | ✅ |
UI-Framework-Kompatibilität
| Framework | Media Player SDK | LibVLCSharp |
|---|---|---|
| WinForms | ✅ | ✅ |
| WPF | ✅ | ✅ |
| WinUI 3 | ✅ | ⚠️(Community) |
| .NET MAUI | ✅ | ✅ |
| Avalonia | ✅ | ✅ |
| Uno Platform | ✅ | ⚠️(Eingeschränkt) |
| Xamarin | ✅ | ✅ |
| Console | ✅ | ✅ |
Preisvergleich
Media Player SDK .NET Preise
1 Entwickler — Datei-/Stream-Wiedergabe, Untertitel, grundlegende Effekte
1 Entwickler — + Netzwerk-Streaming (RTSP, RTMP, HLS, NDI), Bewegungserkennung, HW-Beschleunigung
1 Entwickler — + VR/360-Video
alle Entwickler der kaufenden Organisation an einem Standort in einer Stadt, unbefristete Lizenz, gesamtes Team
alle Entwickler der kaufenden Organisation an einem Standort in einer Stadt, unbefristete Lizenz, gesamtes Team
alle Entwickler der kaufenden Organisation an einem Standort in einer Stadt, unbefristete Lizenz, gesamtes Team
All licenses include:
- ✓ Lizenzgebührenfreie Verteilung
- ✓ Keine Laufzeitgebühren
- ✓ Alle Quellcode-Beispiele
- ✓ Kostenlos für nicht-kommerzielle Nutzung (Lizenzschlüssel erforderlich)
- ✓ E-Mail-Support
LibVLCSharp Kosten
LGPL 2.1-Lizenz — dynamisches Linking erforderlich
Bezahlte Beratung von VideoLAN verfügbar
LGPL-Compliance-Überlegungen
LibVLCSharp und libvlc sind unter LGPL 2.1 lizenziert. Das bedeutet, dass Sie sie in kommerzieller proprietärer Software verwenden können, solange Sie die LGPL-Bedingungen einhalten. Wichtige Anforderungen umfassen:
- ⚠Muss dynamisch an libvlc linken (kein statisches Linking)
- ⚠Muss Benutzern erlauben, LibVLC-DLLs durch modifizierte Versionen zu ersetzen
- ⚠Muss eine Kopie der LGPL-Lizenz beifügen und die Nutzung von libvlc erwähnen
- ⚠Kann VLC-Code nicht modifizieren und als Closed Source nutzen
- ⚠Einige Rechtsabteilungen in Unternehmen erfordern kommerzielle Lizenzen zur Vermeidung von LGPL-Compliance-Risiken
Obwohl LGPL freizügiger als GPL ist, erfordert die Einhaltung dennoch sorgfältige Beachtung der Linking- und Verteilungsanforderungen. Media Player SDK bietet lizenzgebührenfreie Verteilung ohne LGPL-Dynamic-Linking-Einschränkungen.
Ab 250€/Jahr · Lifetime-Lizenz ab 750€
Codebeispiele
Beispiel 1: Einfache Dateiwiedergabe
Media Player SDK (MediaPlayerCoreX)
C#var player = new MediaPlayerCoreX(videoView);
var source = await UniversalSourceSettingsV2.CreateAsync(
new Uri("video.mp4"));
await player.OpenAsync(source);
await player.PlayAsync();
// Position and duration
var duration = await player.DurationAsync();
await player.Position_SetAsync(
TimeSpan.FromSeconds(30));LibVLCSharp
C#Core.Initialize();
var libVLC = new LibVLC();
var mediaPlayer = new MediaPlayer(libVLC);
mediaPlayer.Play(
new Media(libVLC, "video.mp4",
FromType.FromPath));
// Position and duration
var duration = mediaPlayer.Length; // ms
mediaPlayer.Time = 30000; // msBeispiel 2: DVD mit Navigation
Media Player SDK (MediaPlayerCore)
C#var player = new MediaPlayerCore(videoView);
player.Source_Mode = MediaPlayerSourceMode.DVD_DS;
player.Playlist_Clear();
player.Playlist_Add(@"D:\\");
await player.PlayAsync();
// Save bookmark for later resume
int savedTitle = player.DVD_Title_GetCurrent();
int savedChapter = player.DVD_Chapter_GetCurrent();
var savedPosition = await player.Position_GetAsync();
Console.WriteLine(
$"Bookmarked: Title {savedTitle}, " +
$"Chapter {savedChapter}, " +
$"Position {savedPosition}");
// Resume from saved bookmark
await player.DVD_Title_PlayAsync(savedTitle);
await player.DVD_Chapter_SelectAsync(savedChapter);
await player.Position_SetAsync(savedPosition);
// Navigate using title/chapter jumps
await player.DVD_Menu_ShowAsync(DVDMenu.Title);
await player.DVD_Chapter_NextAsync();LibVLCSharp
C#Core.Initialize();
var libVLC = new LibVLC();
var mediaPlayer = new MediaPlayer(libVLC);
mediaPlayer.Play(
new Media(libVLC, "dvd:///D:",
FromType.FromLocation));
// DVD navigation via mediaPlayer methods
mediaPlayer.Navigate(NavigateMode.Up);
mediaPlayer.Navigate(NavigateMode.Activate);
// Less granular control than Media Player SDK
// No bookmark/resume API
// Limited chapter/title managementBeispiel 3: Audioverarbeitung mit Effekten
Media Player SDK (MediaPlayerCore)
C#var player = new MediaPlayerCore(videoView);
player.Playlist_Clear();
player.Playlist_Add("podcast.mp3");
player.Audio_Effects_Enabled = true;
// Register 10-band EQ and DMO compressor
player.Audio_Effects_Add(-1,
AudioEffectType.Equalizer, "gfxEq",
true, TimeSpan.Zero, TimeSpan.Zero);
player.Audio_Effects_Add(-1,
AudioEffectType.DMOCompressor, "comp",
true, TimeSpan.Zero, TimeSpan.Zero);
await player.PlayAsync();
// Custom per-band EQ values (dB, integer)
int[] bands = { -4, -2, 0, 3, 5,
6, 5, 4, 2, -1 };
for (int i = 0; i < bands.Length; i++)
player.Audio_Effects_Equalizer_Band_Set(
-1, "gfxEq", i, bands[i]);
// DMO Compressor for consistent loudness
// Audio_Effects_DS_Compressor(streamIndex, name,
// attack, gain, preDelay, ratio, release, threshold)
player.Audio_Effects_DS_Compressor(
-1, "comp",
10f, 5f, 0f, 4f, 200f, -20f);
// Monitor peak levels via VU meter event
player.Audio_VUMeter_Enabled = true;
player.OnAudioVUMeter += (s, e) =>
Console.WriteLine(
$"L: {e.MeterData[0]}, R: {e.MeterData[1]}");LibVLCSharp
C#Core.Initialize();
var libVLC = new LibVLC();
var mediaPlayer = new MediaPlayer(libVLC);
mediaPlayer.Play(
new Media(libVLC, "music.mp3",
FromType.FromPath));
// Basic equalizer only
var eq = new Equalizer(1); // preset index
mediaPlayer.SetEqualizer(eq);
// No VU meter
// No FFT spectrum analysis
// No 3D sound
// No reverb, chorus, or compressor
// No per-band EQ control
// No audio level monitoringBeispiel 4: Virtuelle Kamera + NDI-Ausgabe
Media Player SDK (MediaPlayerCore)
C#var player = new MediaPlayerCore(videoView);
player.Playlist_Clear();
player.Playlist_Add("presentation.mp4");
// Output to virtual camera (Zoom, Teams, OBS)
player.Virtual_Camera_Output_Enabled = true;
// Output to NDI network
player.NDI_Output = new NDIOutput
{
Name = "Studio Feed"
};
// Add OSD overlay
player.OSD_Enabled = true;
player.OSD_Layers_Create(
0, 0, 1920, 1080, true);
player.OSD_Layers_Draw_Text(
0, 10, 10, "LIVE",
new Font("Arial", 36), Color.Red);
player.OSD_Layers_Render();
await player.PlayAsync();LibVLCSharp
C#// Virtual camera output: NOT AVAILABLE
// NDI output: NOT AVAILABLE
// OSD overlay: Limited to VLC marquee
Core.Initialize();
var libVLC = new LibVLC();
var mediaPlayer = new MediaPlayer(libVLC);
var media = new Media(libVLC,
"presentation.mp4",
FromType.FromPath);
media.AddOption(":sub-filter=marq");
media.AddOption(":marq-marquee=LIVE");
mediaPlayer.Play(media);
// No virtual camera
// No NDI
// No rich OSD layersBeispiel 5: Bewegungs- und Gesichtserkennung
Media Player SDK (MediaPlayerCore)
C#var player = new MediaPlayerCore(videoView);
player.Playlist_Clear();
player.Playlist_Add("lobby_feed.mp4");
// Face detection with highlight
player.Face_Tracking = new FaceTrackingSettings
{
Highlight = true,
ScaleFactor = 1.1f,
MinimumWindowSize = 25
};
player.OnFaceDetected += (s, e) =>
Console.WriteLine(
$"Detected {e.FaceRectangles.Length} face(s)");
await player.PlayAsync();LibVLCSharp
C#// Motion detection: NOT AVAILABLE
// Face detection: NOT AVAILABLE
// AI object detection: NOT AVAILABLE
// Barcode scanning: NOT AVAILABLE
// Would need external libraries
// (OpenCV, ZXing, etc.) processing
// frames manually
Core.Initialize();
var libVLC = new LibVLC();
var mediaPlayer = new MediaPlayer(libVLC);
mediaPlayer.Play(
new Media(libVLC, "lobby_feed.mp4",
FromType.FromPath));
// No built-in detection
// No event-driven analysis
// Manual frame extraction requiredWann welche Lösung wählen
Wählen Sie Media Player SDK, wenn Sie Folgendes benötigen
- ✓DVD-Anwendungen mit vollständiger Menünavigation, Kapiteln und Lesezeichen
- ✓Professionelles Audio mit 40+ Effekten, VU-Meter und FFT-Spektrum
- ✓Virtuelle Kamera-Ausgabe für Zoom, Teams und OBS
- ✓NDI-Ausgabe für Broadcast- und Produktions-Workflows
- ✓Multi-Screen-Vertrauensmonitore und Digital Signage
- ✓Überwachung mit Bewegungs- und Gesichtserkennung
- ✓Bild-in-Bild-Komposition und Chroma-Key-Vorschau
- ✓Frame-genaues Suchen und Rückwärtswiedergabe für professionelle Überprüfung
- ✓Barcode-/QR-Scanning auf Videostreams
Wählen Sie LibVLCSharp, wenn Sie Folgendes benötigen
- ✓Einfache Desktop- oder mobile Media-Player-Anwendungen
- ✓IPTV- und Streaming-Viewer-Anwendungen
- ✓Chromecast-Streaming und Netzwerk-Browsing (SMB, FTP, UPnP)
- ✓Projekte ohne Budget oder Open-Source-Projekte
- ✓Maximale Codec- und Formatabdeckung über den VLC-Decoder-Stack
- ✓Minimaler Integrationsaufwand — Video in drei Zeilen C# abspielen
- ✓tvOS-Unterstützung und breite Legacy-OS-Kompatibilität
- ✓Große Community und umfangreiche StackOverflow-Inhalte
Bereitstellung und Verteilung
Media Player SDK Bereitstellung
- ✓NuGet-Paket enthält alle Abhängigkeiten
- ✓Xcopy-Bereitstellung unterstützt
- ✓Lizenzgebührenfreie Verteilung mit kommerzieller Lizenz
- ✓Keine Laufzeitgebühren
- ✓Keine LGPL-Verpflichtungen — sicher für proprietäre Software
- ✓App-Größenauswirkung: ~50-100 MB
LibVLCSharp Bereitstellung
- ⚠NuGet-Pakete verfügbar (LibVLCSharp + VideoLAN.LibVLC-Plattformpakete)
- ⚠LibVLC-DLLs pro Plattform müssen enthalten sein
- ⚠LGPL erfordert dynamisches Linking — Benutzer müssen VLC-DLLs ersetzen können
- ⚠LGPL-Lizenzhinweis muss enthalten sein
- ⚠Plattformpakete übernehmen die Verteilung nativer Bibliotheken
- ⚠App-Größenauswirkung: ~40-80 MB
Entscheidungsmatrix
| Anforderung | Media Player SDK | LibVLCSharp | Gewinner |
|---|---|---|---|
| Einfacher Media Player | LibVLCSharp | ||
| DVD-Kiosk / Schulungs-App | Media Player SDK | ||
| Audio-Effekte / EQ / VU-Meter | Media Player SDK | ||
| Virtuelle Kamera für Streaming | Media Player SDK | ||
| NDI-Broadcast-Ausgabe | Media Player SDK | ||
| Multi-Screen-Anzeige | Media Player SDK | ||
| Überwachung mit Erkennung | Media Player SDK | ||
| IPTV / Streaming-Viewer | LibVLCSharp | ||
| Chromecast / Netzwerk-Browsing | LibVLCSharp | ||
| Digital Signage (mit OSD) | Media Player SDK | ||
| Kein Budget | LibVLCSharp | ||
| Open-Source-Projekt | LibVLCSharp | ||
| PiP / Chroma-Key-Komposition | Media Player SDK | ||
| Barcode- / QR-Scanning | Media Player SDK |
Fazit
Media Player SDK .NET
Wählen Sie Media Player SDK, wenn Sie DVD-Wiedergabe mit vollständiger Menünavigation, virtuelle Kamera-Ausgabe für Zoom/Teams/OBS, Gesichts- und Bewegungserkennung, über 40 Echtzeit-Audio-Effekte, NDI-Ausgabe für Broadcast, Bild-in-Bild-Komposition, Frame-genaues Suchen und Rückwärtswiedergabe, professionelles VU-Meter mit FFT-Spektrum, Chroma Key und KI-Video-Upscaling, Multi-Screen-Anzeige sowie lizenzgebührenfreie Verteilung ohne LGPL-Einschränkungen benötigen. Die jährliche Lizenzierung beginnt ab EUR 250·Jahr mit einmaligen Lebenslang-Optionen.
LibVLCSharp
Wählen Sie LibVLCSharp, wenn Sie maximale Codec- und Formatabdeckung über den VLC-Decoder-Stack, kostenlose LGPL-lizenzierte Wiedergabe, Chromecast-Streaming und Netzwerk-Medien-Browsing (SMB, FTP, UPnP), minimalen Integrationsaufwand mit Wiedergabe in drei Zeilen C#, tvOS-Unterstützung und breite Legacy-OS-Kompatibilität sowie eine große Community mit umfangreichen StackOverflow-Inhalten und kampferprobter Stabilität benötigen.
The Reality
Für unkomplizierte Media Player, Streaming-Clients und IPTV-Anwendungen bewältigt LibVLCSharp diese mit weniger Code und ohne Kosten. Für feature-gesteuerte Anwendungen, die Effekte, Erkennung, DVD-Kioske oder Broadcast-Ausgabe erfordern, ist Media Player SDK typischerweise die einzig praktikable Option. Einige Teams kombinieren beide SDKs — LibVLCSharp für einfache Wiedergabebildschirme und Media Player SDK für Bildschirme, die Effekte, Erkennung oder Broadcast-Ausgabe erfordern.
Frequently Asked Questions
Was ist die beste LibVLCSharp-Alternative für .NET-Videowiedergabe?
Kann LibVLCSharp DVD-Menüs in C# abspielen?
Wie füge ich Audio-Effekte zu einem C#-Videoplayer hinzu?
Unterstützt Media Player SDK die Ausgabe an virtuelle Kameras?
Wie viel kostet Media Player SDK im Vergleich zu LibVLCSharp?
Was ist der Unterschied zwischen Media Player SDK und LibVLCSharp?
Loslegen
LibVLCSharp ist Open Source; die Preise für kommerzielle Videolabs-Lizenzen unter videolabs.io/store/libvlcsharp/, überprüft am 2026-09-06. Preise können sich ohne Vorankündigung ändern.
