FFmpeg ve GStreamer: Nerede Hangisini Kullanmalı, Ne Zaman Birlikte Çalıştırmalı?

FFmpeg ve GStreamer: Nerede Hangisini Kullanmalı, Ne Zaman Birlikte Çalıştırmalı?
Özet
- FFmpeg:
ffmpeg/ffprobeCLI velibav*kütüphaneleri — format dönüşümü, transcode, filtreleme, hızlı prototipleme - GStreamer: Element–pad–pipeline mimarisi — 7/24 canlı akış, düşük gecikme, donanım hızlandırma, uygulama içi entegrasyon
- İlişki: Aynı problemde çoğu zaman alternatif; aynı tesisatta sıkça tamamlayıcı (
gst-libavile doğrudan hibrit) - Amaç: FFmpeg ve GStreamer’ı yarıştırmak değil; hangi problemde hangisinin, hangi durumda ikisinin birlikte doğru seçim olduğunu göstermek
- Broadcast: ST 2110 ana yol vendor SDK iken; FFmpeg/GStreamer gateway, OTT köprüsü, monitoring ve transcoder katmanında yaygındır
- Karar: Dosya/offline ve CLI → FFmpeg; sürekli canlı pipeline ve gömülü servis → GStreamer
- Operasyon modeli: FFmpeg → process odaklı iş akışları (CLI, worker fleet, supervisor restart); GStreamer → süreç içi pipeline orkestrasyonu (state machine, bus, dinamik pad’ler)
Not: Bu makale, Go ile edge video processing yazısındaki kısa FFmpeg vs GStreamer bölümünü genişletir. Broadcast codec’ler, SRT gateway, ST 2110 kampüs, NMOS kontrol düzlemi ve HLS proxy (Go) ile birlikte okunması önerilir.
1. Giriş: İkisi de “video programı” değil, çerçeve
Canlı yayın, güvenlik kamerası, VOD platformu veya IP yayın kampüsünde sürekli şu soru gelir: “Bunu FFmpeg ile mi, GStreamer ile mi yapacağız?”
İkisi de multimedya işleme çerçevesidir: ham veya sıkıştırılmış veriyi okur, codec’lerden geçirir, filtreler, başka bir formata veya ağ protokolüne yazar. İkisi de codec kütüphanesi değildir — H.264, AAC, AV1 gibi codec’leri (çoğunlukla harici kütüphaneler üzerinden) kullanır.
Fark, nasıl düşündürdükleri ve nerede güçlü olduklarıdır:
| Boyut | FFmpeg | GStreamer |
|---|---|---|
| Birincil arayüz | Komut satırı + C API (libav*) |
Pipeline API + gst-launch-1.0 |
| Veri modeli | Filter graph, paket/frame | Element graph, buffer, pad, caps |
| Tipik kullanım | Transcode, dosya, script, hızlı test | Canlı servis, gömülü Linux, uzun ömürlü pipeline |
| Öğrenme eğrisi | Tek komutla sonuç; derinleşince filter karmaşıklığı | Başlangıçta kavram çok; kurulunca modüler |
Bu yazıda “hangisi daha iyi?” yerine nerede FFmpeg, nerede GStreamer, nerede ikisi birlikte? sorusuna odaklanıyoruz.
1.1 Sürüm kapsamı
Örnekler ve API isimleri FFmpeg 7.x / 8.x ile GStreamer 1.x (1.24+ / 1.26+ tipik güncel sürümler; bazı LTS distro’larda FFmpeg 6.x ve GStreamer 1.20+ hâlâ görülebilir) için yazılmıştır. Özellikler build’e bağlıdır:
| Özellik | Not |
|---|---|
hlssink2, dashsink |
gst-plugins-bad; sürüm ve distro paketine göre değişir |
SRT (srt://, srtsrc) |
FFmpeg ve GStreamer’da genelde libsrt ile; eski build’lerde eksik olabilir |
| RTMP çıkış | FFmpeg’de libavformat RTMP; GStreamer’da rtmpsink + flvmux (bazı kurulumlarda rtmp2sink) |
| NVENC / VAAPI | Sürücü + plugin seti gerekir |
Kurulumda ffmpeg -version ve gst-launch-1.0 --version ile somut sürümü doğrulayın; gst-inspect-1.0 ile element varlığını kontrol edin.
2. Mimari: Filter graph vs pipeline
2.1 FFmpeg — libav ve filter graph
FFmpeg temel olarak şu kütüphaneler etrafında döner:
- libavutil — ortak yardımcılar, zaman, bellek, piksel formatları
- libavformat — container (MP4, TS, MKV), protokol (file, RTSP, UDP)
- libavcodec — encode/decode
- libavfilter — ölçekleme, deinterlace, overlay, renk dönüşümü
- libswscale / libswresample — piksel ve ses örnekleme dönüşümü
- libavdevice (isteğe bağlı) — V4L2, DirectShow gibi capture cihazları
ffmpeg komutu bu katmanları bir filter graph ve mux/demux zinciri olarak birleştirir. Veri genelde frame veya packet olarak elementler arasında akar. Dosya tabanlı girdilerde -re, okuma hızını kısarak gerçek zamanlı ingest’e yaklaştırır (diskten canlı akış simülasyonu için faydalıdır). Girdiyi “native realtime” yapmaz; RTSP veya UDP gibi gerçek canlı kaynaklarda -re genelde gereksizdir, hatta zararlı olabilir.
2.2 GStreamer — element, pad, caps
GStreamer’da her iş bir elementtir: rtspsrc, x264enc, hlssink2, filesink. Elementler pad ile bağlanır; pad’ler üzerinden geçen verinin tipi caps (capabilities) ile müzakere edilir: çözünürlük, pixel format, codec, örnekleme hızı.
Pipeline bir durum makinesi ile yönetilir: NULL → READY → PAUSED → PLAYING. Hata, EOS ve uyarılar bus üzerinden uygulamaya iletilir.
2.3 Ortak zemin
Her ikisi de şunları yapar:
- Demux / mux
- Encode / decode (çoğu codec paylaşımlı veya benzer backend)
- Ağ protokolleri ve paketleme (RTSP, UDP, SRT, HLS, DASH, RTMP — kuruluma bağlı)
- Donanım hızlandırma (NVENC, VAAPI, Quick Sync — plugin/build’e bağlı)
GStreamer içinde FFmpeg: gst-libav plugin paketi, FFmpeg’in decoder/encoder’larını GStreamer elementleri olarak sunar (avdec_h264, avenc_aac). Bu, “ya biri ya öteki” değil doğrudan hibrit anlamına gelir.
3. FFmpeg derinlemesine
3.1 CLI: hızlı araç, üretim standardı
Çoğu ekip FFmpeg’i önce komut satırı aracı olarak tanır:
|
|
|
|
|
|
Güçlü yanlar:
- Tek satırda uçtan uca iş
- Evrensel format desteği
- Script, CI, cron, operatör el kitabı için ideal
- Dokümantasyon ve Stack Overflow birikimi çok yüksek
Zayıf yanlar (canlı servis bağlamında):
- Her
ffmpegçağrısı ayrı process — yeniden başlatma, bellek, pipe I/O overhead - Uygulama içi ince kontrol için C API veya
execgerekir; hata yönetimi process seviyesinde - Çok uzun süreli pipeline’da dinamik topoloji değişimi (ekran ekle/çıkar) CLI ile zor
3.2 Kütüphane kullanımı
libavformat + libavcodec ile process overhead olmadan entegre edilir; OBS, VLC, birçok commercial transcoder ve cloud VOD worker bu yolu kullanır. Go tarafında genelde CGO ile libav veya exec.Command("ffmpeg", ...) tercih edilir — edge video processing makalesinde ikinci yol anlatılır.
3.3 Tipik FFmpeg senaryoları
| Senaryo | Neden FFmpeg |
|---|---|
| Arşiv VOD transcode | Batch, dosya odaklı, -map, -filter_complex |
| Thumbnail / waveform | -vf, -ss, kısa süreli iş |
| Format keşfi | ffprobe, hızlı teşhis |
| Prototip (“bu RTSP açılıyor mu?”) | Tek komut |
| HLS paketleme | -f hls, segment listesi |
| DASH / ABR VOD | -f dash, MPD + segment şablonları |
| RTMP push (Twitch, YouTube Live, OBS hedefi) | -f flv rtmp://..., FLV mux |
| AV1 VOD / OTT | -c:v libsvtav1, libaom-av1; decode libdav1d |
4. GStreamer derinlemesine
4.1 Pipeline dili: gst-launch
CLI karşılığı gst-launch-1.0dır; syntax boru (!) ile element zinciri kurar:
|
|
-e (EOS’ta doğru kapanış) canlı sistemlerde dosya bütünlüğü için önemlidir.
4.2 Uygulama API’si
Gerçek ürünlerde pipeline kod içinde kurulur (C, Python gi, Rust gstreamer crate). Bus mesajlarıyla hata, state change ve EOS yönetilir; runtime’da element ekleme/çıkarma (decodebin, uridecodebin) mümkündür.
Güçlü yanlar:
- Sürekli akış için tasarlanmış buffer ve clock modeli
- Plugin ekosistemi: WebRTC, DeepStream, V4L2, ALSA, custom
appsrc/appsink - Donanım encoder’lara doğrudan element (
nvh264enc,vaapih264enc) - Tek process, düşük gecikme hedefi
Zayıf yanlar:
- Kurulum: distro paketleri, plugin seti, caps müzakere hataları
- Öğrenme: pad, caps, ghost pad, bin kavramları
- Dokümantasyon FFmpeg kadar “tek komut örneği” zengin değil; daha çok API ve plugin referansı
4.3 Tipik GStreamer senaryoları
| Senaryo | Neden GStreamer |
|---|---|
| 7/24 ingest servisi | State machine, bus, reconnect pattern |
| Önizleme / multiview | compositor, tee, dinamik pad |
| Gömülü cihaz (ARM SoC) | V4L2 + hardware enc bir arada |
| Uygulama içi frame işleme | appsink → OpenCV / ML → appsrc |
| WebRTC / WHIP | webrtcbin; üretim ingest’te WHIP/WHEP (build/plugin’e bağlı) |
| DASH paketleme | dashsink (gst-plugins-bad) |
| RTMP yayın çıkışı | flvmux ! rtmpsink (veya rtmp2sink) |
| AV1 encode/decode | svtav1enc / rav1enc, av1dec |
5. Aynı iş, iki yol
Aşağıdaki örnekler kavramsal eşdeğerdir; üretimde bitrate, GOP, B-frame ve taşıma parametreleri proje gereksinimine göre ayarlanmalıdır.
5.1 Dosya → HLS (VOD)
FFmpeg:
|
|
GStreamer (video + ses dalları):
|
|
Not:
decodebindinamik pad üretir; yukarıdakid. !sözdizimi video/ses pad’lerini ayrı dallara yönlendirir.hlssink2gst-plugins-bad gerektirir; alternatif olaraksplitmuxsinkkullanılabilir. Örneklerde sık geçenvoaacenctutorial uyumluluğu içindir; birçok kurulumda kalite ve destek içinfdkaacenc(GPL) veyaavenc_aac(gst-libav) tercih edilir.
Canlı HLS (event stream): VOD’dan farklı olarak segment silme ve playlist güncelleme gerekir.
|
|
Not:
-c copyyalnızca kaynak zaten H.264 + AAC (veya HLS segmenter’ınızın MPEG-TS içinde kabul ettiği başka bir codec çifti) ise geçerlidir. HEVC, MJPEG veya uyumsuz ses için transcode gerekir — örn.-c:v libx264 -preset veryfast -c:a aac -b:a 128k.
GStreamer tarafında splitmuxsink veya hlssink2 ile benzer model; uçtan uca proxy için HLS stream proxy (Go) yazısına bakın.
DASH (FFmpeg — kısa):
|
|
DASH (GStreamer — dashsink, gst-plugins-bad):
dashsink segment ve MPD üretimini kendi içinde yapar; önüne mp4mux koymak yanlıştır. Video ve ses doğrudan dashsink pad’lerine bağlanır:
|
|
Not:
dashsinkrequest pad şablonları geneldevideo_%u,audio_%u,subtitle_%ubiçimindedir; bu yüzden örnektevideo_0veaudio_0kullanıldı. Sürüm/paket farkları içingst-inspect-1.0 dashsinkile doğrulayın.
5.2 RTSP kamera → ham frame (analiz için)
Aşağıdaki RTSP örnekleri H.264 RTP varsayar (rtph264depay). HEVC için: rtph265depay ! h265parse ! avdec_h265 (veya donanım decode elementi). MPEG-2 için rtpmp2tdepay / uygun parser kullanın.
FFmpeg (stdout pipe — edge makalesindeki model):
|
|
GStreamer:
|
|
FFmpeg burada operasyonel basitlik kazanır; GStreamer aynı process içinde appsink ile frame almak isteyen uygulamalar için daha doğal olur.
5.3 Copy (re-mux) — CPU tasarrufu
Codec’e dokunmadan container veya protokol değiştirmek:
|
|
Not:
tsdemuxdinamik pad üretir. Örnek, TS içinde hem H.264 hem AAC elementary stream olduğunu varsayar; yalnızca video varsa ses dalını kaldırın. Üretimdeparsebinveya programa özel pad bağlantısı da kullanılır. Gerçek pad adları akışa ve GStreamer sürümüne göre değişir (ör.d.video_0,d.audio_0);gst-launch-1.0 -vveyaGST_DEBUG=2ile doğrulayın.
FFmpeg tarafında -c copy bitstream’e dokunmadan paketleri aktarır. GStreamer örneği ise demux → mpegtsmux ile yeniden paketleme yapar. Her iki yaklaşım da transcode değil, ancak container metadata ve zamanlama (PSI, PCR, PAT/PMT) yeniden kodlama olmasa da değişebilir — byte-identical çıkış varsaymayın. Sıkı contribution zincirlerinde vendor-specific passthrough elementleri gerekebilir.
5.4 Ses pipeline (broadcast senkronu)
Video örnekleri kadar ses de mux, gecikme ve seviye açısından kritiktir. Tipik bileşenler:
| Katman | FFmpeg | GStreamer |
|---|---|---|
| Parse | otomatik demux | aacparse, decodebin ses pad’i |
| Örnekleme / kanal | -ar 48000, -ac 2, -af pan/... |
audioresample, audioconvert, caps; ileri: audiomixer, LADSPA |
| Encode | -c:a aac, -b:a 192k; kalite: libfdk_aac (non-free build etkisi) |
fdkaacenc / avenc_aac (yaygın); voaacenc (eski, distro’ya bağlı) |
| A/V senkron | FFmpeg 7+/8+: -fps_mode, -itsscale, itsoffset; filter’da setpts/asetpts; eski: -async/-vsync (deprecated) |
pipeline clock, interleave, leaky queue |
Surround (5.1 kanal) → stereo downmix (FFmpeg):
|
|
GStreamer (6 kanal → stereo → AAC):
GStreamer’da audiochannelmix diye standart bir element yoktur. Kanal sayısı düşürme audioconvert + caps ile yapılır:
|
|
Not: Bu, basit kanal katlama içindir. Surround matrisi (5.1 → stereo ağırlıkları) için FFmpeg
-af pandaha kontrollüdür; ileri seviye için LADSPA veya özelaudiomixer/volumezincirleri gerekir.
Canlı RTSP’de ses kopması çoğu zaman yanlış pad bağlantısı veya caps müzakere hatasıdır; ffprobe ile ses stream index ve codec’ini doğrulayın.
6. Performans, gecikme ve süreklilik
6.1 Process vs in-process
Go ile edge video processing deneyiminde belirtildiği gibi, Go uygulamasından exec ffmpeg ile frame okumak pipe I/O ve process overhead getirir. Çoğu edge senaryosunda kabul edilebilir; saniyede yüzlerce tam çözünürlük frame ve sıkı CPU bütçesinde GStreamer veya doğrudan libav tercih edilir.
| Yaklaşım | Gecikme | Bakım | Tipik kullanım |
|---|---|---|---|
ffmpeg CLI + pipe |
Orta | Kolay | Prototip, orta yük edge |
| libav in-process / CGO | Düşük–orta | Zor | Yüksek throughput transcoder |
| GStreamer pipeline | Düşük (iyi tasarlanırsa) | Orta–zor | Canlı 7/24 servis |
6.2 Donanım hızlandırma
- FFmpeg:
-hwaccel,-c:v h264_nvenc,vaapi,qsv— komut satırında iyi belgelenmiş - GStreamer:
nvh264enc,vaapih264enc, platform plugin’leri — pipeline’a element olarak eklenir
Hangisinin daha hızlı olduğu sürücü, sürüm ve pipeline tasarımına bağlıdır; genel “GStreamer her zaman daha hızlı” doğru değildir. Aynı workload’da throughput/latency 2–10x oynayabilir; sabit “kazanan” ilan etmek yerine kendi girdinizle ölçün. Başlangıç referansları: GStreamer benchmarking tasarım notları, FFmpeg sürüm notları ve donanım encoder kıyasları.
6.2.1 Low-latency checklist
Düşük gecikme yalnızca “hızlı encoder” seçimi değildir; ingest, queue, GOP, mux ve player tamponu birlikte ayarlanır.
| Katman | Kontrol |
|---|---|
| RTSP ingest | TCP güvenilirlik sağlar; UDP daha düşük gecikmeli olabilir ama paket kaybına açıktır |
| Encoder | H.264/HEVC için kısa GOP, düşük preset, gerekirse B-frame kapatma |
| GStreamer queue | queue max-size-*, leaky=downstream; tıkanan branch tüm pipeline’ı kilitlemesin |
| FFmpeg mux | -fflags nobuffer, -flags low_delay, -muxdelay 0 dikkatli test edilir; her kaynakta iyi sonuç vermez |
| HLS/DASH | Segment süresi gecikmeyi doğrudan artırır; düşük latency için CMAF/fMP4 ve player desteği gerekir |
| SRT | latency değerini ağ jitter’ına göre ölçerek belirleyin; çok düşük değer packet recovery’yi bozar |
6.3 Güvenilirlik ve yeniden bağlanma
FFmpeg
| Sorun | Yaklaşım |
|---|---|
| HTTP/HTTPS kopması | -reconnect 1, -reconnect_streamed 1, -reconnect_delay_max 5 |
| RTSP kopması | Genelde process restart (supervisor), libav C API veya GStreamer bus; -reconnect RTSP’de güvenilir değil |
| Process çökmesi | systemd / supervisor ile yeniden başlatma |
| Stall tespiti | stderr parse, heartbeat, dış watchdog |
GStreamer
| Sorun | Yaklaşım |
|---|---|
rtspsrc kopması |
latency, timeout, tcp-timeout; bazı sürümlerde retry / do-retransmission (RTP) |
| EOS / ERROR | Bus’ta GstMessageEOS / GstMessageERROR → pipeline NULL, yeniden PLAYING |
| Uzun süreli servis | Uygulama watchdog thread; element başına queue leaky=downstream (tıkanmayı sınırlama) |
Örnek rtspsrc (daha dayanıklı ingest):
|
|
Üretimde reconnect mantığı genelde uygulama kodunda (bus callback) veya ayrı supervisor process ile yapılır; FFmpeg’deki tek satırlık -reconnect bayraklarına birebir CLI karşılığı yoktur — bu yüzden 6.3’te iki taraf farklı operasyon modelleri sunar, biri diğerinden “daha az özellikli” değildir.
- Encoder stall → her iki tarafta watchdog
- Bellek sızıntısı → uzun soak test; GStreamer tek process’te profil daha net
6.4 Ölçekleme (throughput)
| Model | FFmpeg | GStreamer |
|---|---|---|
| Yatay ölçek | Çoklu process/worker (her biri bir ffmpeg); queue (Redis, dosya) |
Tek process içinde tee + çoklu branch veya çoklu pipeline instance |
| GPU paylaşımı | Worker başına GPU index | Pipeline başına cihaz veya ayrı servis |
| Tipik | VOD farm, cloud transcode | Canlı multiview, tek host’ta çok çıkış |
Yüksek throughput VOD’da FFmpeg process ordusu yaygın; tek host’ta çok senkron çıkış için GStreamer tee + clock modeli daha doğal.
7. Broadcast ve IP yayın bağlamı
7.1 ST 2110 ve profesyonel IP
ST 2110 televizyon kampüsü mimarisinde ana medya yolu RTP multicast + PTP ve genelde vendor SDK (ör. NVIDIA Rivermax, özel SMPTE stack) ile kurulur. FFmpeg ve GStreamer ST 2110 yığınının yerine geçmez; şu rollerde öne çıkar:
- Gateway: IP yayın → OTT (HLS/DASH), SRT contribution
- Monitoring: Akış kaydı, thumbnail, waveform
- Lab / test: Akış üretimi, loop, format dönüşümü
- Küçük istasyon / ikinci hat: Tam özellikli IP ürünü olmayan ortamlarda yazılım transcoder
7.2 Taşıma protokolleri ve OTT paketleme
| Protokol / format | FFmpeg | GStreamer | Not |
|---|---|---|---|
| RTSP ingest | -rtsp_transport tcp |
rtspsrc |
Yayın ve güvenlik kamerası |
| SRT | srt:// (libsrt) |
srtsrc / srtsink |
SRT gateway |
| HLS | -f hls |
hlssink2, splitmuxsink |
Canlı + VOD |
| DASH | -f dash |
dashsink |
ABR VOD; CDN tarafında yaygın |
| RTMP push | -f flv rtmp://sunucu/app/key |
flvmux ! rtmpsink |
Twitch, YouTube Live, eski CDN ingest |
RTMP: Hâlâ geniş kullanımda (OBS hedef sunucuları, sosyal platform ingest). FFmpeg libavformat üzerinden RTMP yazar; eski librtmp bağımlılığı artık tipik değildir. GStreamer tarafında flvmux + rtmpsink (veya yeni rtmp2sink) ile push yapılır; TLS için rtmps URL ve uygun plugin gerekir.
DASH: HLS kadar detaylı anlatılmasa da OTT/VOD’da standarttır; FFmpeg -f dash ile MPD üretir; GStreamer’da dashsink (bad plugin) benzer işi pipeline içinde yapar.
CMAF / fMP4: 2026 OTT’de HLS ve DASH ile birlikte sık kullanılır; FFmpeg’de parçalı MP4 (-movflags frag_keyframe+empty_moov), GStreamer’da cmafsink (build’e bağlı) aynı fikre yakın.
RIST / NDI: Contribution tarafında SRT yanında RIST (UDP-friendly, açık) ve NDI (LAN, vendor ekosistem) görülür; ikisi de bu çerçevelerin çekirdeğinde değil, genelde vendor SDK veya özel plugin ile entegre edilir.
Örnek zincir:
|
|
Medya sunucu katmanı: FFmpeg/GStreamer transcode/encode yapar; MediaMTX, nginx-rtmp protokol terminasyonu ve yeniden yayın sağlar (transcode değil). Örnek:
|
|
Broadcast codec’ler bağlamında DNxHD, XDCAM, ProRes gibi formatlar genelde profesyonel ürün ve lisans gerektirir; FFmpeg/GStreamer yaygın endüstri codec’leri (H.264, HEVC, AV1) ve genel container’larda en güçlüdür. Burada “destek var” demek “patent/lisans yükümlülüğü yok” anlamına gelmez; H.264/HEVC dağıtımı ayrıca ürün ve ülke bağlamında değerlendirilmelidir.
7.3 Ne zaman vendor SDK?
Yüksek bitrate, kernel bypass, nanosaniye düzeyinde PTP uyumu ve SMPTE uyumluluk sertifikasyonu gerekiyorsa yazılım çerçevesi değil, broadcast SDK tercih edilir. FFmpeg/GStreamer bu dünyanın kenar ve türev katmanıdır.
7.4 AV1 (2026 pratik durumu)
AV1 artık yalnızca “gelecek codec” değil; OTT arşiv ve VOD üretimde FFmpeg ve GStreamer ile kullanılıyor; büyük ölçekli veya deneysel canlı ingest de var ancak H.264/HEVC yanında özellikle düşük gecikmeli contribution’da niş kalıyor. Temel yazılar: AV1 nedir?, uygulama AV1 converter, bulut AV1 ve AWS.
| FFmpeg | GStreamer | |
|---|---|---|
| Encode (yazılım) | libaom-av1, libsvtav1 (-c:v libsvtav1) |
svtav1enc, rav1enc, av1enc (build’e bağlı) |
| Decode | libdav1d (tercih), libaom |
av1dec (dav1d tabanlı) |
| Tipik kullanım | VOD farm, -crf/-b:v, iki geçişli SVT |
Pipeline içi VOD; canlıda CPU yükü yüksek |
| Canlı yayın | Mümkün; genelde düşük preset + güçlü CPU veya donanım AV1 | svtav1enc preset=... ile; gecikme H.264’ten yüksek olabilir |
| Donanım | NVENC AV1, QSV AV1 (sürücü/build) | nvav1enc vb. platform plugin’leri |
FFmpeg örnek (SVT-AV1, VOD):
|
|
GStreamer örnek (SVT-AV1):
|
|
Broadcast contribution’da AV1 henüz H.264/HEVC kadar evrensel değil; ancak OTT origin, arşiv ve bandwidth maliyeti düşürme için FFmpeg/GStreamer yığınlarında yerleşik seçenek. AV1 converter makalesindeki libsvtav1 parametreleri aynı mantıkla CLI ve pipeline’a taşınır.
7.5 Altyazı ve kapalı altyazı (kısa)
Broadcast ve OTT’de CEA-608/708 (ATSC/kapalı altyazı) ile WebVTT (HLS/DASH yan veri) sık istenir:
- FFmpeg: SubRip
.srt/ mov_text mux,subtitlesfilter ile burn-in; ayrı subtitle track için-map 0:s - GStreamer:
subtitleoverlay,closedcaption(region/build’e bağlı), WebVTT içinhlsdemuxyan manifest veya ayrı dosya
Tam iş akışı genelde playout/MAM katmanında; FFmpeg/GStreamer dönüştürme ve paketleme aşamasında altyazı track’ini korur veya gömer. CEA-608/708 her zaman normal subtitle stream olarak gelmez; MPEG-TS, H.264 SEI, MXF veya side-data biçimine göre map/bitstream filter/container desteği ayrıca test edilmelidir.
8. Go ve uygulama entegrasyonu
8.1 FFmpeg + Go
Yaygın pattern:
|
|
Artıları: hızlı geliştirme, FFmpeg güncellemesi bağımsız. Eksileri: process yönetimi, stderr log, graceful shutdown.
8.2 GStreamer + Go (ve Python)
- CGO / go-gst: Pipeline uygulama içinde; daha az process overhead
- Python (
gi.repository.Gst): Prototip ve ML entegrasyonu için yaygın; bus ve state machine aynı model - Ayrı GStreamer servisi + gRPC/SHM: Dil ayrımı, GPU node
Edge projelerinde çoğu ekip önce FFmpeg CLI ile doğrular, ihtiyaç netleşince GStreamer veya libav’e geçer — bu makaledeki edge processing kararı da bu çizgidedir.
9. Karar ağacı
Pratik özet:
| Seç | FFmpeg | GStreamer | İkisi / hibrit |
|---|---|---|---|
| Tek seferlik transcode | ✅ | ||
| Cron / CI VOD | ✅ | ||
| RTSP test | ✅ | ||
| RTMP push ingest | ✅ | ✅ | |
| DASH VOD paketleme | ✅ | ✅ | |
| AV1 VOD / düşük bitrate OTT | ✅ | ✅ | |
| Yüksek throughput VOD farm (çok process) | ✅ | ||
| Tek host çok çıkış (tee) | ✅ | ||
| Uzun süreli multiview | ✅ | ||
appsrc/appsink ile ML |
✅ | ||
| Mevcut FFmpeg codec, GST pipeline | ✅ gst-libav |
||
| ST 2110 ana router | ❌ → vendor |
9.1 Hızlı seçim reçetesi
| Senaryo | Başlangıç tercihi |
|---|---|
| RTSP URL açılıyor mu? | ffmpeg / ffprobe ile hızlı doğrulama |
| Kamera frame’i ML modeline gidecek | GStreamer appsink veya libav in-process |
| VOD arşiv transcode | FFmpeg worker + job queue |
| Jetson / DeepStream / embedded GPU | GStreamer tabanlı pipeline |
| Sadece protokol köprüsü | Önce -c copy; codec uyumsuzsa transcode |
| ST 2110 ana media path | Vendor SDK + PTP/NMOS; FFmpeg/GStreamer gateway tarafında |
10. Lisans, platform ve operasyon
10.1 Lisans (ticari ürün için kritik)
| FFmpeg | GStreamer | |
|---|---|---|
| Çekirdek | Çoğu bileşen LGPL; --enable-gpl build → GPL |
Çekirdek LGPL |
| Codec etkisi | libx264 → GPL build etkisi; libfdk-aac → genelde non-free build/lisans etkisi | ugly tier: patentli/GPL codec plugin’leri; good / bad ayrımı |
| Statik link | GPL “bulaşması” riski (hukuki inceleme gerekir) | Plugin’leri dinamik yükleme yaygın |
| Dağıtım | Hangi --enable-* ile derlendiğini manifesto et |
gst-inspect-1.0 ile hangi plugin’lerin yüklü olduğunu dokümante et |
Broadcast ürününde “FFmpeg kullanıyoruz” demek yetmez: hangi build, hangi codec’ler, statik mi dinamik mi link sorulur. GStreamer’da da gst-plugins-ugly içindeki patentli/GPL bileşenler ayrı paketlenir.
Ses codec notu: Örneklerde taşınabilirlik için aac / voaacenc kullanıldı; broadcast loudness ve kalite için libfdk-aac (FFmpeg tarafında non-free build/lisans etkisi) veya GStreamer fdkaacenc / avenc_aac gerekebilir — lisansı §10.1 ile birlikte planlayın.
10.2 Platform: Linux, Windows, macOS
| Platform | FFmpeg | GStreamer |
|---|---|---|
| Linux / embedded | Birincil platform | Birincil platform; en zengin plugin seti |
| Windows | Güçlü; resmi build, geniş topluluk | Kurulabilir; plugin/SDK parçalı |
| macOS | Homebrew / native; yayın ve post için yaygın | Homebrew ile mümkün; canlı pipeline’da daha az “default” |
Cross-platform ekiplerde FFmpeg script ve ops tarafında evrensel; GStreamer 7/24 canlı servis için çoğu zaman Linux hedeflenir.
10.3 Container ve debug
- Docker:
jrottenberg/ffmpeggibi imajlar operasyonel transcode için yaygın; GStreamer imajları geneldegst-*-plugins-*dev paketleriyle özel Dockerfile ister. - GStreamer debug:
GST_DEBUG=3,gst-inspect-1.0 rtspsrc,gst-launch-1.0 -v— caps ve pad hatalarında ilk araçlar. - Pipeline görselleştirme:
GST_DEBUG_DUMP_DOT_DIR=./dots— çalışma anında.dotgrafikleri (Graphviz ile görüntülenir); profil için gst-shark (kuruluysa) latency/throughput ölçümü. - FFmpeg teşhis:
ffprobe -show_streams,-loglevel debug.
10.4 Kurulum doğrulama komutları
Yazıdaki her örneği çalıştırmadan önce build’in gerçekten ilgili protokol, encoder ve GStreamer elementini içerdiğini kontrol edin:
|
|
|
|
Bu kontroller özellikle container image, CI runner ve embedded cihazlarda önemlidir; aynı komut laptop’ta çalışırken production imajında plugin eksik olabilir.
10.5 Kısa sorun giderme
| Belirti | İlk bakılacak |
|---|---|
| Ses yok | ffprobe / decodebin ses pad’i; -map 0:a; aacparse dalı |
| Caps negotiation failed | Araya videoconvert / audioconvert / audioresample |
| RTSP takılıyor | TCP transport, latency; HTTP için -reconnect; RTSP için supervisor/bus restart |
| HLS segment üretilmiyor | hlssink2 plugin var mı; mux öncesi mpegtsmux |
11. Alternatif araçlar (kısa)
FFmpeg ve GStreamer dışında aynı alanda:
- libVLC — oynatma ve basit stream; embed player
- MediaMTX / nginx-rtmp — protokol sunucusu; yukarıdaki zincirde terminasyon katmanı
- OBS — dahili olarak FFmpeg/libav bileşenleri kullanır; ancak kendi uygulama yığınına (libobs, plugin modeli) sahiptir;
ffmpegCLI etrafında ince bir sarıcı değildir - Go-native (gortsplib, pure go codec) — bağımlılık azaltma; format/codec kapsamı sınırlı
Edge processing makalesinde Go-native alternatifler tartışılır. Format genişliği ve operasyon araçları açısından OTT, CDN ve VOD/transcode tarafında FFmpeg hâlâ güçlü. Gömülü cihazlar, video analitik ve GPU odaklı canlı pipeline’larda ise GStreamer (ve tamamen GStreamer tabanlı NVIDIA DeepStream ekosistemi gibi yığınlar) en az onun kadar yaygındır — baskınlık alana göre değişir, evrensel bir “kazanan” yoktur.
12. Sonuç
FFmpeg ve GStreamer rakip ürünlerden çok farklı mimari tercihler sunar:
- FFmpeg = evrensel multimedya aracı ve kütüphanesi; hızlı, dokümante, her yerde
- GStreamer = modüler pipeline motoru; canlı, gömülü, dinamik graf
Çoğu kuruluşta ikisi de bulunur: FFmpeg arşiv ve operasyon scriptleri için, GStreamer (veya gst-libav hibriti) canlı ürünler için. Broadcast IT’de asıl ayrım ST 2110 çekirdeği vs yazılım gateway düzleminde geçer; bu çerçeveler ikinci planda değil, köprü ve operasyon katmanında kritiktir.
Doğru soru: “FFmpeg mi GStreamer mı?” değil, “Bu iş dosya mı akış mı, CLI yeter mi process şart mı, kampüs çekirdeği mi kenar mı?”
Kaynaklar
- FFmpeg Documentation
- GStreamer Documentation
- gst-libav
- İlgili yazılar: Go edge video, SRT + Go, HLS proxy (Go), Broadcast codec’ler, ST 2110 kampüs, NMOS, AV1, AV1 converter, AV1 ve AWS — klasör
AV1andAWS, yayın URL’si/av1andaws/