- typed-ffmpeg, Python ve TypeScript’te FFmpeg’i tip güvenli şekilde kullanmaya yarayan bir arayüzdür; karmaşık filtre grafikleri için ayrıntılı tipler ve dokümantasyon sağlar
ffmpeg-pythondan ilham alır, ancak IDE otomatik tamamlama, kapsamlı tipleme, filtre grafiği JSON serileştirme ve otomatik FFmpeg doğrulaması gibi özellikler ekler
- v4, FFmpeg 5.x~8.x için ayrı PyPI paketleri sunar; varsayılan
typed-ffmpeg en yeni FFmpeg 8.x binding’lerini kurar
- Python paketi yalnızca standart kütüphaneyle çalışır, ancak grafik görselleştirme ve CLI ayrıştırma için sırasıyla
[graph] ve [parse] opsiyonel extra olarak kurulmalıdır
- Tarayıcıda filtreleri ve komutları denemeyi, grafiği gerçek zamanlı görmeyi sağlayan Interactive Playground sunulur; böylece yerel ortam olmadan öğrenme ve prototipleme yapılabilir
typed-ffmpeg’in sunduğu FFmpeg arayüzü
- typed-ffmpeg, FFmpeg için modern ve tip güvenli bir arayüzü Python ve TypeScript’e sunar
- Karmaşık filtreler için ayrıntılı tipleri ve dokümantasyonu destekler;
ffmpeg-pythonın yaygın sınırları olarak görülen IDE entegrasyonu eksikliği ve kapsamlı tiplerin yokluğunu tamamlar
- Yeni özellikler olarak filtre grafiği JSON serileştirme ve otomatik FFmpeg doğrulaması sağlar
- Dokümantasyona Documentation üzerinden erişilebilir
Başlıca özellikler
- Zero Dependencies: Yalnızca Python standart kütüphanesiyle oluşturulmuştur; uyumluluğu ve güvenliği artırır
- Pythonic arayüz ile filtre grafiği oluşturmayı basitleştirir
- FFmpeg filtrelerinin çoğunu yerleşik olarak destekler ve IDE otomatik tamamlama sağlar
- Satır içi docstring’lerle filtre kullanımını doğrudan referans almayı sağlar
- Statik ve dinamik tip denetimi sunarak kod güvenilirliğini ve geliştirme deneyimini iyileştirir
- Filtre grafiklerini JSON biçiminde kaydedip yeniden yükleyebilir
graphviz kullanan grafik görselleştirme, anlamayı ve hata ayıklamayı kolaylaştırır
- Filtre grafiği hatalarını belirleme ve düzeltmeye yardımcı olma özellikleri sağlar
- Girdi/çıktı seçenekleri, ek codec’ler ve formatları içeren daha kapsamlı bir arayüz sunar
- Kısmi değerlendirme sayesinde filtre grafiklerini modüler biçimde oluşturup yeniden kullanmayı sağlar
- FFmpeg’in
ffprobe aracıyla medya dosyası analizine yerleşik destek verir; sözlük ve dataclass arayüzleriyle metadata çıkarır
FFmpeg sürümlerine göre paket yapısı
- typed-ffmpeg v4, FFmpeg ana sürümlerine göre ayrı PyPI paketleri sunar
typed-ffmpeg: En yeni sürüm, FFmpeg 8.x binding’leri
typed-ffmpeg-v5: FFmpeg 5.x binding’leri
typed-ffmpeg-v6: FFmpeg 6.x binding’leri
typed-ffmpeg-v7: FFmpeg 7.x binding’leri
typed-ffmpeg-v8: FFmpeg 8.x binding’leri
ffmpeg-core: Paylaşılan runtime’dır ve otomatik kurulur
- Tüm paketler aynı
ffmpeg namespace’ini dışa açtığından, hangi sürüm paketi kurulursa kurulsun kod biçimi aynıdır
- Kurulu FFmpeg sürümüne eşleştirmek için
ffmpeg -version | head -1 ile sürümü kontrol edip karşılık gelen paketi kurun
- v4 paket yapısı v4 Package Architecture dokümanında görülebilir
- typed-ffmpeg 3.x’ten yükseltirken Migration Guide dokümanına bakın
Kurulum ve opsiyonel extra’lar
- En yeni FFmpeg 8.x binding’leri şu komutla kurulur
pip install typed-ffmpeg
- Belirli bir FFmpeg sürümü için binding’ler ayrı paket olarak kurulur
pip install typed-ffmpeg-v5 # FFmpeg 5.x
pip install typed-ffmpeg-v6 # FFmpeg 6.x
pip install typed-ffmpeg-v7 # FFmpeg 7.x
pip install typed-ffmpeg-v8 # FFmpeg 8.x
- Seçili özellikler extra olarak kurulur
[graph]: Graphviz tabanlı grafik görselleştirme
[parse]: CLI ayrıştırma ve compile_as_python() desteği
[parse] extra’sı, ffmpeg.compile.compile_cli.parse()ın FFmpeg komut satırından filtre grafiğini yeniden oluşturması için gereken sürüme özel önbellek verileri ffmpeg-data-v5ten ffmpeg-data-v8e kadar olan paketleri kurar
- Çoğu kullanıcı için
[parse] extra’sı gerekmez
- Sistemde FFmpeg kurulu olmalıdır
ffmpeg-python ile aynı anda kurulması gerekiyorsa modül adı çakışmasını önlemek için typed-ffmpeg-compatible kurun ve import typed_ffmpeg as ffmpeg kullanın
TypeScript binding’leri ve kullanım örneği
- TypeScript binding’leri deneysel bir özelliktir; FFmpeg ana sürümlerine göre npm paketleri sunar
@typed-ffmpeg/core: Node.js ve tarayıcı ESM için çekirdek runtime
@typed-ffmpeg/v5: FFmpeg 5.x binding’leri
@typed-ffmpeg/v6: FFmpeg 6.x binding’leri
@typed-ffmpeg/v7: FFmpeg 7.x binding’leri
@typed-ffmpeg/v8: FFmpeg 8.x binding’leri
- En yeni FFmpeg binding’leri şu komutla kurulur
npm install @typed-ffmpeg/core @typed-ffmpeg/v8
- TypeScript API, Python API’sini yansıtır; ancak anahtar kelime argümanları yerine options object gibi TypeScript’e özgü kalıpları kullanır
import { input } from "@typed-ffmpeg/v8";
const cmd = input("input.mp4")
.video
.scale({ w: 1280, h: 720 })
.output("output.mp4")
.overwriteOutput()
.compile();
// => ["-i", "input.mp4", "-filter_complex", "...", "output.mp4"]
@typed-ffmpeg/core, CJS, ESM ve tarayıcı güvenli ESM bundle’larını içerir; exports alanı üzerinden otomatik seçilir
- Her sürüm paketi, FFmpeg sürümüne göre filtre kullanılabilirliğini gösteren JSDoc yorumları içerir
Python kullanım akışı ve playground
- Temel kullanım örneği,
ffmpeg.probe() ile medya dosyasını analiz edip input.mp4 dosyasını yatay çevirerek output.mp4 olarak çıktı alma akışıdır
- Karmaşık örnekler
trim, concat, overlay, drawbox kombinasyonuyla filtre grafiği oluşturur
- Daha fazla örnek Usage dokümanında görülebilir
- Interactive Playground, typed-ffmpeg’i tarayıcıda doğrudan deneyebileceğiniz bir ortam sağlar
- FFmpeg filtreleri ve komutlarıyla denemeler
- Filtre grafiğini gerçek zamanlı görselleştirme
- Girdi/çıktı yapılandırmasını test etme
- Etkileşimli örneklerle öğrenme
- Filtre grafiği paylaşma
- Playground, yerel ortam kurulumu olmadan FFmpeg filtre zincirlerini öğrenmek ve prototiplemek için uygundur
Geliştirme yaklaşımı ve arka plan
- İlk fikir, GPT-3 ile FFmpeg dokümantasyonundan doğrudan FFmpeg filtre SDK’sı üretmekti
- Geliştirme sürecinde işi yalnızca GPT-3 ile tamamen otomatikleştirmenin sınırları olduğu görüldü ve SDK’yı tamamlamak için geleneksel kod üretimi yaklaşımına geçildi
- GitHub Copilot ve GPT-3, geliştirme hızını artırmaya ve zaman kazandırmaya yardımcı oldu
ffmpeg-python projesinin API stili ve tasarım fikirleri typed-ffmpeg geliştirmesini etkiledi
- Geliştirme bağımlılıkları
pyproject.toml ve uv.lock ile yönetilir; geliştirme ortamı şu komutla kurulur
uv pip install --group dev
1 yorum
Hacker News yorumları
Tüm komut satırı seçenek ayrıştırıcıları/araçları aslında kendi başlarına eksiksiz birer yapılandırma dili; tek tek araçları da o dilde yazılmış “program/yapılandırma” olarak görmek gerekir, ama bu nokta hafife alınıyor
Unix kabuğu, nihai
argvyorumlamasından önce sözcük ayırma yaptığı için sayısız lehçe dışarıdan benzer görünüyor; oysa gerçekte baş döndürecek kadar çeşitlilerEskiden
/usr/biniçindeki tüm programlarda--helpve-hçalıştırmayı denemiştim; işe yarar yardım metni alamadığım oran epey yüksektiBu yüzden
ffmpeggibi karmaşık bir araca tip eklemek hem pratik fayda sağlıyor hem de bu gerçeği daha iyi görünür kılmaya yardımcı oluyorfoo --helpveyafoo -hyerineman fookomutunun daha güvenilir ve yararlı olduğunu düşünüyorumİlginç ve aktif geliştiriliyor olması güzel, ancak ffmpeg-python ile benzer bazı sorunları var gibi görünüyor
"color"gibi girdisi olmayan bir filtre belirtmenin yolu yok gibi; ayrıca Windows GUI uygulamalarında CMD penceresinin açılmasını engellemek içinsubprocess.CREATE_NO_WINDOWgibi bir bayrağıPopen’a geçirmenin yolu da görünmüyorffmpegiçinffmpeg.compile()sonrasında doğrudan çalıştırmak mümkün, amaffmpeg.probe()kullananffprobetarafında bunu yapmak zorDüzenleme: Kaynak filtreyi
ffmpeg.sources.colorile çözdüm. Genel filtrelerdevfilter/afilterkullanır gibi rastgele bir kaynak filtre kullanmanın bir yolu olup olmadığını merak ediyorumPython’da betik tabanlı video işleme yapacaksanız, doğrudan Vapoursynth’e geçmenizi kuvvetle öneririm
Baştan bu amaç için tasarlandı, aktif olarak bakımı yapılıyor, topluluğu ve araçları da iyi; ayrıca
ffmpegkomut satırı arayüzüne bağlı değilhttps://www.vapoursynth.com/
typed-ffmpeg, “tam tip güvenliği, otomatik tamamlama, doğrulama”yı ana vaadi olarak sunuyor; peki burada genişlik ve yükseklik ya da x/y koordinatlarını string olarak vermek neden makul, açıklayabilir misiniz?Kaynak: https://github.com/livingbio/typed-ffmpeg?tab=readme-ov-file...
Örneğin ffmpeg belgelerinde şöyle bir örnek var:
drawbox=x=-t:y=0.5*(ih-iw/2.4)-t:w=iw+t*2:h=iw/2.4+t*2:t=2:c=redBunu düzgün şekilde tip denetiminden geçirmek için bir tür DSL gerekecek gibi
İyi fikir. Kişisel olarak TypeScript sürümünü bekliyorum
Aklıma gelen daha okunabilir yaklaşımlar var, ama çok kısa bir prompt ile üretildiğini düşünürsek hiç de kötü değil
Merak ederseniz değişiklikler şu branch’te: https://github.com/matt-hensley/typed-ffmpeg/tree/feature/mu...
Birden çok dile üretim yapılabilmesi için ffmpeg komut satırını makine tarafından okunabilir bir biçimde tanımlayan bir kaynağa ihtiyaç var gibi
Görsel araç özellikle harika görünüyor. FFMPEG’in sunduğu parçaların hepsini bilmek zor olduğundan, modüler/görsel programlamanın gerçekten yardımcı olabileceği bir örnek gibi duruyor
Küçük bir UX notu olarak, Win11/Chrome’da DEL tuşuyla düğüm veya kenar silebileceğimi sanmıştım
Genel olarak güzel
Güzel, ama tüm komutlar arasında frame pipe bağlantısını destekleyip desteklemediğini merak ediyorum
Bana göre FFMpeg akışlarında en ilginç biçimler tam da o noktadan itibaren ortaya çıkmaya başlıyor
Güzel. Videoyu görsel olarak düzenlemek istiyorsanız, benim yaptığım aracı da deneyebilirsiniz: https://newbeelearn.com/tools/videoeditor/
ffmpeg komutları üretiyor