Last updated: Styczeń 2026
Video Capture SDK .NET vs nakładki FFmpeg
Kompleksowe porównanie przechwytywania wideo w .NET
Wybór odpowiedniego frameworka do przechwytywania wideo w aplikacji .NET to kluczowa decyzja architektoniczna. Ten przewodnik zawiera szczegółowe, obiektywne porównanie VisioForge Video Capture SDK .NET — dedykowanego silnika przechwytywania — z nakładkami opartymi na FFmpeg, takimi jak FFmpeg.AutoGen, Xabe.FFmpeg i FFMpegCore. Analizujemy architekturę, funkcje, wydajność, licencjonowanie i rzeczywisty kod, abyś mógł podjąć świadomą decyzję.
Podsumowanie wykonawcze
| Aspekt | Video Capture SDK .NET | Nakładki FFmpeg |
|---|---|---|
| Architektura | Podwójny silnik: natywny DirectShow/Media Foundation + wbudowane potoki FFmpeg | Nakładka procesowa CLI wokół ffmpeg.exe / libavcodec |
| Źródła przechwytywania | Kamery internetowe, ekrany, kamery IP, karty przechwytujące, tunery TV, źródła wirtualne | Zależy od flag kompilacji FFmpeg; zazwyczaj kamery internetowe, ekrany, RTSP |
| Podgląd na żywo | Wbudowany podgląd z akceleracją GPU i nakładkami | Brak natywnego podglądu; wymaga przesyłania klatek do osobnego renderera |
| Formaty nagrywania | MP4, MKV, WebM, AVI, WMV, MOV, TS, GIF + ponad 30 innych | Wszystkie formaty obsługiwane przez FFmpeg (rozbudowane) |
| Wiele wyjść | Jednoczesne nagrywanie + strumieniowanie + zrzuty ekranu z jednego potoku | Wiele wyjść przez muxer tee lub wiele procesów |
| Akceleracja sprzętowa | NVENC, QSV, AMF, DXVA2, D3D11VA, VideoToolbox | NVENC, QSV, AMF, VAAPI, VDPAU (jeśli skompilowano z obsługą) |
| Integracja z .NET | Natywne API .NET, zdarzenia, async/await, kontrolki WinForms/WPF/MAUI | Process.Start() lub P/Invoke; ograniczone idiomy .NET |
| Licencjonowanie | Komercyjna licencja per deweloper (wieczysta lub subskrypcja) | LGPL/GPL — ograniczenia linkowania; nakładki MIT/Apache |
| Ceny | Od 489 EUR (Home) do 6 999 EUR (Team) | Bezpłatne (ale koszty zgodności z GPL nie są trywialne) |
| Wsparcie | Dedykowany system zgłoszeń, priorytetowe SLA, niestandardowe kompilacje | Fora społecznościowe, Stack Overflow, listy mailingowe |
Szczegółowa analiza architektury
Architektura Video Capture SDK .NET
Video Capture SDK wykorzystuje architekturę z podwójnym silnikiem. Główny silnik opakowuje DirectShow i Media Foundation w systemie Windows, zapewniając natywny dostęp do każdego urządzenia przechwytującego eksponowanego przez system operacyjny. Dodatkowy wbudowany potok FFmpeg obsługuje zaawansowane operacje kodeków, pobieranie z kamer IP i nagrywanie międzyplatformowe. Oba silniki współdzielą zunifikowaną powierzchnię API .NET, więc przełączanie między nimi nie wymaga zmian w kodzie.
- ▶Natywne przechwytywanie Windows przez grafy filtrów DirectShow i Media Foundation
- ▶Wbudowany FFmpeg dla elastyczności kodeków bez zewnętrznych zależności CLI
- ▶Podgląd z akceleracją GPU przez renderery Direct3D / OpenGL
- ▶Architektura sterowana zdarzeniami z obsługą .NET async/await
- ▶Model jednoprocesowy — nie wymaga zarządzania procesami potomnymi
Architektura nakładek FFmpeg
Nakładki FFmpeg (biblioteki .NET takie jak FFmpeg.AutoGen, Xabe.FFmpeg, FFMpegCore lub MediaToolkit) zapewniają zarządzany interfejs do CLI FFmpeg lub bibliotek libav*. Podejście CLI uruchamia ffmpeg.exe jako proces potomny i komunikuje się przez argumenty wiersza poleceń oraz potoki standardowego I/O. Podejście P/Invoke linkuje bezpośrednio do współdzielonych bibliotek libav* dla dostępu niższego poziomu.
- ▶Nakładki CLI uruchamiają ffmpeg.exe i parsują wyjście stdout/stderr
- ▶Nakładki P/Invoke (FFmpeg.AutoGen) wywołują bezpośrednio funkcje C libav*
- ▶Brak wbudowanej integracji UI — klatki muszą być renderowane ręcznie
- ▶Architektura wieloprocesowa zwiększa złożoność zarządzania stanem
- ▶Pełne pokrycie kodeków/formatów FFmpeg po kompilacji ze wszystkimi flagami
Kluczowe różnice architektoniczne
| Aspekt | Video Capture SDK | Nakładki FFmpeg |
|---|---|---|
| Model procesowy | Pojedynczy proces, silnik wewnątrzprocesowy | Proces potomny (CLI) lub wewnątrzprocesowy (P/Invoke) |
| Wykrywanie urządzeń | Natywne API enumeracji systemu operacyjnego | ffmpeg -list_devices lub ręczne zapytanie |
| Potok klatek | Wewnętrzny graf filtrów z zarządzanymi callbackami | Przesyłanie surowych klatek przez stdout lub pamięć współdzieloną |
| Obsługa błędów | Wyjątki .NET i błędy oparte na zdarzeniach | Parsowanie stderr lub kody zwrotne C |
| Zarządzanie stanem | Zarządzana maszyna stanów ze zdarzeniami | Zarządzanie cyklem życia procesu |
| Model pamięci | Zarządzane + przypięte natywne bufory | Niezarządzana alokacja przez libav* lub bufory potokowe |
Porównanie funkcji
Źródła przechwytywania
| Funkcja | Video Capture SDK | Nakładki FFmpeg |
|---|---|---|
| Kamery USB | ✅ | ✅ |
| Wbudowane kamery laptopów | ✅ | ✅ |
| Przechwytywanie ekranu / pulpitu | ✅ | ✅ |
| Przechwytywanie okna aplikacji | ✅ | ⚠️(Ograniczone; wymaga flag specyficznych dla platformy) |
| Kamery IP (RTSP/ONVIF) | ✅ | ✅ |
| Karty przechwytujące (Blackmagic, Magewell) | ✅ | ⚠️(Przez DirectShow/V4L2 jeśli sterowniki je eksponują) |
| Tunery TV (BDA/DVB) | ✅ | ❌ |
| Kamery wirtualne (OBS, NDI) | ✅ | ⚠️(Przez DirectShow w systemie Windows) |
| Źródła NDI | ✅ | ⚠️(Wymaga niestandardowej kompilacji FFmpeg z NDI) |
| Wejście DECKLINK | ✅ | ✅(FFmpeg obsługuje wejście decklink) |
Podgląd na żywo
| Funkcja | Video Capture SDK | Nakładki FFmpeg |
|---|---|---|
| Wbudowany podgląd wideo | ✅ | ❌ |
| Renderowanie z akceleracją GPU | ✅ | ❌ |
| Nakładki tekstu / obrazu na podglądzie | ✅ | ❌(Wymaga renderowania zewnętrznego) |
| Podgląd bez nagrywania | ✅ | ❌ |
| Wiele okien podglądu | ✅ | ❌ |
| Kontrolki WinForms / WPF / MAUI | ✅ | ❌(Brak natywnych kontrolek UI) |
Nagrywanie
| Funkcja | Video Capture SDK | Nakładki FFmpeg |
|---|---|---|
| MP4 (H.264 / H.265) | ✅ | ✅ |
| Kontener MKV | ✅ | ✅ |
| WebM (VP8 / VP9 / AV1) | ✅ | ✅ |
| AVI | ✅ | ✅ |
| WMV / ASF | ✅ | ✅ |
| MOV (ProRes) | ✅ | ✅ |
| MPEG-TS | ✅ | ✅ |
| Animowany GIF | ✅ | ✅ |
| Tylko audio (MP3, AAC, WAV, FLAC, OGG) | ✅ | ✅ |
| Nagrywanie segmentowe (podział wg czasu/rozmiaru) | ✅ | ✅ |
| Nagrywanie Pre-Event (Bufor Cykliczny) | ✅ | ❌(Brak wbudowanego API bufora cyklicznego; wymaga własnej implementacji) |
Wiele wyjść i strumieniowanie
| Funkcja | Video Capture SDK | Nakładki FFmpeg |
|---|---|---|
| Jednoczesne nagrywanie + strumieniowanie | ✅ | ⚠️(Przez muxer tee lub wiele procesów) |
| Wiele wyjść nagrywania | ✅ | ⚠️(Muxer tee ma ograniczenia) |
| Strumieniowanie RTMP | ✅ | ✅ |
| Serwer RTSP | ✅ | ❌(FFmpeg jest klientem, nie serwerem) |
| Strumieniowanie SRT | ✅ | ✅(Wymaga kompilacji z obsługą SRT) |
| Wyjście HLS / DASH | ✅ | ✅ |
| Wyjście NDI | ✅ | ⚠️(Wymaga niestandardowej kompilacji) |
| Zrzut ekranu podczas nagrywania | ✅ | ⚠️(Wymaga osobnej ekstrakcji klatek) |
Protokoły strumieniowania
| Funkcja | Video Capture SDK | Nakładki FFmpeg |
|---|---|---|
| RTMP Push | ✅ | ✅ |
| Tryb serwera RTSP | ✅ | ❌ |
| SRT (Caller / Listener) | ✅ | ✅ |
| Generowanie segmentów HLS | ✅ | ✅ |
| MPEG-DASH | ✅ | ✅ |
| UDP / TCP Unicast / Multicast | ✅ | ✅ |
Przetwarzanie wideo
| Funkcja | Video Capture SDK | Nakładki FFmpeg |
|---|---|---|
| Zmiana rozmiaru / przycinanie w czasie rzeczywistym | ✅ | ✅ |
| Usuwanie przeplotu | ✅ | ✅ |
| Korekcja kolorów (jasność, kontrast, nasycenie) | ✅ | ✅(Przez filtry FFmpeg) |
| Nakładka tekstowa (znacznik czasu, znak wodny) | ✅ | ✅(Filtr drawtext) |
| Nakładka obrazu / logo | ✅ | ✅(Filtr overlay) |
| Obraz w obrazie | ✅ | ✅(Filtr overlay) |
| Klucz chrominancji (zielony ekran) | ✅ | ⚠️(Filtr chromakey — podstawowy) |
| Filtry z akceleracją GPU | ✅ | ⚠️(Ograniczone do określonych filtrów hwaccel) |
Audio
| Funkcja | Video Capture SDK | Nakładki FFmpeg |
|---|---|---|
| Przechwytywanie z urządzenia audio | ✅ | ✅ |
| Przechwytywanie dźwięku systemowego (Loopback) | ✅ | ⚠️(Wymaga konfiguracji WASAPI loopback) |
| Miksowanie audio (wiele wejść) | ✅ | ✅(Filtr amix) |
| Kontrola głośności / wzmocnienia w czasie rzeczywistym | ✅ | ✅(Filtr volume) |
| Efekty audio (echo, pogłos) | ✅ | ✅(Różne filtry audio) |
| Miernik VU / monitorowanie poziomu | ✅ | ❌(Wymaga parsowania wyjścia loudnorm) |
Wykrywanie i analiza
| Funkcja | Video Capture SDK | Nakładki FFmpeg |
|---|---|---|
| Wykrywanie ruchu | ✅ | ❌ |
| Wykrywanie twarzy | ✅ | ❌ |
| Odczyt kodów kreskowych / QR | ✅ | ❌ |
| Śledzenie obiektów | ✅ | ❌ |
| Wykrywanie poziomu audio | ✅ | ⚠️(Przez filtry volumedetect / ebur128) |
Zaawansowane funkcje
| Funkcja | Video Capture SDK | Nakładki FFmpeg |
|---|---|---|
| Kodowanie NVIDIA NVENC | ✅ | ✅ |
| Kodowanie Intel QSV | ✅ | ✅ |
| Kodowanie AMD AMF | ✅ | ✅ |
| Dekodowanie z akceleracją sprzętową | ✅ | ✅ |
| API wtyczek filtrów niestandardowych | ✅ | ❌(Wymaga budowania niestandardowych filtrów FFmpeg w C) |
Dostęp do klatek i integracja
| Funkcja | Video Capture SDK | Nakładki FFmpeg |
|---|---|---|
| Callback surowych klatek (RGB / YUV) | ✅ | ⚠️(Przez potok lub P/Invoke) |
| Bitmap / SKBitmap / WriteableBitmap | ✅ | ❌(Wymagana ręczna konwersja) |
| Integracja z ML.NET / ONNX | ✅ | ⚠️(Wymaga potoku ekstrakcji klatek) |
| Interop z OpenCV | ✅ | ⚠️(Przesyłanie klatek do OpenCV) |
| Bezpośredni dostęp do tekstur GPU | ✅ | ❌ |
Obsługa platform
Zgodność z systemami operacyjnymi
| Platforma | Video Capture SDK | Nakładki FFmpeg |
|---|---|---|
| Windows x64 | ✅ | ✅ |
| Windows ARM64 | ✅ | ✅ |
| macOS (Apple Silicon + Intel) | ✅ | ✅ |
| Linux x64 (Ubuntu, Debian, Fedora) | ✅ | ✅ |
| Linux ARM64 (Raspberry Pi) | ✅ | ✅ |
| Android (przez .NET MAUI) | ✅ | ⚠️(Wymaga niestandardowej kompilacji) |
| iOS (przez .NET MAUI) | ✅ | ⚠️(Wymaga niestandardowej kompilacji) |
Zgodność z frameworkami UI
| Framework | Video Capture SDK | Nakładki FFmpeg |
|---|---|---|
| WinForms | ✅ | ❌(Brak wbudowanych kontrolek) |
| WPF | ✅ | ❌(Brak wbudowanych kontrolek) |
| .NET MAUI | ✅ | ❌(Brak wbudowanych kontrolek) |
| Avalonia UI | ✅ | ❌(Brak wbudowanych kontrolek) |
| Konsola / Usługa | ✅ | ✅ |
| ASP.NET Core (Usługa w tle) | ✅ | ✅ |
| Blazor (Przetwarzanie po stronie serwera) | ✅ | ✅ |
Porównanie cen
Cennik Video Capture SDK .NET
1 deweloper, użytek niekomercyjny
1 deweloper, użytek komercyjny, 1 rok aktualizacji
Do 3 deweloperów, użytek komercyjny, 1 rok aktualizacji
Do 8 deweloperów, użytek komercyjny, 1 rok aktualizacji
All licenses include:
- ✓ Dystrybucja bez opłat licencyjnych
- ✓ Wszystkie przykłady kodu źródłowego
- ✓ Priorytetowe wsparcie przez system zgłoszeń
- ✓ Wszystkie platformy docelowe w zestawie
Koszty nakładek FFmpeg
Licencja MIT — niskopoziomowe wiązania P/Invoke
Niekomercyjne bezpłatne; wymagana licencja komercyjna
Licencja MIT — nakładka CLI
Licencja MIT — nakładka CLI
Kwestie zgodności z GPL
Sam FFmpeg jest licencjonowany na warunkach LGPL 2.1 lub GPL 2/3 w zależności od konfiguracji kompilacji. Jeśli Twoja kompilacja FFmpeg zawiera komponenty GPL (libx264, libx265, libfdk-aac), Twoja aplikacja może podlegać obowiązkom GPL. Oznacza to, że musisz:
- ⚠Udostępnić swoją aplikację jako open-source na licencji kompatybilnej z GPL
- ⚠Używać wyłącznie komponentów FFmpeg na licencji LGPL i linkować dynamicznie
- ⚠Uzyskać komercyjną licencję FFmpeg od właścicieli praw autorskich FFmpeg (skomplikowane, ponieważ FFmpeg ma setki kontrybutorów)
- ⚠Skompilować FFmpeg wyłącznie z kodekami kompatybilnymi z LGPL (ograniczając funkcjonalność)
Wiele firm przeznacza znaczne zasoby prawne na zapewnienie zgodności z GPL. Koszt przeglądu prawnego często przewyższa cenę komercyjnej licencji SDK.
Przykłady kodu
Przykład 1: Nagrywanie z kamery internetowej do MP4
Video Capture SDK .NET
C#using VisioForge.Core.VideoCapture;
using VisioForge.Core.Types.Output;
// Create the capture engine
var capture = new VideoCaptureCore();
// Set video source (first available webcam)
var devices = await capture.Video_CaptureDevice_ListAsync();
capture.Video_CaptureDevice = devices[0];
// Set audio source
var audioDevices = await capture.Audio_CaptureDevice_ListAsync();
capture.Audio_CaptureDevice = audioDevices[0];
// Configure MP4 output with H.264
capture.Output_Format = new MP4Output
{
Video = new H264EncoderSettings
{
Bitrate = 4000,
Profile = H264Profile.Main
},
Audio = new AACEncoderSettings
{
Bitrate = 192
}
};
capture.Output_Filename = "recording.mp4";
// Assign preview panel
capture.Video_Preview_Enabled = true;
// Start recording with preview
await capture.StartAsync();FFMpegCore (nakładka CLI)
C#using FFMpegCore;
using FFMpegCore.Enums;
using System.Diagnostics;
// Note: No built-in device enumeration
// You must know your device name beforehand
var deviceName = "Integrated Camera";
var audioDevice = "Microphone (Realtek Audio)";
// Build the FFmpeg command
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "ffmpeg",
Arguments = $"-f dshow -i video=\"{deviceName}\":audio=\"{audioDevice}\" " +
"-c:v libx264 -preset fast -b:v 4000k " +
"-c:a aac -b:a 192k " +
"-y recording.mp4",
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
}
};
process.Start();
// No preview — video goes directly to file
// To stop: send 'q' to stdin or kill process
// Error handling: parse stderr outputPrzykład 2: Przechwytywanie ekranu z nakładką
Video Capture SDK .NET
C#using VisioForge.Core.VideoCapture;
using VisioForge.Core.Types;
var capture = new VideoCaptureCore();
// Screen capture source
capture.Video_CaptureDevice = new ScreenCaptureSourceSettings
{
FullScreen = true,
FrameRate = 30,
CaptureCursor = true
};
// Add timestamp overlay
capture.Video_Overlays.Add(new VideoOverlayText
{
Text = "{timestamp}",
Position = new System.Drawing.Point(10, 10),
Font = new System.Drawing.Font("Arial", 14),
Color = System.Drawing.Color.White
});
// Add watermark image
capture.Video_Overlays.Add(new VideoOverlayImage
{
Filename = "logo.png",
Position = new System.Drawing.Point(10, 50),
Opacity = 0.7
});
// Configure output
capture.Output_Format = new MP4Output
{
Video = new H264EncoderSettings { Bitrate = 8000 }
};
capture.Output_Filename = "screen_recording.mp4";
await capture.StartAsync();FFmpeg CLI
C#using System.Diagnostics;
// Screen capture with overlay using FFmpeg
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "ffmpeg",
Arguments =
// Windows screen capture via GDI
"-f gdigrab -framerate 30 -i desktop " +
// Complex filter for overlays
"-vf \"" +
"drawtext=text='%{localtime}':" +
"x=10:y=10:fontsize=14:fontcolor=white," +
"movie=logo.png[wm];[in][wm]overlay=10:50:" +
"format=auto,colorchannelmixer=aa=0.7\" " +
// Encoding settings
"-c:v libx264 -b:v 8000k -y screen_recording.mp4",
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
}
};
process.Start();
// Monitor stderr for progress / errors
string output = await process.StandardError.ReadToEndAsync();
await process.WaitForExitAsync();Przykład 3: Kamera RTSP do strumienia RTMP
Video Capture SDK .NET
C#using VisioForge.Core.VideoCapture;
using VisioForge.Core.Types.Output;
var capture = new VideoCaptureCore();
// IP camera source
capture.IP_Camera_Source = new IPCameraSourceSettings
{
URL = "rtsp://192.168.1.100:554/stream",
Login = "admin",
Password = "password",
Type = IPCameraType.RTSP
};
// Stream to YouTube/Twitch via RTMP
capture.Network_Streaming_Enabled = true;
capture.Network_Streaming_Format = new RTMPOutput
{
URL = "rtmp://a.rtmp.youtube.com/live2",
StreamKey = "YOUR_STREAM_KEY",
Video = new H264EncoderSettings
{
Bitrate = 4500,
KeyFrameInterval = 2
},
Audio = new AACEncoderSettings { Bitrate = 128 }
};
// Also record locally
capture.Output_Filename = "backup.mp4";
capture.Output_Format = new MP4Output();
await capture.StartAsync();FFmpeg CLI
C#using System.Diagnostics;
// RTSP to RTMP relay + local recording
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "ffmpeg",
Arguments =
// Input: RTSP camera
"-rtsp_transport tcp " +
"-i rtsp://admin:password@192.168.1.100:554/stream " +
// Tee muxer for multiple outputs
"-c:v libx264 -b:v 4500k -g 60 " +
"-c:a aac -b:a 128k " +
"-f tee " +
"\"[f=flv]rtmp://a.rtmp.youtube.com/live2/YOUR_STREAM_KEY|" +
"[f=mp4]backup.mp4\"",
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
}
};
process.Start();
// Note: Error recovery (reconnect on stream drop)
// must be implemented manually by monitoring stderr
// and restarting the processPrzykład 4: System monitoringu wielokamerowego
Video Capture SDK .NET
C#using VisioForge.Core.VideoCapture;
// Create multiple capture engines — one per camera
var cameras = new List<VideoCaptureCore>();
var cameraUrls = new[]
{
"rtsp://192.168.1.101/stream",
"rtsp://192.168.1.102/stream",
"rtsp://192.168.1.103/stream",
"rtsp://192.168.1.104/stream"
};
foreach (var url in cameraUrls)
{
var cam = new VideoCaptureCore();
cam.IP_Camera_Source = new IPCameraSourceSettings
{
URL = url,
Type = IPCameraType.RTSP,
ReconnectOnFailure = true,
ReconnectDelay = TimeSpan.FromSeconds(5)
};
// Motion detection on each camera
cam.Motion_Detection.Enabled = true;
cam.Motion_Detection.Sensitivity = 70;
cam.OnMotionDetected += (s, e) =>
{
Console.WriteLine($"Motion on {url} at {DateTime.Now}");
};
// Segmented recording (1-hour files)
cam.Output_Format = new MP4Output();
cam.Output_Filename = $"cam_{cameras.Count}_{DateTime.Now:yyyyMMdd}.mp4";
cam.SegmentedRecording.Enabled = true;
cam.SegmentedRecording.Duration = TimeSpan.FromHours(1);
cameras.Add(cam);
}
// Start all cameras
foreach (var cam in cameras)
await cam.StartAsync();FFmpeg CLI (wiele procesów)
C#using System.Diagnostics;
// Multi-camera: spawn one FFmpeg process per camera
var cameraUrls = new[]
{
"rtsp://192.168.1.101/stream",
"rtsp://192.168.1.102/stream",
"rtsp://192.168.1.103/stream",
"rtsp://192.168.1.104/stream"
};
var processes = new List<Process>();
for (int i = 0; i < cameraUrls.Length; i++)
{
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "ffmpeg",
Arguments =
$"-rtsp_transport tcp -i {cameraUrls[i]} " +
// Segmented recording (1-hour segments)
$"-c:v libx264 -b:v 2000k " +
$"-f segment -segment_time 3600 " +
$"-reset_timestamps 1 " +
$"cam_{i}_%Y%m%d_%H%M%S.mp4",
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
}
};
process.Start();
processes.Add(process);
}
// Note: No built-in motion detection
// No automatic reconnection on stream failure
// Must implement process monitoring + restart logic
// 4 separate processes consume more resourcesPrzykład 5: Konwersja pliku z postępem
Video Capture SDK .NET
C#using VisioForge.Core.VideoCapture;
var capture = new VideoCaptureCore();
// Use file as source (convert mode)
capture.Mode = CaptureMode.FileConversion;
capture.Input_Filename = "input.avi";
// Output settings
capture.Output_Format = new MP4Output
{
Video = new H265EncoderSettings
{
Bitrate = 6000,
Preset = H265Preset.Slow
},
Audio = new AACEncoderSettings { Bitrate = 256 }
};
capture.Output_Filename = "output.mp4";
// Progress event
capture.OnProgress += (s, e) =>
{
Console.WriteLine($"Progress: {e.Progress}%");
};
// Error event
capture.OnError += (s, e) =>
{
Console.WriteLine($"Error: {e.Message}");
};
await capture.StartAsync();Nakładka FFMpegCore
C#using FFMpegCore;
using FFMpegCore.Enums;
// File conversion using FFMpegCore
await FFMpegArguments
.FromFileInput("input.avi")
.OutputToFile("output.mp4", overwrite: true, options => options
.WithVideoCodec(VideoCodec.LibX265)
.WithVideoBitrate(6000)
.WithAudioCodec(AudioCodec.Aac)
.WithAudioBitrate(256)
.WithSpeedPreset(Speed.Slow)
)
.NotifyOnProgress(percent =>
{
Console.WriteLine($"Progress: {percent}%");
})
.ProcessAsynchronously();
// Note: Progress reporting works well in FFMpegCore
// This is one area where the wrapper experience is good
// However, error details are limited to stderr outputPorównanie wydajności
Testy przeprowadzone na Windows 11, Intel i7-13700K, 32 GB RAM, NVIDIA RTX 4070. Wyniki mogą się różnić w zależności od sprzętu i konfiguracji.
| Metryka | Video Capture SDK | FFmpeg CLI | Uwagi |
|---|---|---|---|
| Czas uruchomienia przechwytywania z kamery | ~120 ms | ~800 ms | Narzut uruchamiania procesu FFmpeg |
| Zużycie pamięci (pojedyncza kamera) | ~80 MB | ~120 MB | Proces FFmpeg + bufory potokowe |
| Zużycie CPU (nagrywanie 1080p H.264) | ~8% | ~10% | Podobne przy użyciu tego samego kodera |
| Zużycie CPU (nagrywanie 1080p NVENC) | ~3% | ~4% | Przeniesienie na GPU jest porównywalne |
| Opóźnienie klatki (przechwytywanie do podglądu) | ~16 ms (1 klatka) | N/A | FFmpeg nie ma wbudowanego podglądu |
| Wiele kamer (4x 1080p) | ~25% CPU, ~320 MB | ~35% CPU, ~480 MB | 4 procesy vs 1 proces |
| Ponowne połączenie RTSP | ~2 sekundy (automatycznie) | Wymagany ręczny restart | SDK ma wbudowane ponowne łączenie |
| Uruchomienie do pierwszej klatki | ~200 ms | ~1 200 ms | Inicjalizacja procesu + negocjacja kodeka |
Kiedy wybrać poszczególne rozwiązania
Wybierz Video Capture SDK, gdy potrzebujesz
- ✓Wbudowanego podglądu na żywo z nakładkami w aplikacjach WinForms/WPF/MAUI
- ✓Monitoringu wielokamerowego z wykrywaniem ruchu i automatycznym ponownym łączeniem
- ✓Dystrybucji komercyjnego produktu bez obaw o licencjonowanie GPL
- ✓Przechwytywania o niskim opóźnieniu z renderowaniem podglądu z akceleracją GPU
- ✓Zintegrowanego skanowania kodów kreskowych/QR lub wykrywania twarzy podczas przechwytywania
- ✓Jednolitego zarządzanego API .NET bez uruchamiania zewnętrznych procesów
- ✓Profesjonalnego wsparcia z SLA i asystą w niestandardowym rozwoju
- ✓Szybkiego rozwoju — funkcje, które z FFmpeg zajmują godziny, z SDK zajmują minuty
Wybierz nakładki FFmpeg, gdy potrzebujesz
- ✓Przetwarzania wsadowego po stronie serwera bez interfejsu UI (transkodowanie bezgłowe)
- ✓Maksymalnego pokrycia kodeków i formatów z jednego narzędzia
- ✓Projektów z ograniczonym budżetem, gdzie zgodność z GPL jest akceptowalna
- ✓Prostych jednorazowych konwersji plików lub zadań przekierowania strumieni
- ✓Wieloplatformowego skryptowania CLI i potoków automatyzacji
- ✓Projektów open-source już licencjonowanych na GPL
- ✓Projektów akademickich lub badawczych wymagających niestandardowych modyfikacji kodeków
- ✓Integracji z istniejącą infrastrukturą FFmpeg i skryptami
Podejście hybrydowe: najlepsze z obu światów
Wiele systemów produkcyjnych łączy obie technologie. Video Capture SDK obsługuje przechwytywanie w czasie rzeczywistym, podgląd i wykrywanie, podczas gdy FFmpeg obsługuje wsadowe przetwarzanie offline i konwersje formatów w nietypowych przypadkach.
- ▶Używaj SDK do przechwytywania w czasie rzeczywistym, podglądu i funkcji interaktywnych
- ▶Używaj FFmpeg do wsadowego transkodowania nagranych plików offline
- ▶Używaj FFmpeg do rzadkich konwersji formatów, których SDK nie obsługuje
- ▶Zachowaj FFmpeg jako usługę w tle do przetwarzania archiwów
Wdrożenie i dystrybucja
Wdrożenie Video Capture SDK
- ✓Pakiet NuGet zawiera wszystkie natywne zależności
- ✓Pojedyncze odwołanie NuGet — bez zewnętrznych narzędzi do instalacji
- ✓Bezpłatna redystrybucja z licencją komercyjną
- ✓Obsługa wdrożeń xcopy / MSIX / ClickOnce
- ✓Obsługa kontenerów Docker (Linux i Windows)
- ✓Brak obowiązków GPL — bezpieczne dla oprogramowania zastrzeżonego
Wdrożenie nakładek FFmpeg
- ⚠Musisz dołączyć ffmpeg.exe (lub odpowiednik) do swojej aplikacji
- ⚠Rozmiar pliku binarnego: ~80-150 MB w zależności od konfiguracji kompilacji
- ⚠Musisz upewnić się, że właściwa kompilacja FFmpeg odpowiada Twojej platformie docelowej
- ⚠Zgodność z GPL może wymagać ujawnienia kodu źródłowego
- ⚠Zarządzanie wersjami na różnych platformach jest ręczne
- ⚠Automatyczna aktualizacja plików binarnych FFmpeg musi być obsługiwana przez Twój kod
Macierz decyzyjna
| Wymaganie | Video Capture SDK | Nakładki FFmpeg | Zwycięzca |
|---|---|---|---|
| Podgląd na żywo w aplikacji desktopowej | Video Capture SDK | ||
| Bezgłowe transkodowanie serwerowe | FFmpeg | ||
| Wiele kamer z wykrywaniem ruchu | Video Capture SDK | ||
| Dystrybucja komercyjna bez GPL | Video Capture SDK | ||
| Maksymalna obsługa formatów | FFmpeg | ||
| Niski budżet początkowy | FFmpeg | ||
| Szybki czas rozwoju | Video Capture SDK | ||
| Profesjonalne wsparcie/SLA | Video Capture SDK | ||
| Wieloplatformowe kontrolki UI | Video Capture SDK | ||
| Rozwój niestandardowych kodeków | FFmpeg | ||
| Funkcje wykrywania w czasie rzeczywistym | Video Capture SDK | ||
| Zasoby społecznościowe/samouczki | FFmpeg | ||
| Monitorowanie poziomu audio | Video Capture SDK | ||
| Przekierowanie strumienia (RTSP do RTMP) | Remis | ||
| Wsadowe przetwarzanie plików | FFmpeg | ||
| Zgodność korporacyjna/licencjonowanie | Video Capture SDK |
Podsumowanie
Video Capture SDK .NET
Video Capture SDK wyróżnia się jako gotowe rozwiązanie dla aplikacji desktopowych i wieloplatformowych .NET wymagających przechwytywania wideo na żywo z podglądem, nakładkami, wykrywaniem i zarządzaniem wieloma kamerami. Natywne API .NET eliminuje złożoność zarządzania procesami i zapewnia profesjonalne, wspierane środowisko programistyczne. Licencja komercyjna gwarantuje czystą własność intelektualną dla dystrybucji korporacyjnej.
Nakładki FFmpeg
FFmpeg pozostaje złotym standardem w zakresie pokrycia kodeków i przetwarzania wsadowego. Jeśli Twoja aplikacja jest bezgłowa, serwerowa lub open-source, nakładki FFmpeg zapewniają skuteczne i bezpłatne rozwiązanie. Jednak brak podglądu na żywo, funkcji wykrywania i natywnych kontrolek .NET oznacza, że aplikacje desktopowe do przechwytywania wymagają znacznie więcej niestandardowego rozwoju.
The Reality
Dla większości programistów .NET budujących aplikacje skoncentrowane na przechwytywaniu, Video Capture SDK oszczędza tygodnie czasu rozwoju i eliminuje ryzyko licencyjne. Dla serwerowych farm transkodowania FFmpeg jest często pragmatycznym wyborem. Wiele zespołów korzysta z obu rozwiązań.
