{"id":43640,"date":"2026-07-27T09:09:45","date_gmt":"2026-07-27T06:09:45","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/rust-ile-ffmpeg-hattina-kendi-video-karelerinizi-beslemek-bassiz-headless-cerceve-kaynagi-olusturma\/"},"modified":"2026-07-27T09:10:11","modified_gmt":"2026-07-27T06:10:11","slug":"rust-ile-ffmpeg-hattina-kendi-video-karelerinizi-beslemek-bassiz-headless-cerceve-kaynagi-olusturma","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/rust-ile-ffmpeg-hattina-kendi-video-karelerinizi-beslemek-bassiz-headless-cerceve-kaynagi-olusturma\/","title":{"rendered":"Rust ile FFmpeg Hatt\u0131na Kendi Video Karelerinizi Beslemek: Ba\u015fs\u0131z (Headless) \u00c7er\u00e7eve Kayna\u011f\u0131 Olu\u015fturma"},"content":{"rendered":"<h2>Rust ile FFmpeg Hatt\u0131na Kendi Video Karelerinizi Beslemek: Ba\u015fs\u0131z (Headless) \u00c7er\u00e7eve Kayna\u011f\u0131 Olu\u015fturma<\/h2>\n<p>Kendi dinamik video i\u00e7eri\u011finizi an\u0131nda olu\u015fturup i\u015flemek mi istiyorsunuz? Belki bir sunucuda kullan\u0131c\u0131 verilerine dayal\u0131 \u00f6zel videolar \u00fcretmek, canl\u0131 sim\u00fclasyonlar\u0131 kaydetmek veya sanal bir kamera kayna\u011f\u0131 olu\u015fturmak gibi bir ihtiyac\u0131n\u0131z var. \u0130\u015fte tam da bu noktada Rust&#8217;\u0131n performans g\u00fcc\u00fc ile FFmpeg&#8217;in medya i\u015fleme yeteneklerini birle\u015ftirmek, size s\u0131n\u0131rs\u0131z kap\u0131lar a\u00e7abilir. Bu makale, bir grafik aray\u00fcz\u00fcne ihtiya\u00e7 duymadan, tamamen programatik olarak Rust ile kendi video karelerinizi (\u00e7er\u00e7evelerinizi) nas\u0131l olu\u015fturaca\u011f\u0131n\u0131z\u0131 ve bunlar\u0131 bir FFmpeg kodlama hatt\u0131na nas\u0131l besleyece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacakt\u0131r. Bu sayede, dinamik, \u00f6zelle\u015ftirilebilir ve y\u00fcksek performansl\u0131 video \u00fcretim s\u00fcre\u00e7lerini kolayca hayata ge\u00e7irebileceksiniz.<\/p>\n<h2>Temel Kavramlar: FFmpeg, Rust ve Video Kareleri Neden \u00d6nemli?<\/h2>\n<p>Bir video i\u015fleme projesine ba\u015flarken, kullan\u0131lan temel ara\u00e7lar\u0131n ve kavramlar\u0131n sa\u011flam bir \u015fekilde anla\u015f\u0131lmas\u0131 kritik \u00f6neme sahiptir. Bu b\u00f6l\u00fcmde, projemizin yap\u0131 ta\u015flar\u0131 olan FFmpeg, Rust ve video kareleri gibi temel bile\u015fenleri detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Bu bile\u015fenlerin her biri, kendi ba\u015f\u0131na g\u00fc\u00e7l\u00fc yeteneklere sahipken, bir araya geldiklerinde ola\u011fan\u00fcst\u00fc sonu\u00e7lar do\u011furabilirler.<\/p>\n<h3>FFmpeg Nedir ve Neden Tercih Etmeliyiz?<\/h3>\n<p>FFmpeg, medya dosyalar\u0131n\u0131 i\u015flemek i\u00e7in kullan\u0131lan a\u00e7\u0131k kaynakl\u0131, komut sat\u0131r\u0131 tabanl\u0131 g\u00fc\u00e7l\u00fc bir yaz\u0131l\u0131m \u00e7er\u00e7evesidir. Ses ve video dosyalar\u0131n\u0131 d\u00f6n\u00fc\u015ft\u00fcrme, s\u0131k\u0131\u015ft\u0131rma, ak\u0131\u015f yapma ve kaydetme gibi \u00e7ok \u00e7e\u015fitli g\u00f6revleri yerine getirebilir. Adeta bir medya i\u015fleme \u0130svi\u00e7re \u00e7ak\u0131s\u0131d\u0131r diyebiliriz. Binlerce farkl\u0131 kodek ve format\u0131 desteklemesi, onu video i\u015fleme d\u00fcnyas\u0131nda vazge\u00e7ilmez bir ara\u00e7 haline getirir. Bizim senaryomuzda, FFmpeg&#8217;i Rust uygulamam\u0131zdan gelen ham video karelerini al\u0131p bunlar\u0131 standart bir video format\u0131na (\u00f6rne\u011fin MP4, WebM) kodlamak veya canl\u0131 bir ak\u0131\u015fa d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in kullanaca\u011f\u0131z. FFmpeg&#8217;in esnekli\u011fi ve geni\u015f topluluk deste\u011fi, kar\u015f\u0131la\u015f\u0131labilecek hemen hemen her medya i\u015fleme ihtiyac\u0131na \u00e7\u00f6z\u00fcm sunar. \u00d6zellikle d\u00fc\u015f\u00fck seviyeli kontroller sunmas\u0131, \u00f6zel video \u00fcretim senaryolar\u0131 i\u00e7in paha bi\u00e7ilmezdir.<\/p>\n<h3>Rust Neden Bu \u0130\u015f \u0130\u00e7in \u0130deal Bir Se\u00e7im?<\/h3>\n<p>Rust, performans, g\u00fcvenlik ve e\u015fzamanl\u0131l\u0131k gibi konularda \u00f6ne \u00e7\u0131kan modern bir sistem programlama dilidir. \u00d6zellikle bellek g\u00fcvenli\u011fi konusunda sundu\u011fu garantiler, medya i\u015fleme gibi hata tolerans\u0131n\u0131n d\u00fc\u015f\u00fck oldu\u011fu alanlarda b\u00fcy\u00fck avantaj sa\u011flar. Karma\u015f\u0131k bellek y\u00f6netimi hatalar\u0131n\u0131 derleme zaman\u0131nda yakalayarak \u00e7al\u0131\u015fma zaman\u0131 hatalar\u0131n\u0131 minimize eder. Ayr\u0131ca, C\/C++ ile benzer bir performans sunarken, daha g\u00fcvenli ve modern bir geli\u015ftirme deneyimi sa\u011flar. Bu, FFmpeg gibi C tabanl\u0131 k\u00fct\u00fcphanelerle etkile\u015fim kurarken FFI (Foreign Function Interface) arac\u0131l\u0131\u011f\u0131yla g\u00fcvenli ve verimli bir k\u00f6pr\u00fc kurmam\u0131z\u0131 sa\u011flar. Rust&#8217;\u0131n e\u015fzamanl\u0131l\u0131k yetenekleri sayesinde, video karelerini \u00fcretme ve FFmpeg&#8217;e besleme gibi yo\u011fun i\u015flemleri paralel olarak y\u00fcr\u00fcterek genel performans\u0131 art\u0131rabiliriz. Bu kombinasyon, \u00f6zellikle ger\u00e7ek zamanl\u0131 veya y\u00fcksek hacimli video \u00fcretim projelerinde Rust&#8217;\u0131 ideal bir se\u00e7enek haline getirir.<\/p>\n<h3>Video Kareleri ve Piksel Formatlar\u0131: Temel Bilgiler<\/h3>\n<p>Bir video, asl\u0131nda art arda g\u00f6sterilen hareketsiz resimler, yani video karelerinden (frame) olu\u015fur. Her bir video karesi, piksel ad\u0131 verilen k\u00fc\u00e7\u00fck renk noktalar\u0131ndan meydana gelir. Bu piksellerin nas\u0131l temsil edildi\u011fi, piksel format\u0131 (pixel format) ile belirlenir. En yayg\u0131n piksel formatlar\u0131ndan baz\u0131lar\u0131 \u015funlard\u0131r:<\/p>\n<ul>\n<li><code>RGB (Red, Green, Blue)<\/code>: Her pikselin k\u0131rm\u0131z\u0131, ye\u015fil ve mavi bile\u015fenlerinin yo\u011funlu\u011funu do\u011frudan belirten bir formatt\u0131r. \u0130nsan g\u00f6z\u00fcn\u00fcn renkleri alg\u0131lama \u015fekline benzer ve genellikle grafik kartlar\u0131 taraf\u0131ndan kullan\u0131l\u0131r.<\/li>\n<li><code>YUV (Luma, Chrominance)<\/code>: Parlakl\u0131k (Y) ve renk (U, V) bile\u015fenlerini ayr\u0131 ayr\u0131 temsil eden bir formatt\u0131r. \u0130nsan g\u00f6z\u00fc parlakl\u0131k de\u011fi\u015fikliklerine renk de\u011fi\u015fikliklerinden daha duyarl\u0131 oldu\u011fu i\u00e7in, YUV formatlar\u0131 genellikle renk bilgisini daha d\u00fc\u015f\u00fck \u00e7\u00f6z\u00fcn\u00fcrl\u00fckte saklayarak s\u0131k\u0131\u015ft\u0131rma oranlar\u0131n\u0131 art\u0131r\u0131r. Video s\u0131k\u0131\u015ft\u0131rma ve iletiminde yayg\u0131n olarak kullan\u0131l\u0131r.<\/li>\n<\/ul>\n<p>Bizim durumumuzda, Rust&#8217;ta kendi karelerimizi olu\u015ftururken genellikle <code>RGB<\/code> veya <code>RGBA<\/code> (alfa kanal\u0131 ile) format\u0131nda piksel verileriyle \u00e7al\u0131\u015f\u0131r\u0131z. Ancak FFmpeg&#8217;e beslerken, kodlay\u0131c\u0131n\u0131n tercih etti\u011fi bir YUV format\u0131na d\u00f6n\u00fc\u015ft\u00fcrmek genellikle daha verimlidir. \u00c7\u00f6z\u00fcn\u00fcrl\u00fck (resolution) bir karenin geni\u015flik ve y\u00fckseklik cinsinden piksel boyutunu (\u00f6rne\u011fin 1920&#215;1080), FPS (Frame Per Second) ise saniyede g\u00f6sterilen kare say\u0131s\u0131n\u0131 ifade eder. Bu parametreler, olu\u015fturaca\u011f\u0131m\u0131z videonun kalitesini ve boyutunu do\u011frudan etkileyecektir. Kendi karelerimizi olu\u015ftururken, bu formatlar\u0131 ve parametreleri do\u011fru bir \u015fekilde anlamak, verimli ve uyumlu bir entegrasyon i\u00e7in elzemdir.<\/p>\n<h2>Rust ile FFmpeg Entegrasyonunun Temelleri: Hangi K\u00fct\u00fcphaneleri Kullanmal\u0131y\u0131z?<\/h2>\n<p>Rust&#8217;\u0131n g\u00fc\u00e7l\u00fc yap\u0131s\u0131n\u0131 FFmpeg&#8217;in kapsaml\u0131 medya i\u015fleme yetenekleriyle birle\u015ftirmek i\u00e7in, Rust taraf\u0131nda FFmpeg&#8217;e eri\u015fim sa\u011flayan bir aray\u00fcze ihtiyac\u0131m\u0131z var. Bu b\u00f6l\u00fcmde, bu entegrasyonu nas\u0131l sa\u011flayaca\u011f\u0131m\u0131z\u0131 ve projemizi nas\u0131l yap\u0131land\u0131raca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Bu temel ad\u0131mlar, daha karma\u015f\u0131k video i\u015fleme senaryolar\u0131 i\u00e7in sa\u011flam bir zemin olu\u015fturacakt\u0131r.<\/p>\n<h3>FFmpeg Ba\u011flay\u0131c\u0131lar\u0131 (Bindings): Neden ve Nas\u0131l?<\/h3>\n<p>FFmpeg, C dilinde yaz\u0131lm\u0131\u015f bir k\u00fct\u00fcphanedir. Rust gibi farkl\u0131 bir dilden bu k\u00fct\u00fcphaneye eri\u015fmek i\u00e7in &#8220;ba\u011flay\u0131c\u0131lara&#8221; (bindings) ihtiyac\u0131m\u0131z vard\u0131r. Bu ba\u011flay\u0131c\u0131lar, C fonksiyonlar\u0131n\u0131 ve veri yap\u0131lar\u0131n\u0131 Rust kodu i\u00e7inde \u00e7a\u011fr\u0131labilir ve kullan\u0131labilir hale getirir. Rust ekosisteminde FFmpeg i\u00e7in \u00e7e\u015fitli ba\u011flay\u0131c\u0131lar bulunsa da, en yayg\u0131n ve bak\u0131m\u0131 yap\u0131lan k\u00fct\u00fcphanelerden biri <code>ffmpeg-next<\/code>&#8216;tir. Bu k\u00fct\u00fcphane, FFmpeg&#8217;in alt seviye API&#8217;lerine Rust&#8217;a \u00f6zg\u00fc, g\u00fcvenli ve idiomatik bir aray\u00fcz sunar.<\/p>\n<p>FFmpeg&#8217;in C API&#8217;si olduk\u00e7a karma\u015f\u0131k olabilir, ancak <code>ffmpeg-next<\/code> gibi ba\u011flay\u0131c\u0131lar bu karma\u015f\u0131kl\u0131\u011f\u0131 Rust geli\u015ftiricileri i\u00e7in daha y\u00f6netilebilir hale getirir. Bu ba\u011flay\u0131c\u0131lar, FFI (Foreign Function Interface) mekanizmas\u0131n\u0131 kullanarak Rust kodu ile C k\u00fct\u00fcphanesi aras\u0131nda bir k\u00f6pr\u00fc kurar. Bu sayede, FFmpeg&#8217;in sundu\u011fu t\u00fcm \u00f6zelliklere Rust&#8217;\u0131n g\u00fcvenlik ve performans garantileriyle eri\u015febiliriz.<\/p>\n<h3>Rust Projesi Kurulumu ve Ba\u011f\u0131ml\u0131l\u0131klar<\/h3>\n<p>Yeni bir Rust projesi olu\u015fturmak ve gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 eklemek olduk\u00e7a basittir. \u00d6ncelikle, Rust&#8217;\u0131n paket y\u00f6neticisi Cargo ile yeni bir proje ba\u015flat\u0131yoruz:<\/p>\n<div class=\"code-container\">\n<pre><code>cargo new ffmpeg_frame_pusher\ncd ffmpeg_frame_pusher<\/code><\/pre>\n<\/p><\/div>\n<p>Ard\u0131ndan, projenin <code>Cargo.toml<\/code> dosyas\u0131na <code>ffmpeg-next<\/code> ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131 eklememiz gerekiyor. Ayr\u0131ca, kare verilerini i\u015flemek i\u00e7in belki bir <code>image<\/code> k\u00fct\u00fcphanesine veya zaman i\u015flemleri i\u00e7in <code>chrono<\/code> gibi bir k\u00fct\u00fcphaneye de ihtiya\u00e7 duyabiliriz. Basit bir ba\u015flang\u0131\u00e7 i\u00e7in <code>ffmpeg-next<\/code> yeterlidir:<\/p>\n<div class=\"code-container\">\n<pre><code># Cargo.toml\n\n[package]\nname = \"ffmpeg_frame_pusher\"\nversion = \"0.1.0\"\nedition = \"2021\"\n\n[dependencies]\nffmpeg-next = \"6.0.0\" # Kulland\u0131\u011f\u0131n\u0131z FFmpeg s\u00fcr\u00fcm\u00fcne g\u00f6re bu de\u011fi\u015febilir.\n<\/code><\/pre>\n<\/p><\/div>\n<p><code>ffmpeg-next<\/code> k\u00fct\u00fcphanesini kullanabilmek i\u00e7in sisteminizde FFmpeg&#8217;in geli\u015ftirme dosyalar\u0131n\u0131n (header files ve libraries) kurulu olmas\u0131 gerekmektedir. Kurulum y\u00f6nergeleri i\u015fletim sisteminize g\u00f6re de\u011fi\u015fiklik g\u00f6sterebilir:<\/p>\n<ul>\n<li><strong>Debian\/Ubuntu:<\/strong> <code>sudo apt-get install libavformat-dev libavcodec-dev libavutil-dev libswscale-dev<\/code><\/li>\n<li><strong>macOS (Homebrew ile):<\/strong> <code>brew install ffmpeg<\/code><\/li>\n<li><strong>Windows:<\/strong> FFmpeg&#8217;in geli\u015ftirme paketlerini indirip PATH&#8217;e eklemeniz veya belirli bir konuma yerle\u015ftirmeniz gerekebilir. Bu, genellikle biraz daha karma\u015f\u0131k bir ad\u0131md\u0131r ve detayl\u0131 bir rehber gerektirebilir.<\/li>\n<\/ul>\n<p>Bu ba\u011f\u0131ml\u0131l\u0131klar\u0131 ekledikten sonra, Rust projemiz FFmpeg k\u00fct\u00fcphanesini kullanmaya haz\u0131r hale gelecektir.<\/p>\n<h3>FFmpeg&#8217;i Ba\u015flatma ve Temel Konfig\u00fcrasyon<\/h3>\n<p>FFmpeg k\u00fct\u00fcphanesini Rust kodunuzda kullanmaya ba\u015flamadan \u00f6nce, onu uygun \u015fekilde ba\u015flatman\u0131z gerekir. Bu, genellikle bir kerelik bir i\u015flemdir ve FFmpeg&#8217;in dahili bile\u015fenlerini (kodekler, formatlar vb.) y\u00fcklemesini sa\u011flar. <code>ffmpeg-next<\/code> k\u00fct\u00fcphanesi bu i\u015flemi olduk\u00e7a basitle\u015ftirir:<\/p>\n<div class=\"code-container\">\n<pre><code>fn main() {\n    ffmpeg_next::init().unwrap(); \/\/ FFmpeg k\u00fct\u00fcphanesini ba\u015flat\u0131r.\n    \/\/ Di\u011fer FFmpeg i\u015flemleri burada yap\u0131lacak.\n    println!(\"FFmpeg ba\u015far\u0131yla ba\u015flat\u0131ld\u0131.\");\n}\n<\/code><\/pre>\n<\/p><\/div>\n<p><code>ffmpeg_next::init().unwrap()<\/code> \u00e7a\u011fr\u0131s\u0131, FFmpeg&#8217;in t\u00fcm dahili mod\u00fcllerini y\u00fckler ve kullan\u0131ma haz\u0131r hale getirir. E\u011fer bu ba\u015flatma i\u015flemi ba\u015far\u0131s\u0131z olursa (\u00f6rne\u011fin FFmpeg k\u00fct\u00fcphaneleri bulunamazsa), program panikleyecektir. Ger\u00e7ek d\u00fcnya uygulamalar\u0131nda, bu hatay\u0131 daha zarif bir \u015fekilde ele almak isteyebilirsiniz. Ba\u015flatma i\u015flemi genellikle uygulaman\u0131n ba\u015flang\u0131c\u0131nda bir kez yap\u0131l\u0131r ve daha sonra t\u00fcm FFmpeg operasyonlar\u0131 bu ba\u015flat\u0131lm\u0131\u015f ba\u011flam \u00fczerinde ger\u00e7ekle\u015ftirilir.<\/p>\n<p>Bu temel kurulum ve ba\u015flatma ad\u0131mlar\u0131, Rust ile FFmpeg&#8217;in g\u00fc\u00e7l\u00fc d\u00fcnyas\u0131na ad\u0131m atman\u0131z i\u00e7in sa\u011flam bir temel olu\u015fturur. Art\u0131k kendi video karelerinizi olu\u015fturmaya ve bunlar\u0131 FFmpeg hatt\u0131na beslemeye haz\u0131r\u0131z.<\/p>\n<h2>Kendi Video Karelerinizi Olu\u015fturma ve Y\u00f6netme: Bir Sim\u00fclasyon \u00d6rne\u011fi<\/h2>\n<p>Rust ile FFmpeg entegrasyonunun temelini att\u0131ktan sonra, s\u0131radaki ad\u0131m kendi video karelerimizi programatik olarak olu\u015fturmakt\u0131r. Bu b\u00f6l\u00fcmde, basit bir g\u00f6rsel desen olu\u015fturarak ve bu deseni ham piksel verisi olarak nas\u0131l y\u00f6netece\u011fimizi g\u00f6stererek &#8220;ba\u015fs\u0131z&#8221; bir \u00e7er\u00e7eve kayna\u011f\u0131 olu\u015fturma s\u00fcrecini ele alaca\u011f\u0131z. Bu \u00f6rnek, daha karma\u015f\u0131k dinamik i\u00e7erik \u00fcretimleri i\u00e7in bir ba\u015flang\u0131\u00e7 noktas\u0131 olacakt\u0131r.<\/p>\n<h3>Ham Piksel Verisi Olu\u015fturma: Basit Bir Animasyon<\/h3>\n<p>Bir video karesi, asl\u0131nda bir dizi pikselden ibarettir. Her pikselin rengi, belirli bir formatta (\u00f6rne\u011fin RGB veya RGBA) say\u0131sal de\u011ferlerle temsil edilir. Bizim amac\u0131m\u0131z, Rust kodu i\u00e7inde bu say\u0131sal de\u011ferleri \u00fcreterek bir resim olu\u015fturmakt\u0131r. \u00d6rne\u011fin, belirli bir geni\u015flik (width) ve y\u00fckseklik (height) i\u00e7in her pikseli temsil eden <code>Vec&lt;u8&gt;<\/code> t\u00fcr\u00fcnde bir bayt dizisi olu\u015fturabiliriz. Her piksel i\u00e7in 3 (RGB) veya 4 (RGBA) bayt kullanabiliriz.<\/p>\n<p>A\u015fa\u011f\u0131daki \u00f6rnekte, basit bir renk ge\u00e7i\u015fi (gradient) efekti olu\u015fturan ve zamanla de\u011fi\u015fen bir video karesi \u00fcretelim. Bu, dinamik bir i\u00e7eri\u011fin nas\u0131l olu\u015fturulabilece\u011fine dair basit bir g\u00f6sterim olacakt\u0131r. Her kare, farkl\u0131 bir renk tonuna sahip olacak veya bir animasyon efekti i\u00e7erecektir.<\/p>\n<div class=\"code-container\">\n<pre><code>fn generate_frame(width: u32, height: u32, frame_num: u64) -> Vec&lt;u8&gt; {\n    let mut frame_data = Vec::with_capacity((width * height * 3) as usize); \/\/ RGB format\u0131 i\u00e7in 3 bayt\/piksel\n\n    for y in 0..height {\n        for x in 0..width {\n            \/\/ Basit bir renk ge\u00e7i\u015fi ve animasyon\n            let r = ((x as f32 \/ width as f32) * 255.0) as u8;\n            let g = ((y as f32 \/ height as f32) * 255.0) as u8;\n            let b = ((frame_num % 256) as u8 + (x \/ 5 + y \/ 5) as u8) % 256; \/\/ Zamanla de\u011fi\u015fen mavi bile\u015feni\n\n            frame_data.push(r);\n            frame_data.push(g);\n            frame_data.push(b);\n        }\n    }\n    frame_data\n}\n<\/code><\/pre>\n<\/p><\/div>\n<p>Yukar\u0131daki <code>generate_frame<\/code> fonksiyonu, belirli bir geni\u015flik, y\u00fckseklik ve kare numaras\u0131na (<code>frame_num<\/code>) g\u00f6re bir RGB piksel dizisi olu\u015fturur. <code>frame_num<\/code> de\u011feri, her karenin farkl\u0131 olmas\u0131n\u0131 sa\u011flayarak bir animasyon etkisi yarat\u0131r. Bu fonksiyon, video ak\u0131\u015f\u0131na besleyece\u011fimiz ham piksel verisini \u00fcretmek i\u00e7in kullan\u0131lacakt\u0131r.<\/p>\n<h3><code>AVFrame<\/code> Yap\u0131s\u0131 ve \u00d6zel Verilerle Doldurma<\/h3>\n<p>FFmpeg, video karelerini kendi dahili <code>AVFrame<\/code> yap\u0131s\u0131 i\u00e7inde temsil eder. Bu yap\u0131, piksel verisinin yan\u0131 s\u0131ra kare zaman damgas\u0131, piksel format\u0131, geni\u015flik, y\u00fckseklik gibi \u00f6nemli meta verileri de i\u00e7erir. Rust&#8217;ta <code>ffmpeg-next<\/code> k\u00fct\u00fcphanesi arac\u0131l\u0131\u011f\u0131yla bu <code>AVFrame<\/code> yap\u0131s\u0131n\u0131 olu\u015fturabilir ve kendi \u00fcretti\u011fimiz piksel verileriyle doldurabiliriz.<\/p>\n<p><code>AVFrame<\/code>&#8216;i do\u011fru bir \u015fekilde doldurmak i\u00e7in \u015fu ad\u0131mlar\u0131 izlememiz gerekir:<\/p>\n<ol>\n<li>Yeni bir <code>AVFrame<\/code> nesnesi olu\u015fturmak.<\/li>\n<li>\u00c7\u00f6z\u00fcn\u00fcrl\u00fck (geni\u015flik, y\u00fckseklik) ve piksel format\u0131n\u0131 ayarlamak.<\/li>\n<li>FFmpeg&#8217;in bu kare i\u00e7in bellek ay\u0131rmas\u0131n\u0131 sa\u011flamak (veya mevcut belle\u011fi kullanmak).<\/li>\n<li>Kendi \u00fcretti\u011fimiz piksel verilerini bu <code>AVFrame<\/code>&#8216;in veri tamponlar\u0131na kopyalamak.<\/li>\n<\/ol>\n<p>Ancak burada \u00f6nemli bir nokta var: \u00c7o\u011fu FFmpeg kodlay\u0131c\u0131s\u0131, <code>YUV<\/code> piksel formatlar\u0131n\u0131 tercih eder. Bizim <code>generate_frame<\/code> fonksiyonumuz <code>RGB<\/code> \u00fcretti\u011fi i\u00e7in, bu veriyi FFmpeg&#8217;e beslemeden \u00f6nce <code>YUV<\/code>&#8216;ye d\u00f6n\u00fc\u015ft\u00fcrmemiz gerekir. Bu d\u00f6n\u00fc\u015f\u00fcm i\u00e7in FFmpeg&#8217;in <code>swscale<\/code> mod\u00fcl\u00fc kullan\u0131l\u0131r. <code>ffmpeg-next<\/code> bu mod\u00fcle eri\u015fim sa\u011flar. Bu i\u015flem, kaynak ve hedef piksel formatlar\u0131n\u0131, \u00e7\u00f6z\u00fcn\u00fcrl\u00fckleri ve \u00f6l\u00e7eklendirme algoritmalar\u0131n\u0131 belirleyerek ger\u00e7ekle\u015ftirilir.<\/p>\n<div class=\"code-container\">\n<pre><code>use ffmpeg_next::format::{Pixel, self};\nuse ffmpeg_next::frame;\nuse ffmpeg_next::software::scaling::{Context, Flags};\n\n\/\/ ... generate_frame fonksiyonu yukar\u0131daki gibi ...\n\nfn create_av_frame(width: u32, height: u32, frame_data: Vec&lt;u8&gt;) -> Result&lt;frame::Video, ffmpeg_next::Error&gt; {\n    let mut frame = frame::Video::new(Pixel::RGB24, width, height);\n    \n    \/\/ Ham RGB verisini AVFrame'e kopyalama\n    \/\/ ffmpeg-next genellikle veriyi kendi y\u00f6netir, ancak bu \u00f6rnekte do\u011frudan kopyalama g\u00f6steriyoruz.\n    \/\/ Daha ger\u00e7ek\u00e7i bir senaryoda, do\u011frudan YUV format\u0131nda bir frame olu\u015fturup doldurmak daha verimli olabilir.\n    \/\/ Veya swscale kullanarak RGB'den YUV'ye d\u00f6n\u00fc\u015ft\u00fcrmek gerekir.\n    \n    \/\/ Basit bir \u00f6rnek i\u00e7in, do\u011frudan RGB24 olarak ayarlay\u0131p, daha sonra d\u00f6n\u00fc\u015ft\u00fcrmeyi g\u00f6sterece\u011fiz.\n    \/\/ \u015eu anki frame_data'y\u0131 AVFrame'e kopyalayal\u0131m.\n    \/\/ RGB24 frame'in data[0] ve linesize[0] alanlar\u0131 kullan\u0131l\u0131r.\n    \n    let frame_slice = frame.data_mut(0);\n    let bytes_per_pixel = 3; \/\/ RGB24 i\u00e7in\n    let expected_len = (width * height * bytes_per_pixel) as usize;\n\n    if frame_data.len() != expected_len {\n        eprintln!(\"Hata: Beklenen kare boyutu {} ancak al\u0131nan {}\", expected_len, frame_data.len());\n        return Err(ffmpeg_next::Error::Bug); \/\/ Veya uygun bir hata t\u00fcr\u00fc\n    }\n\n    frame_slice[..expected_len].copy_from_slice(&frame_data);\n\n    Ok(frame)\n}\n<\/code><\/pre>\n<\/p><\/div>\n<p>Yukar\u0131daki <code>create_av_frame<\/code> fonksiyonu, <code>generate_frame<\/code>&#8216;den gelen RGB verisini al\u0131p bir <code>ffmpeg_next::frame::Video<\/code> nesnesine kopyalar. Ancak, bu ham <code>RGB24<\/code> karesini do\u011frudan bir video kodlay\u0131c\u0131ya beslemek yerine, genellikle \u00f6nce onu kodlay\u0131c\u0131n\u0131n tercih etti\u011fi bir <code>YUV<\/code> format\u0131na d\u00f6n\u00fc\u015ft\u00fcrmemiz gerekir. Bu d\u00f6n\u00fc\u015f\u00fcm, performans\u0131 art\u0131r\u0131r ve kodlay\u0131c\u0131 uyumlulu\u011funu sa\u011flar.<\/p>\n<p>D\u00f6n\u00fc\u015f\u00fcm i\u00e7in <code>swscale<\/code> ba\u011flam\u0131n\u0131 (<code>Context<\/code>) kullan\u0131r\u0131z:<\/p>\n<div class=\"code-container\">\n<pre><code>\/\/ ... main fonksiyonu i\u00e7inde veya ilgili bir yerde ...\n\n\/\/ D\u00f6n\u00fc\u015ft\u00fcrme ba\u011flam\u0131n\u0131 olu\u015fturma (RGB24'ten YUV420P'ye)\nlet mut scaler = Context::get(\n    width,\n    height,\n    Pixel::RGB24,\n    width,\n    height,\n    Pixel::YUV420P,\n    Flags::BILINEAR,\n).unwrap();\n\n\/\/ RGB frame'i olu\u015ftur\nlet rgb_frame_data = generate_frame(width, height, frame_num);\nlet mut rgb_frame = create_av_frame(width, height, rgb_frame_data).unwrap();\n\n\/\/ YUV format\u0131nda bo\u015f bir frame olu\u015ftur\nlet mut yuv_frame = frame::Video::new(Pixel::YUV420P, width, height);\n\n\/\/ RGB frame'i YUV frame'e d\u00f6n\u00fc\u015ft\u00fcr\nscaler.run(&rgb_frame, &mut yuv_frame).unwrap();\n\n\/\/ Art\u0131k 'yuv_frame' kodlay\u0131c\u0131ya beslenebilir.\n<\/code><\/pre>\n<\/p><\/div>\n<p>Bu ad\u0131mlar, kendi \u00fcretti\u011fimiz ham piksel verisini FFmpeg&#8217;in anlayabilece\u011fi ve i\u015fleyebilece\u011fi bir <code>AVFrame<\/code> yap\u0131s\u0131na d\u00f6n\u00fc\u015ft\u00fcrme s\u00fcrecini tamamlar. Bu sayede, dinamik olarak olu\u015fturdu\u011fumuz i\u00e7eri\u011fi FFmpeg&#8217;in g\u00fc\u00e7l\u00fc kodlama yeteneklerine sunabiliriz.<\/p>\n<h2>FFmpeg Pipeline Olu\u015fturma: Kodlama ve \u00c7\u0131k\u0131\u015f \u0130\u015flemleri Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>Kendi video karelerimizi Rust&#8217;ta ba\u015far\u0131yla olu\u015fturup <code>AVFrame<\/code> format\u0131na d\u00f6n\u00fc\u015ft\u00fcrd\u00fckten sonra, bu kareleri bir FFmpeg kodlama hatt\u0131na besleyip bir video dosyas\u0131 olarak kaydetme veya bir ak\u0131\u015fa d\u00f6n\u00fc\u015ft\u00fcrme zaman\u0131 geldi. Bu b\u00f6l\u00fcm, FFmpeg&#8217;in temel kodlama ve \u00e7\u0131k\u0131\u015f i\u015flemlerini Rust ba\u011flam\u0131nda nas\u0131l yap\u0131land\u0131raca\u011f\u0131m\u0131z\u0131 detayland\u0131racakt\u0131r.<\/p>\n<h3>Kodlay\u0131c\u0131 Se\u00e7imi ve Codec Ba\u011flam\u0131 (<code>AVCodecContext<\/code>) Ayarlar\u0131<\/h3>\n<p>Video karelerini bir \u00e7\u0131kt\u0131 dosyas\u0131na yazmadan \u00f6nce, onlar\u0131 belirli bir video format\u0131na (\u00f6rne\u011fin H.264, VP9) kodlamam\u0131z gerekir. Bu i\u015flem i\u00e7in bir video kodlay\u0131c\u0131s\u0131 (encoder) se\u00e7meli ve bu kodlay\u0131c\u0131n\u0131n ayarlar\u0131n\u0131 yap\u0131land\u0131rmal\u0131y\u0131z. FFmpeg, y\u00fczlerce farkl\u0131 kodlay\u0131c\u0131y\u0131 destekler ve <code>ffmpeg-next<\/code> k\u00fct\u00fcphanesi arac\u0131l\u0131\u011f\u0131yla bunlara eri\u015febiliriz.<\/p>\n<p>Kodlay\u0131c\u0131 se\u00e7imi, videonun kalitesi, dosya boyutu ve uyumlulu\u011fu \u00fczerinde do\u011frudan bir etkiye sahiptir. Genellikle <code>H.264<\/code> (libx264) veya <code>VP9<\/code> (libvpx-vp9) gibi modern ve verimli kodlay\u0131c\u0131lar tercih edilir. Kodlay\u0131c\u0131y\u0131 se\u00e7tikten sonra, onun &#8220;codec ba\u011flam\u0131n\u0131&#8221; (<code>AVCodecContext<\/code>) yap\u0131land\u0131rmam\u0131z gerekir. Bu ba\u011flam, kodlay\u0131c\u0131n\u0131n \u00e7al\u0131\u015fma \u015feklini belirleyen \u00e7e\u015fitli parametreleri i\u00e7erir:<\/p>\n<ul>\n<li><strong>\u00c7\u00f6z\u00fcn\u00fcrl\u00fck (Width, Height):<\/strong> Kodlanacak videonun geni\u015fli\u011fi ve y\u00fcksekli\u011fi.<\/li>\n<li><strong>Piksel Format\u0131 (Pixel Format):<\/strong> Kodlay\u0131c\u0131n\u0131n bekledi\u011fi giri\u015f piksel format\u0131 (genellikle <code>YUV420P<\/code>).<\/li>\n<li><strong>Kare H\u0131z\u0131 (FPS &#8211; Frame Rate):<\/strong> Saniyede ka\u00e7 kare kodlanaca\u011f\u0131.<\/li>\n<li><strong>Bit H\u0131z\u0131 (Bit Rate):<\/strong> Videonun veri ak\u0131\u015f h\u0131z\u0131, kalitesini ve dosya boyutunu etkiler.<\/li>\n<li><strong>GOP Boyutu (GOP Size):<\/strong> Keyframe&#8217;ler (ana kareler) aras\u0131ndaki mesafe, s\u0131k\u0131\u015ft\u0131rma verimlili\u011fini etkiler.<\/li>\n<\/ul>\n<p>\u0130\u015fte bir kodlay\u0131c\u0131y\u0131 yap\u0131land\u0131rma \u00f6rne\u011fi:<\/p>\n<div class=\"code-container\">\n<pre><code>use ffmpeg_next::codec::{self, Codec, Id};\nuse ffmpeg_next::format::{Pixel, self};\nuse ffmpeg_next::media::Type;\n\nfn setup_encoder(width: u32, height: u32, fps: u32) -> Result&lt;codec::Context, ffmpeg_next::Error&gt; {\n    \/\/ H.264 kodlay\u0131c\u0131s\u0131n\u0131 bul\n    let encoder = Codec::find(Id::H264).expect(\"H.264 kodlay\u0131c\u0131s\u0131 bulunamad\u0131.\");\n    let mut context = codec::Context::new();\n\n    context.set_width(width);\n    context.set_height(height);\n    context.set_time_base((1, fps).into()); \/\/ FPS'yi ayarla\n    context.set_frame_rate(Some((fps, 1).into()));\n    context.set_pix_fmt(Pixel::YUV420P); \/\/ Giri\u015f piksel format\u0131 YUV420P olmal\u0131\n    context.set_bit_rate(400_000); \/\/ \u00d6rnek bit h\u0131z\u0131 (400 kbps)\n    context.set_gop_size(10); \/\/ Her 10 karede bir keyframe\n\n    \/\/ Kodlay\u0131c\u0131y\u0131 a\u00e7\n    context.open(encoder)?;\n    Ok(context)\n}\n<\/code><\/pre>\n<\/p><\/div>\n<p>Bu fonksiyon, H.264 kodlay\u0131c\u0131s\u0131n\u0131 bulur ve temel parametrelerle bir <code>codec::Context<\/code> olu\u015fturur. <code>context.open(encoder)<\/code> \u00e7a\u011fr\u0131s\u0131, kodlay\u0131c\u0131y\u0131 kullan\u0131ma haz\u0131rlar.<\/p>\n<h3>Output Format Context (<code>AVFormatContext<\/code>) ve Dosya Yazma<\/h3>\n<p>Kodlanm\u0131\u015f video paketlerini bir dosyaya yazmak veya bir ak\u0131\u015fa g\u00f6ndermek i\u00e7in bir &#8220;\u00e7\u0131k\u0131\u015f format\u0131 ba\u011flam\u0131na&#8221; (<code>AVFormatContext<\/code>) ihtiyac\u0131m\u0131z var. Bu ba\u011flam, \u00e7\u0131kt\u0131 dosyas\u0131n\u0131n format\u0131n\u0131 (\u00f6rne\u011fin MP4, MKV) ve ak\u0131\u015f\u0131n \u00f6zelliklerini y\u00f6netir. Bir \u00e7\u0131kt\u0131 format\u0131 ba\u011flam\u0131 olu\u015fturmak i\u00e7in \u015fu ad\u0131mlar izlenir:<\/p>\n<ol>\n<li>\u00c7\u0131k\u0131\u015f format\u0131n\u0131 belirleme (\u00f6rne\u011fin <code>mp4<\/code>).<\/li>\n<li>Yeni bir <code>AVFormatContext<\/code> olu\u015fturma.<\/li>\n<li>Video ak\u0131\u015f\u0131n\u0131 bu ba\u011flama ekleme.<\/li>\n<li>Ak\u0131\u015f\u0131n kodlay\u0131c\u0131 ba\u011flam\u0131n\u0131 ayarlama.<\/li>\n<li>\u00c7\u0131kt\u0131 dosyas\u0131n\u0131 a\u00e7ma.<\/li>\n<li>Dosya ba\u015fl\u0131\u011f\u0131n\u0131 yazma.<\/li>\n<\/ol>\n<div class=\"code-container\">\n<pre><code>use ffmpeg_next::format::{self, context, io};\nuse ffmpeg_next::stream;\n\nfn setup_output(filename: &str, encoder_context: &mut codec::Context) -> Result&lt;context::Output, ffmpeg_next::Error&gt; {\n    let mut output_context = format::context::Output::new_with_path(filename)?;\n    \n    \/\/ Yeni bir video ak\u0131\u015f\u0131 ekle\n    let mut stream = output_context.add_stream(encoder_context.codec())?;\n    stream.set_parameters(encoder_context);\n\n    \/\/ \u00c7\u0131k\u0131\u015f dosyas\u0131n\u0131 a\u00e7\n    output_context.write_header()?;\n\n    Ok(output_context)\n}\n<\/code><\/pre>\n<\/p><\/div>\n<p><code>output_context.add_stream()<\/code> ile bir video ak\u0131\u015f\u0131 ekliyoruz ve bu ak\u0131\u015f\u0131n parametrelerini kodlay\u0131c\u0131 ba\u011flam\u0131m\u0131zdan al\u0131yoruz. <code>output_context.write_header()<\/code> \u00e7a\u011fr\u0131s\u0131, video dosyas\u0131n\u0131n ba\u015fl\u0131k bilgilerini diske yazar. Bu, videonun meta verilerini ve ak\u0131\u015f bilgilerini i\u00e7erir.<\/p>\n<h3>Paketleme ve Yazma: Kareleri Kodlay\u0131c\u0131ya Besleme<\/h3>\n<p>Art\u0131k hem bir kodlay\u0131c\u0131m\u0131z hem de bir \u00e7\u0131kt\u0131 format\u0131 ba\u011flam\u0131m\u0131z oldu\u011funa g\u00f6re, \u00fcretti\u011fimiz <code>YUV<\/code> karelerini kodlay\u0131c\u0131ya besleyebilir ve kodlay\u0131c\u0131n\u0131n \u00fcretti\u011fi video paketlerini \u00e7\u0131kt\u0131 dosyas\u0131na yazabiliriz. Bu s\u00fcre\u00e7 bir d\u00f6ng\u00fc i\u00e7inde ger\u00e7ekle\u015fir:<\/p>\n<ol>\n<li>Her kare i\u00e7in <code>generate_frame<\/code> ve <code>swscale<\/code> kullanarak bir <code>YUV<\/code> karesi olu\u015ftur.<\/li>\n<li>Bu <code>YUV<\/code> karesini kodlay\u0131c\u0131ya besle (<code>encoder_context.send_frame()<\/code>).<\/li>\n<li>Kodlay\u0131c\u0131dan gelen kodlanm\u0131\u015f paketleri al (<code>encoder_context.receive_packet()<\/code>).<\/li>\n<li>Her paketi \u00e7\u0131kt\u0131 ak\u0131\u015f\u0131na yaz (<code>output_context.write_interleaved()<\/code>).<\/li>\n<\/ol>\n<p>Kodlama d\u00f6ng\u00fcs\u00fcn\u00fcn sonunda, kodlay\u0131c\u0131da kalan t\u00fcm paketleri bo\u015faltmak (flush) ve dosya sonunu yazmak \u00f6nemlidir.<\/p>\n<div class=\"code-container\">\n<pre><code>\/\/ main.rs\nuse ffmpeg_next as ffmpeg;\nuse ffmpeg::format::{Pixel, self};\nuse ffmpeg::frame;\nuse ffmpeg::software::scaling::{Context, Flags};\nuse ffmpeg::codec::{self, Codec, Id};\nuse ffmpeg::media::Type;\n\n\/\/ ... generate_frame fonksiyonu (yukar\u0131daki gibi) ...\n\n\/\/ ... create_av_frame fonksiyonu (yukar\u0131daki gibi) ...\n\n\/\/ ... setup_encoder fonksiyonu (yukar\u0131daki gibi) ...\n\n\/\/ ... setup_output fonksiyonu (yukar\u0131daki gibi) ...\n\nfn main() -> Result&lt;(), ffmpeg::Error&gt; {\n    ffmpeg::init()?;\n\n    let width = 640;\n    let height = 480;\n    let fps = 30;\n    let total_frames = 300; \/\/ 10 saniyelik video\n\n    \/\/ 1. Kodlay\u0131c\u0131y\u0131 ayarla\n    let mut encoder_context = setup_encoder(width, height, fps)?;\n\n    \/\/ 2. \u00c7\u0131k\u0131\u015f dosyas\u0131n\u0131 ayarla\n    let filename = \"output_video.mp4\";\n    let mut output_context = setup_output(filename, &mut encoder_context)?;\n\n    \/\/ 3. RGB'den YUV'ye d\u00f6n\u00fc\u015ft\u00fcrme i\u00e7in scaler olu\u015ftur\n    let mut scaler = Context::get(\n        width,\n        height,\n        Pixel::RGB24,\n        width,\n        height,\n        Pixel::YUV420P,\n        Flags::BILINEAR,\n    )?;\n\n    \/\/ 4. Kareleri \u00fcret, kodla ve yaz\n    for i in 0..total_frames {\n        println!(\"Kare i\u015fleniyor: {}\/{}\", i + 1, total_frames);\n\n        \/\/ RGB frame'i olu\u015ftur\n        let rgb_frame_data = generate_frame(width, height, i as u64);\n        let mut rgb_frame = create_av_frame(width, height, rgb_frame_data)?;\n        rgb_frame.set_pts(i as i64); \/\/ Presentation Timestamp (G\u00f6sterim Zaman Damgas\u0131)\n\n        \/\/ RGB frame'i YUV frame'e d\u00f6n\u00fc\u015ft\u00fcr\n        let mut yuv_frame = frame::Video::new(Pixel::YUV420P, width, height);\n        scaler.run(&rgb_frame, &mut yuv_frame)?;\n\n        \/\/ YUV frame'i kodlay\u0131c\u0131ya g\u00f6nder\n        encoder_context.send_frame(&yuv_frame)?;\n\n        \/\/ Kodlay\u0131c\u0131dan paketleri al ve yaz\n        let mut packet = ffmpeg::Packet::empty();\n        while encoder_context.receive_packet(&mut packet).is_ok() {\n            packet.set_stream(0); \/\/ \u0130lk (tek) video ak\u0131\u015f\u0131 i\u00e7in\n            packet.rescale_ts(encoder_context.time_base(), output_context.stream(0).unwrap().time_base());\n            output_context.write_interleaved(&mut packet)?;\n        }\n    }\n\n    \/\/ Kodlay\u0131c\u0131y\u0131 bo\u015falt (flush)\n    encoder_context.send_eof()?;\n    let mut packet = ffmpeg::Packet::empty();\n    while encoder_context.receive_packet(&mut packet).is_ok() {\n        packet.set_stream(0);\n        packet.rescale_ts(encoder_context.time_base(), output_context.stream(0).unwrap().time_base());\n        output_context.write_interleaved(&mut packet)?;\n    }\n\n    \/\/ Dosya sonunu yaz\n    output_context.write_trailer()?;\n\n    println!(\"Video dosyas\u0131 '{}' ba\u015far\u0131yla olu\u015fturuldu.\", filename);\n\n    Ok(())\n}\n<\/code><\/pre>\n<\/p><\/div>\n<p>Bu kapsaml\u0131 kod \u00f6rne\u011fi, Rust&#8217;ta kendi video karelerinizi olu\u015fturmaktan, bunlar\u0131 FFmpeg kodlay\u0131c\u0131s\u0131na besleyip bir MP4 dosyas\u0131na yazmaya kadar t\u00fcm s\u00fcreci g\u00f6stermektedir. Bu yap\u0131, daha karma\u015f\u0131k dinamik video \u00fcretim senaryolar\u0131 i\u00e7in sa\u011flam bir temel sunar.<\/p>\n<h2>Geli\u015fmi\u015f Senaryolar ve Performans \u0130pu\u00e7lar\u0131: Daha Verimli \u00c7al\u0131\u015fmak \u0130\u00e7in Neler Yapmal\u0131?<\/h2>\n<p>Yukar\u0131daki temel kurulum, \u00e7o\u011fu durum i\u00e7in yeterli olsa da, ger\u00e7ek d\u00fcnya uygulamalar\u0131nda performans, \u00f6l\u00e7eklenebilirlik ve sa\u011flaml\u0131k gibi fakt\u00f6rler kritik hale gelir. Bu b\u00f6l\u00fcmde, Rust ile FFmpeg entegrasyonunuzu daha verimli ve g\u00fc\u00e7l\u00fc hale getirmek i\u00e7in kullanabilece\u011finiz baz\u0131 ileri d\u00fczey teknikleri ve ipu\u00e7lar\u0131n\u0131 inceleyece\u011fiz.<\/p>\n<h3>Ger\u00e7ek Zamanl\u0131 Ak\u0131\u015f (Real-time Streaming)<\/h3>\n<p>Video dosyalar\u0131n\u0131 diske kaydetmek yerine, do\u011frudan bir a\u011f \u00fczerinden yay\u0131nlamak (stream etmek) isteyebilirsiniz. Bu, canl\u0131 yay\u0131n platformlar\u0131, g\u00fcvenlik kameralar\u0131 veya ger\u00e7ek zamanl\u0131 veri g\u00f6rselle\u015ftirmeleri i\u00e7in \u00f6nemlidir. FFmpeg, RTSP, RTMP, HLS gibi bir\u00e7ok ak\u0131\u015f protokol\u00fcn\u00fc destekler. Yapman\u0131z gereken tek \u015fey, <code>setup_output<\/code> fonksiyonunda \u00e7\u0131kt\u0131 dosya ad\u0131 yerine bir ak\u0131\u015f URL&#8217;si (\u00f6rne\u011fin <code>rtmp:\/\/localhost\/live\/streamkey<\/code>) belirtmektir. Ak\u0131\u015f protokol\u00fcne ba\u011fl\u0131 olarak ek yap\u0131land\u0131rmalar gerekebilir, ancak temel mant\u0131k ayn\u0131 kal\u0131r: kareleri kodla ve kodlanm\u0131\u015f paketleri a\u011fa g\u00f6nder.<\/p>\n<div class=\"code-container\">\n<pre><code>\/\/ Ak\u0131\u015f i\u00e7in \u00f6rnek bir setup_output fonksiyonu\nfn setup_streaming_output(url: &str, encoder_context: &mut codec::Context) -> Result&lt;context::Output, ffmpeg::Error&gt; {\n    let mut output_context = format::context::Output::new_with_path(url)?;\n    \/\/ ... di\u011fer ak\u0131\u015f ayarlar\u0131 ve stream ekleme ...\n    output_context.write_header()?;\n    Ok(output_context)\n}\n<\/code><\/pre>\n<\/p><\/div>\n<p>Ger\u00e7ek zamanl\u0131 ak\u0131\u015fta gecikme (latency) ve tamponlama (buffering) \u00f6nemli konulard\u0131r. Kodlay\u0131c\u0131 ayarlar\u0131n\u0131 (\u00f6rne\u011fin GOP boyutu, bit h\u0131z\u0131) ak\u0131\u015f\u0131n gereksinimlerine g\u00f6re optimize etmek, ak\u0131c\u0131 bir deneyim i\u00e7in hayati \u00f6neme sahiptir.<\/p>\n<h3>\u00c7oklu \u0130\u015f Par\u00e7ac\u0131\u011f\u0131 (Multithreading) ile Paralel \u0130\u015fleme<\/h3>\n<p>Video karelerini \u00fcretme ve bunlar\u0131 kodlama i\u015flemleri genellikle yo\u011fun CPU kullan\u0131r. Bu iki s\u00fcreci ayr\u0131 i\u015f par\u00e7ac\u0131klar\u0131nda (thread) \u00e7al\u0131\u015ft\u0131rarak performans\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabiliriz. Bir i\u015f par\u00e7ac\u0131\u011f\u0131 kareleri \u00fcretirken, di\u011fer i\u015f par\u00e7ac\u0131\u011f\u0131 bu kareleri al\u0131p kodlama ve \u00e7\u0131kt\u0131ya yazma i\u015flemlerini yapabilir. Bu, i\u015flemci \u00e7ekirdeklerinin daha verimli kullan\u0131lmas\u0131n\u0131 sa\u011flar ve genel i\u015flem s\u00fcresini k\u0131salt\u0131r.<\/p>\n<p>Rust&#8217;\u0131n g\u00fc\u00e7l\u00fc e\u015fzamanl\u0131l\u0131k \u00f6zellikleri (<code>std::thread<\/code>, kanallar &#8211; <code>mpsc<\/code>) bu t\u00fcr bir mimariyi kolayca kurman\u0131za olanak tan\u0131r. \u00d6rne\u011fin, bir kanala <code>YUV<\/code> karelerini g\u00f6nderip, ba\u015fka bir i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131n bu kareleri kanaldan al\u0131p FFmpeg&#8217;e beslemesini sa\u011flayabilirsiniz.<\/p>\n<div class=\"code-container\">\n<pre><code>use std::sync::mpsc;\nuse std::thread;\n\n\/\/ main i\u00e7inde:\n\/\/ let (tx, rx) = mpsc::channel();\n\n\/\/ Kare \u00fcretici i\u015f par\u00e7ac\u0131\u011f\u0131:\n\/\/ thread::spawn(move || {\n\/\/     for i in 0..total_frames {\n\/\/         let rgb_frame_data = generate_frame(width, height, i as u64);\n\/\/         \/\/ ... RGB'den YUV'ye d\u00f6n\u00fc\u015ft\u00fcrme ...\n\/\/         tx.send(yuv_frame).unwrap(); \/\/ YUV frame'i kanala g\u00f6nder\n\/\/     }\n\/\/ });\n\n\/\/ FFmpeg i\u015fleyici i\u015f par\u00e7ac\u0131\u011f\u0131:\n\/\/ thread::spawn(move || {\n\/\/     for yuv_frame in rx { \/\/ Kanaldan YUV frame'leri al\n\/\/         \/\/ ... kodlama ve yazma i\u015flemleri ...\n\/\/     }\n\/\/ });\n<\/code><\/pre>\n<\/p><\/div>\n<p>Bu yakla\u015f\u0131m, kare \u00fcretimi ve kodlama aras\u0131ndaki darbo\u011fazlar\u0131 azaltmaya yard\u0131mc\u0131 olur.<\/p>\n<h3>Donan\u0131m H\u0131zland\u0131rma (Hardware Acceleration)<\/h3>\n<p>Modern grafik kartlar\u0131 (GPU&#8217;lar), video kodlama ve kod \u00e7\u00f6zme i\u015flemleri i\u00e7in \u00f6zel donan\u0131m birimleri i\u00e7erir. Bu donan\u0131m h\u0131zland\u0131rmay\u0131 kullanmak, CPU \u00fczerindeki y\u00fck\u00fc \u00f6nemli \u00f6l\u00e7\u00fcde azaltabilir ve \u00e7ok daha y\u00fcksek performans sa\u011flayabilir. FFmpeg, \u00e7e\u015fitli donan\u0131m h\u0131zland\u0131rma API&#8217;lerini destekler:<\/p>\n<ul>\n<li><strong>NVIDIA (NVENC):<\/strong> NVIDIA GPU&#8217;lar i\u00e7in.<\/li>\n<li><strong>Intel (VAAPI, QSV):<\/strong> Intel i\u015flemciler ve entegre GPU&#8217;lar i\u00e7in.<\/li>\n<li><strong>AMD (AMF):<\/strong> AMD GPU&#8217;lar i\u00e7in.<\/li>\n<\/ul>\n<p><code>ffmpeg-next<\/code> k\u00fct\u00fcphanesi, bu donan\u0131m h\u0131zland\u0131rma se\u00e7eneklerini kullanmak i\u00e7in gerekli aray\u00fczleri sa\u011flar. Genellikle, kodlay\u0131c\u0131y\u0131 a\u00e7arken uygun donan\u0131m ba\u011flam\u0131n\u0131 (<code>hw_device_ctx<\/code>) ve piksel format\u0131n\u0131 (\u00f6rne\u011fin <code>cuda<\/code> veya <code>qsv<\/code> ile ba\u015flayan piksel formatlar\u0131) belirtmeniz gerekir. Bu, \u00f6zellikle y\u00fcksek \u00e7\u00f6z\u00fcn\u00fcrl\u00fckl\u00fc veya y\u00fcksek FPS&#8217;li videolar\u0131 ger\u00e7ek zamanl\u0131 olarak i\u015flerken kritik bir performans art\u0131\u015f\u0131 sa\u011flar.<\/p>\n<h3>Bellek Y\u00f6netimi ve S\u0131f\u0131r Kopyalama (Zero-Copy) Stratejileri<\/h3>\n<p>Medya i\u015fleme, b\u00fcy\u00fck miktarda veriyle \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in bellek kopyalama i\u015flemleri performans\u0131 olumsuz etkileyebilir. M\u00fcmk\u00fcn oldu\u011funda &#8220;s\u0131f\u0131r kopyalama&#8221; stratejilerini uygulamak, yani veriyi bellekten belle\u011fe gereksiz yere kopyalamaktan ka\u00e7\u0131nmak \u00f6nemlidir. <code>ffmpeg-next<\/code> k\u00fct\u00fcphanesi, <code>AVFrame<\/code> nesnelerinin do\u011frudan kendi bellek tamponlar\u0131n\u0131 kullanmas\u0131na izin vererek bu t\u00fcr optimizasyonlara olanak tan\u0131r. E\u011fer kare verilerini do\u011frudan FFmpeg&#8217;in ay\u0131rd\u0131\u011f\u0131 belle\u011fe yazabilirsek, ek bir kopyalama i\u015fleminden ka\u00e7\u0131nm\u0131\u015f oluruz.<\/p>\n<p>Bu, \u00f6zellikle donan\u0131m h\u0131zland\u0131rma ile birlikte kullan\u0131ld\u0131\u011f\u0131nda daha da \u00f6nemli hale gelir, \u00e7\u00fcnk\u00fc GPU belle\u011fi ile CPU belle\u011fi aras\u0131nda veri transferi de maliyetlidir. Verileri do\u011frudan GPU belle\u011fine yazmak veya GPU&#8217;nun kendi bellek tamponlar\u0131n\u0131 kullanmak, performans\u0131 art\u0131rabilir.<\/p>\n<h3>Hata Y\u00f6netimi ve Sa\u011flaml\u0131k<\/h3>\n<p>FFmpeg i\u015flemleri s\u0131ras\u0131nda \u00e7e\u015fitli hatalar meydana gelebilir (\u00f6rne\u011fin disk dolu, ge\u00e7ersiz kodek parametreleri, a\u011f ba\u011flant\u0131s\u0131 kesilmesi). Rust&#8217;\u0131n <code>Result<\/code> tipi ve hata i\u015fleme mekanizmalar\u0131, bu hatalar\u0131 zarif ve g\u00fcvenli bir \u015fekilde ele alman\u0131z\u0131 sa\u011flar. Her FFmpeg \u00e7a\u011fr\u0131s\u0131n\u0131n <code>Result<\/code> d\u00f6nd\u00fcrd\u00fc\u011f\u00fcnden emin olun ve olas\u0131 hatalar\u0131 uygun \u015fekilde loglay\u0131n veya kullan\u0131c\u0131ya bildirin. Sa\u011flam bir hata y\u00f6netimi, uygulaman\u0131z\u0131n beklenmedik durumlarda bile stabil kalmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Bu geli\u015fmi\u015f teknikler, Rust ve FFmpeg ile olu\u015fturdu\u011funuz video i\u015fleme hatt\u0131n\u0131n potansiyelini tam olarak ortaya \u00e7\u0131karman\u0131za yard\u0131mc\u0131 olacakt\u0131r. Her senaryonun kendine \u00f6zg\u00fc gereksinimleri oldu\u011fundan, en iyi sonu\u00e7lar i\u00e7in bu ipu\u00e7lar\u0131n\u0131 projenizin ihtiya\u00e7lar\u0131na g\u00f6re uyarlaman\u0131z \u00f6nemlidir.<\/p>\n<h2>Vaka Analizi: Dinamik Veri G\u00f6rselle\u015ftirmesi \u0130\u00e7in Ba\u015fs\u0131z Video \u00dcretimi<\/h2>\n<p>\u015eimdiye kadar \u00f6\u011frendiklerimizi ger\u00e7ek bir senaryoda nas\u0131l kullanabilece\u011fimizi inceleyelim. Hayal edin ki, bir IoT sens\u00f6r a\u011f\u0131ndan gelen ger\u00e7ek zamanl\u0131 s\u0131cakl\u0131k, nem veya bas\u0131n\u00e7 verilerini g\u00f6rselle\u015ftiren bir video olu\u015fturman\u0131z gerekiyor. Bu veriler s\u00fcrekli ak\u0131yor ve her 5 saniyede bir, son 30 saniyelik veriyi g\u00f6steren bir grafik i\u00e7eren yeni bir video klibi olu\u015fturup bir sunucuya y\u00fcklemeniz veya canl\u0131 bir g\u00f6sterge paneline yay\u0131nlaman\u0131z gerekiyor. \u00dcstelik bu i\u015flemin bir sunucuda, yani grafik aray\u00fcz\u00fc olmadan (ba\u015fs\u0131z &#8211; headless) ger\u00e7ekle\u015fmesi gerekiyor.<\/p>\n<p><strong>Problem:<\/strong> Sens\u00f6r verilerini dinamik, g\u00fcncel ve g\u00f6rsel olarak \u00e7ekici bir \u015fekilde sunmak, \u00f6zellikle ge\u00e7mi\u015f verileri bir zaman \u00e7izelgesinde g\u00f6stermek.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm:<\/strong> Rust ile dinamik grafikler olu\u015fturup FFmpeg ile video olarak kodlamak.<\/p>\n<ol>\n<li><strong>Veri Al\u0131m\u0131 ve \u0130\u015fleme (Rust):<\/strong>\n<ul>\n<li>Rust uygulamas\u0131, bir veritaban\u0131ndan veya bir Kafka kuyru\u011fundan gelen sens\u00f6r verilerini s\u00fcrekli olarak dinler.<\/li>\n<li>Gelen veriler, son 30 saniyelik bir pencere i\u00e7inde tutulur ve her 5 saniyede bir g\u00fcncellenir.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Grafik Olu\u015fturma (Rust):<\/strong>\n<ul>\n<li>Rust&#8217;\u0131n grafik k\u00fct\u00fcphaneleri (\u00f6rne\u011fin <code>plotters<\/code> veya basit bir piksel i\u015fleme mant\u0131\u011f\u0131), son 30 saniyelik sens\u00f6r verilerini kullanarak dinamik bir \u00e7izgi grafik veya bar grafik olu\u015fturur.<\/li>\n<li>Bu grafik, belirli bir \u00e7\u00f6z\u00fcn\u00fcrl\u00fckteki (\u00f6rne\u011fin 1280&#215;720) bir <code>RGB<\/code> piksel tamponuna d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcr. Her 5 saniyelik periyotta, bu i\u015flem tekrarlanarak yeni bir &#8220;kare&#8221; olu\u015fturulur.<\/li>\n<li>Kareye ayr\u0131ca, mevcut zaman damgas\u0131, ortalama de\u011ferler gibi metin bilgileri de eklenebilir.<\/li>\n<\/ul>\n<\/li>\n<li><strong>FFmpeg Entegrasyonu (Rust):<\/strong>\n<ul>\n<li>Olu\u015fturulan <code>RGB<\/code> piksel tamponu, <code>swscale<\/code> mod\u00fcl\u00fc kullan\u0131larak <code>YUV420P<\/code> format\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcr ve bir <code>AVFrame<\/code>&#8216;e y\u00fcklenir.<\/li>\n<li>Bu <code>AVFrame<\/code>, daha \u00f6nce bahsetti\u011fimiz gibi H.264 gibi bir video kodlay\u0131c\u0131s\u0131na beslenir.<\/li>\n<li>Her 5 saniyede bir, yeni bir video karesi olu\u015fturulur ve bu kodlama hatt\u0131na g\u00f6nderilir. Birka\u00e7 saniyelik bir video klibi (\u00f6rne\u011fin 5 saniye * 30 FPS = 150 kare) olu\u015fturulur.<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u00c7\u0131k\u0131\u015f ve Da\u011f\u0131t\u0131m (FFmpeg):<\/strong>\n<ul>\n<li>Kodlanm\u0131\u015f video paketleri, bir MP4 dosyas\u0131 olarak diske kaydedilir.<\/li>\n<li>Alternatif olarak, do\u011frudan bir RTMP sunucusuna (\u00f6rne\u011fin YouTube Live veya \u00f6zel bir medya sunucusu) ak\u0131\u015f olarak g\u00f6nderilebilir.<\/li>\n<li>Kaydedilen MP4 dosyas\u0131, bir bulut depolama hizmetine (AWS S3, Azure Blob Storage) y\u00fcklenerek web aray\u00fczleri veya mobil uygulamalar \u00fczerinden eri\u015filebilir hale getirilir.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>Bu senaryo, Rust&#8217;\u0131n veri i\u015fleme yeteneklerini FFmpeg&#8217;in medya \u00fcretim g\u00fcc\u00fcyle birle\u015ftirerek, tamamen otomatik ve ba\u015fs\u0131z bir ortamda dinamik, veri odakl\u0131 video i\u00e7eri\u011fi olu\u015fturman\u0131n ne kadar g\u00fc\u00e7l\u00fc bir yol oldu\u011funu g\u00f6stermektedir. Bu yakla\u015f\u0131m, sadece veri g\u00f6rselle\u015ftirmesiyle s\u0131n\u0131rl\u0131 kalmay\u0131p, oyun i\u00e7i tekrar kay\u0131tlar\u0131, g\u00fcvenlik kameralar\u0131 i\u00e7in olay bazl\u0131 video klipler veya ki\u015fiselle\u015ftirilmi\u015f pazarlama videolar\u0131 gibi bir\u00e7ok alanda da kullan\u0131labilir.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Rust&#8217;\u0131n g\u00fcvenlik ve performans avantajlar\u0131n\u0131 FFmpeg&#8217;in e\u015fsiz medya i\u015fleme yetenekleriyle birle\u015ftirmek, dinamik video i\u00e7eri\u011fi olu\u015fturma ve i\u015fleme konusunda yepyeni ufuklar a\u00e7maktad\u0131r. Bu makalede, kendi video karelerinizi Rust&#8217;ta programatik olarak nas\u0131l olu\u015fturaca\u011f\u0131n\u0131z\u0131, bunlar\u0131 FFmpeg&#8217;in dahili <code>AVFrame<\/code> yap\u0131s\u0131na nas\u0131l d\u00f6n\u00fc\u015ft\u00fcrece\u011finizi ve son olarak bir FFmpeg kodlama hatt\u0131 arac\u0131l\u0131\u011f\u0131yla nas\u0131l bir video dosyas\u0131na yazaca\u011f\u0131n\u0131z\u0131 detayl\u0131 bir \u015fekilde inceledik. Ba\u015flang\u0131\u00e7 seviyesinden ileri d\u00fczey optimizasyonlara kadar bir\u00e7ok konuya de\u011finerek, bu g\u00fc\u00e7l\u00fc kombinasyonun potansiyelini g\u00f6zler \u00f6n\u00fcne serdik. \u0130ster ger\u00e7ek zamanl\u0131 veri g\u00f6rselle\u015ftirmeleri, ister otomatik video \u00fcretimi, isterse sanal kamera ak\u0131\u015flar\u0131 olsun, bu teknikler sayesinde projelerinizi bir \u00fcst seviyeye ta\u015f\u0131yabilirsiniz. Art\u0131k kendi ba\u015fs\u0131z (headless) video \u00fcretim hatt\u0131n\u0131z\u0131 Rust ile kurmak i\u00e7in gerekli bilgi ve ara\u00e7lara sahipsiniz.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ul>\n<li>\n            <strong>Rust ile FFmpeg entegrasyonu zor mu?<\/strong><\/p>\n<p>Ba\u015flang\u0131\u00e7ta FFmpeg&#8217;in geni\u015f API&#8217;si ve d\u00fc\u015f\u00fck seviyeli do\u011fas\u0131 nedeniyle karma\u015f\u0131k g\u00f6r\u00fcnebilir. Ancak <code>ffmpeg-next<\/code> gibi Rust ba\u011flay\u0131c\u0131lar\u0131, bu s\u00fcreci \u00f6nemli \u00f6l\u00e7\u00fcde basitle\u015ftirir ve Rust&#8217;\u0131n g\u00fcvenlik garantileriyle daha y\u00f6netilebilir hale getirir. Temel bir pipeline kurmak, bu makaledeki \u00f6rneklerle olduk\u00e7a eri\u015filebilir hale gelmi\u015ftir.<\/p>\n<\/li>\n<li>\n            <strong>Hangi piksel format\u0131n\u0131 kullanmal\u0131y\u0131m?<\/strong><\/p>\n<p>Kendi karelerinizi olu\u015ftururken genellikle <code>RGB<\/code> veya <code>RGBA<\/code> format\u0131yla ba\u015flamak kolayd\u0131r. Ancak video kodlay\u0131c\u0131lar\u0131 genellikle <code>YUV420P<\/code> gibi YUV formatlar\u0131n\u0131 tercih eder. Bu nedenle, <code>swscale<\/code> mod\u00fcl\u00fcn\u00fc kullanarak <code>RGB<\/code> verinizi <code>YUV<\/code>&#8216;ye d\u00f6n\u00fc\u015ft\u00fcrmeniz \u00f6nerilir. Bu, hem uyumluluk hem de performans a\u00e7\u0131s\u0131ndan daha iyidir.<\/p>\n<\/li>\n<li>\n            <strong>Ger\u00e7ek zamanl\u0131 ak\u0131\u015f i\u00e7in performans ipu\u00e7lar\u0131 nelerdir?<\/strong><\/p>\n<p>Ger\u00e7ek zamanl\u0131 ak\u0131\u015fta d\u00fc\u015f\u00fck gecikme ve y\u00fcksek verim kritik \u00f6neme sahiptir. \u00c7oklu i\u015f par\u00e7ac\u0131\u011f\u0131 kullanarak kare \u00fcretimini ve kodlamay\u0131 paralelle\u015ftirmek, donan\u0131m h\u0131zland\u0131rma (NVENC, VAAPI vb.) kullanmak ve kodlay\u0131c\u0131 ayarlar\u0131n\u0131 (\u00f6rne\u011fin d\u00fc\u015f\u00fck GOP boyutu, uygun bit h\u0131z\u0131) ak\u0131\u015f gereksinimlerine g\u00f6re optimize etmek performans\u0131 art\u0131racakt\u0131r.<\/p>\n<\/li>\n<li>\n            <strong>Neden do\u011frudan FFmpeg CLI yerine Rust kullanmal\u0131y\u0131m?<\/strong><\/p>\n<p>FFmpeg CLI, h\u0131zl\u0131 ve esnek olsa da, dinamik olarak i\u00e7erik olu\u015fturma ve karma\u015f\u0131k mant\u0131k y\u00fcr\u00fctme konusunda s\u0131n\u0131rl\u0131d\u0131r. Rust ile kendi karelerinizi olu\u015fturup FFmpeg API&#8217;sine beslemek, uygulaman\u0131z\u0131n i\u00e7ine \u00f6zel g\u00f6rselle\u015ftirme, veri i\u015fleme ve karma\u015f\u0131k ko\u015fullu mant\u0131k eklemenize olanak tan\u0131r. Ayr\u0131ca, Rust&#8217;\u0131n performans ve g\u00fcvenlik avantajlar\u0131ndan faydalan\u0131rs\u0131n\u0131z.<\/p>\n<\/li>\n<li>\n            <strong>Hangi Rust FFmpeg k\u00fct\u00fcphanesini tercih etmeliyim?<\/strong><\/p>\n<p>Bu makalede kulland\u0131\u011f\u0131m\u0131z <code>ffmpeg-next<\/code> k\u00fct\u00fcphanesi, aktif olarak bak\u0131m\u0131 yap\u0131lan ve FFmpeg&#8217;in \u00e7o\u011fu \u00f6zelli\u011fine eri\u015fim sa\u011flayan pop\u00fcler bir se\u00e7imdir. Rust ekosisteminde ba\u015fka ba\u011flay\u0131c\u0131lar da bulunabilir, ancak <code>ffmpeg-next<\/code> genellikle iyi bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r.<\/p>\n<\/li>\n<\/ul>\n<p>#Rust #FFmpeg #Video\u0130\u015fleme #Ba\u015fs\u0131zVideo #MedyaGeli\u015ftirme #Programlama #TeknikMakale<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/python-pipe-frames-to-ffmpeg\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/python-pipe-frames-to-ffmpeg<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"Kendi dinamik video i\u00e7eri\u011finizi an\u0131nda olu\u015fturup i\u015flemek mi istiyorsunuz?","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-43640","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Rust ile FFmpeg Hatt\u0131na Kendi Video Karelerinizi Beslemek: Ba\u015fs\u0131z (Headless) \u00c7er\u00e7eve Kayna\u011f\u0131 Olu\u015fturma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/rust-ile-ffmpeg-hattina-kendi-video-karelerinizi-beslemek-bassiz-headless-cerceve-kaynagi-olusturma\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Rust ile FFmpeg Hatt\u0131na Kendi Video Karelerinizi Beslemek: Ba\u015fs\u0131z (Headless) \u00c7er\u00e7eve Kayna\u011f\u0131 Olu\u015fturma\" \/>\n<meta property=\"og:description\" content=\"Kendi dinamik video i\u00e7eri\u011finizi an\u0131nda olu\u015fturup i\u015flemek mi istiyorsunuz?\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/rust-ile-ffmpeg-hattina-kendi-video-karelerinizi-beslemek-bassiz-headless-cerceve-kaynagi-olusturma\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-27T06:09:45+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-27T06:10:11+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"29 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rust-ile-ffmpeg-hattina-kendi-video-karelerinizi-beslemek-bassiz-headless-cerceve-kaynagi-olusturma\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rust-ile-ffmpeg-hattina-kendi-video-karelerinizi-beslemek-bassiz-headless-cerceve-kaynagi-olusturma\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Rust ile FFmpeg Hatt\u0131na Kendi Video Karelerinizi Beslemek: Ba\u015fs\u0131z (Headless) \u00c7er\u00e7eve Kayna\u011f\u0131 Olu\u015fturma\",\"datePublished\":\"2026-07-27T06:09:45+00:00\",\"dateModified\":\"2026-07-27T06:10:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rust-ile-ffmpeg-hattina-kendi-video-karelerinizi-beslemek-bassiz-headless-cerceve-kaynagi-olusturma\/\"},\"wordCount\":4456,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/rust-ile-ffmpeg-hattina-kendi-video-karelerinizi-beslemek-bassiz-headless-cerceve-kaynagi-olusturma\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rust-ile-ffmpeg-hattina-kendi-video-karelerinizi-beslemek-bassiz-headless-cerceve-kaynagi-olusturma\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/rust-ile-ffmpeg-hattina-kendi-video-karelerinizi-beslemek-bassiz-headless-cerceve-kaynagi-olusturma\/\",\"name\":\"Rust ile FFmpeg Hatt\u0131na Kendi Video Karelerinizi Beslemek: Ba\u015fs\u0131z (Headless) \u00c7er\u00e7eve Kayna\u011f\u0131 Olu\u015fturma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-07-27T06:09:45+00:00\",\"dateModified\":\"2026-07-27T06:10:11+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rust-ile-ffmpeg-hattina-kendi-video-karelerinizi-beslemek-bassiz-headless-cerceve-kaynagi-olusturma\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/rust-ile-ffmpeg-hattina-kendi-video-karelerinizi-beslemek-bassiz-headless-cerceve-kaynagi-olusturma\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rust-ile-ffmpeg-hattina-kendi-video-karelerinizi-beslemek-bassiz-headless-cerceve-kaynagi-olusturma\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Rust ile FFmpeg Hatt\u0131na Kendi Video Karelerinizi Beslemek: Ba\u015fs\u0131z (Headless) \u00c7er\u00e7eve Kayna\u011f\u0131 Olu\u015fturma\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Rust ile FFmpeg Hatt\u0131na Kendi Video Karelerinizi Beslemek: Ba\u015fs\u0131z (Headless) \u00c7er\u00e7eve Kayna\u011f\u0131 Olu\u015fturma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/rust-ile-ffmpeg-hattina-kendi-video-karelerinizi-beslemek-bassiz-headless-cerceve-kaynagi-olusturma\/","og_locale":"tr_TR","og_type":"article","og_title":"Rust ile FFmpeg Hatt\u0131na Kendi Video Karelerinizi Beslemek: Ba\u015fs\u0131z (Headless) \u00c7er\u00e7eve Kayna\u011f\u0131 Olu\u015fturma","og_description":"Kendi dinamik video i\u00e7eri\u011finizi an\u0131nda olu\u015fturup i\u015flemek mi istiyorsunuz?","og_url":"https:\/\/fatihsoysal.com\/blog\/rust-ile-ffmpeg-hattina-kendi-video-karelerinizi-beslemek-bassiz-headless-cerceve-kaynagi-olusturma\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-07-27T06:09:45+00:00","article_modified_time":"2026-07-27T06:10:11+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"29 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/rust-ile-ffmpeg-hattina-kendi-video-karelerinizi-beslemek-bassiz-headless-cerceve-kaynagi-olusturma\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/rust-ile-ffmpeg-hattina-kendi-video-karelerinizi-beslemek-bassiz-headless-cerceve-kaynagi-olusturma\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Rust ile FFmpeg Hatt\u0131na Kendi Video Karelerinizi Beslemek: Ba\u015fs\u0131z (Headless) \u00c7er\u00e7eve Kayna\u011f\u0131 Olu\u015fturma","datePublished":"2026-07-27T06:09:45+00:00","dateModified":"2026-07-27T06:10:11+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/rust-ile-ffmpeg-hattina-kendi-video-karelerinizi-beslemek-bassiz-headless-cerceve-kaynagi-olusturma\/"},"wordCount":4456,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/rust-ile-ffmpeg-hattina-kendi-video-karelerinizi-beslemek-bassiz-headless-cerceve-kaynagi-olusturma\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/rust-ile-ffmpeg-hattina-kendi-video-karelerinizi-beslemek-bassiz-headless-cerceve-kaynagi-olusturma\/","url":"https:\/\/fatihsoysal.com\/blog\/rust-ile-ffmpeg-hattina-kendi-video-karelerinizi-beslemek-bassiz-headless-cerceve-kaynagi-olusturma\/","name":"Rust ile FFmpeg Hatt\u0131na Kendi Video Karelerinizi Beslemek: Ba\u015fs\u0131z (Headless) \u00c7er\u00e7eve Kayna\u011f\u0131 Olu\u015fturma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-07-27T06:09:45+00:00","dateModified":"2026-07-27T06:10:11+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/rust-ile-ffmpeg-hattina-kendi-video-karelerinizi-beslemek-bassiz-headless-cerceve-kaynagi-olusturma\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/rust-ile-ffmpeg-hattina-kendi-video-karelerinizi-beslemek-bassiz-headless-cerceve-kaynagi-olusturma\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/rust-ile-ffmpeg-hattina-kendi-video-karelerinizi-beslemek-bassiz-headless-cerceve-kaynagi-olusturma\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Rust ile FFmpeg Hatt\u0131na Kendi Video Karelerinizi Beslemek: Ba\u015fs\u0131z (Headless) \u00c7er\u00e7eve Kayna\u011f\u0131 Olu\u015fturma"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43640","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=43640"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43640\/revisions"}],"predecessor-version":[{"id":43641,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43640\/revisions\/43641"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=43640"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=43640"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=43640"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}