5 पॉइंट द्वारा GN⁺ 2025-05-31 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • typed-ffmpeg Python और TypeScript में FFmpeg को type-safe तरीके से इस्तेमाल करने के लिए एक interface है, जो complex filter graphs के लिए detailed types और documentation प्रदान करता है
  • यह ffmpeg-python से प्रेरित है, लेकिन इसमें IDE autocomplete, comprehensive typing, filter graph JSON serialization, और automatic FFmpeg validation जैसी अतिरिक्त सुविधाएँ जोड़ी गई हैं
  • v4 में FFmpeg 5.x~8.x के लिए अलग-अलग PyPI packages दिए गए हैं, और default typed-ffmpeg latest FFmpeg 8.x bindings इंस्टॉल करता है
  • Python package केवल standard library पर चलता है, लेकिन graph visualization और CLI parsing के लिए क्रमशः [graph], [parse] optional extras इंस्टॉल करने होते हैं
  • ब्राउज़र में filters और commands को प्रयोग करके, real-time में graph देखने के लिए Interactive Playground दिया गया है, जिससे local environment के बिना सीखना और prototyping संभव है

typed-ffmpeg द्वारा दिया गया FFmpeg interface

  • typed-ffmpeg Python और TypeScript के लिए FFmpeg का modern type-safe interface प्रदान करता है
  • यह complex filters के लिए detailed types और documentation को support करता है, और ffmpeg-python की सामान्य सीमाएँ जैसे IDE integration की कमी और comprehensive typing के अभाव को पूरा करता है
  • नई सुविधाओं में filter graph JSON serialization और automatic FFmpeg validation शामिल हैं
  • documentation Documentation पर देखी जा सकती है

मुख्य फीचर्स

  • Zero Dependencies: केवल Python standard library से बना है, जिससे compatibility और security बेहतर होती है
  • Pythonic interface filter graph configuration को सरल बनाता है
  • अधिकांश FFmpeg filters का built-in support देता है और IDE autocomplete प्रदान करता है
  • inline docstring के जरिए filter usage को तुरंत देखा जा सकता है
  • static और dynamic type checking देकर code reliability और developer experience बेहतर करता है
  • filter graphs को JSON format में save करके फिर से load किया जा सकता है
  • graphviz का उपयोग करने वाला graph visualization समझ और debugging में मदद करता है
  • filter graph errors की पहचान और उन्हें ठीक करने में मदद करने वाली सुविधाएँ देता है
  • input/output options, अतिरिक्त codecs और formats सहित अधिक comprehensive interface प्रदान करता है
  • partial evaluation के जरिए filter graphs को modular रूप में बनाकर reuse किया जा सकता है
  • FFmpeg के ffprobe से media files के analysis का built-in support देता है, और dictionary तथा dataclass interface के जरिए metadata निकालता है

FFmpeg version के अनुसार package structure

  • typed-ffmpeg v4, FFmpeg major version के अनुसार अलग PyPI packages प्रदान करता है
    • typed-ffmpeg: latest version, FFmpeg 8.x bindings
    • typed-ffmpeg-v5: FFmpeg 5.x bindings
    • typed-ffmpeg-v6: FFmpeg 6.x bindings
    • typed-ffmpeg-v7: FFmpeg 7.x bindings
    • typed-ffmpeg-v8: FFmpeg 8.x bindings
    • ffmpeg-core: shared runtime, जो automatically install हो जाता है
  • सभी packages एक ही ffmpeg namespace expose करते हैं, इसलिए कोई भी version package इंस्टॉल करने पर code shape समान रहती है
  • अपने इंस्टॉल किए गए FFmpeg version से match करने के लिए ffmpeg -version | head -1 से version जाँचें और उसी के अनुसार package इंस्टॉल करें
  • v4 package structure को v4 Package Architecture दस्तावेज़ में देखा जा सकता है
  • typed-ffmpeg 3.x से upgrade करते समय Migration Guide देखें

इंस्टॉलेशन और optional extras

  • latest FFmpeg 8.x bindings को नीचे दिए गए command से इंस्टॉल किया जाता है
pip install typed-ffmpeg
  • किसी specific FFmpeg version के bindings अलग package के रूप में इंस्टॉल किए जाते हैं
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
  • optional features को extra के रूप में इंस्टॉल किया जाता है
    • [graph]: Graphviz-आधारित graph visualization
    • [parse]: CLI parsing और compile_as_python() support
  • [parse] extra, ffmpeg.compile.compile_cli.parse() द्वारा FFmpeg command line से filter graph को reconstruct करने के लिए आवश्यक version-specific cache data ffmpeg-data-v5 से ffmpeg-data-v8 तक इंस्टॉल करता है
  • अधिकांश users को [parse] extra की आवश्यकता नहीं होती
  • सिस्टम में FFmpeg इंस्टॉल होना जरूरी है
  • यदि ffmpeg-python के साथ एक साथ इंस्टॉल करना हो, तो module name conflict से बचने के लिए typed-ffmpeg-compatible इंस्टॉल करें, और import typed_ffmpeg as ffmpeg इस्तेमाल करें

TypeScript bindings और usage examples

  • TypeScript bindings एक experimental feature हैं, और FFmpeg major version के अनुसार npm packages दिए जाते हैं
    • @typed-ffmpeg/core: Node.js और browser ESM के लिए core runtime
    • @typed-ffmpeg/v5: FFmpeg 5.x bindings
    • @typed-ffmpeg/v6: FFmpeg 6.x bindings
    • @typed-ffmpeg/v7: FFmpeg 7.x bindings
    • @typed-ffmpeg/v8: FFmpeg 8.x bindings
  • latest FFmpeg bindings नीचे दिए गए command से इंस्टॉल की जाती हैं
npm install @typed-ffmpeg/core @typed-ffmpeg/v8
  • TypeScript API, Python API को reflect करती है, लेकिन keyword arguments की जगह option objects जैसे TypeScript-idiomatic patterns का उपयोग करती है
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, और browser-safe ESM bundles शामिल हैं, और exports field के जरिए इनका automatic selection होता है
  • हर version package में FFmpeg version के अनुसार filter availability बताने वाले JSDoc comments शामिल हैं

Python usage flow और playground

  • बुनियादी usage example में ffmpeg.probe() से media file का analysis किया जाता है, और input.mp4 को horizontal flip करके output.mp4 के रूप में output किया जाता है
  • अधिक complex example में trim, concat, overlay, drawbox को मिलाकर filter graph बनाया जाता है
  • और उदाहरण Usage दस्तावेज़ में देखे जा सकते हैं
  • Interactive Playground ब्राउज़र में typed-ffmpeg को सीधे चलाने का environment देता है
    • FFmpeg filters और commands का प्रयोग
    • filter graph का real-time visualization
    • input/output configuration testing
    • interactive examples के जरिए learning
    • filter graph sharing
  • playground, local environment setup के बिना FFmpeg filter chains सीखने और prototyping के लिए उपयुक्त है

development approach और background

  • शुरुआती विचार GPT-3 की मदद से FFmpeg documentation से सीधे FFmpeg filter SDK generate करने का था
  • development process में यह स्पष्ट हुआ कि केवल GPT-3 से काम को पूरी तरह automate करने की सीमाएँ हैं, इसलिए SDK को पूरा करने के लिए पारंपरिक code generation approach पर स्विच किया गया
  • GitHub Copilot और GPT-3 ने development speed बढ़ाने और समय बचाने में मदद की
  • ffmpeg-python project की API style और design ideas ने typed-ffmpeg के development को प्रभावित किया
  • development dependencies pyproject.toml और uv.lock से manage की जाती हैं, और development environment नीचे दिए गए command से इंस्टॉल किया जाता है
uv pip install --group dev

1 टिप्पणियां

 
GN⁺ 2025-05-31
Hacker News की रायें
  • सभी command-line option parser/tool असल में अपने-अपने आप में पूरी configuration language होते हैं, और अलग-अलग tools को उस language में लिखे “program/configuration” की तरह देखना चाहिए—यह बात कम आंकी जाती है
    Unix shell अंतिम argv interpretation से पहले word splitting कर देता है, इसलिए ढेरों dialects ऊपर से एक जैसे दिखते हैं, लेकिन असल में वे चकरा देने वाली हद तक विविध हैं
    पहले मैंने /usr/bin के सभी programs पर --help और -h चला कर देखा था, और उपयोगी help न मिलने का अनुपात काफ़ी बड़ा था
    इसलिए ffmpeg जैसे जटिल tool में types जोड़ना व्यावहारिक रूप से भी फ़ायदेमंद है, और इस वास्तविकता को बेहतर ढंग से सामने लाने में भी मदद करता है

    • शायद यह मुख्य बात नहीं थी, लेकिन मुझे लगता है कि foo --help या foo -h की तुलना में man foo ज़्यादा भरोसेमंद और उपयोगी है
    • beginner के नज़रिए से, यह जानने की उत्सुकता है कि collision कहाँ हुआ था
  • यह दिलचस्प है और actively develop हो रहा है, यह अच्छी बात है, लेकिन इसमें ffmpeg-python जैसी कुछ समस्याएँ दिखती हैं
    "color" जैसे बिना input वाले filter को specify करने का तरीका नहीं दिखता, और subprocess.CREATE_NO_WINDOW की तरह Windows GUI app में CMD window खुलने से रोकने के लिए Popen को flags pass करने का तरीका भी नहीं दिखता
    ffmpeg खुद तो ffmpeg.compile() के बाद सीधे चला सकते हैं, लेकिन ffprobe में, जो ffmpeg.probe() इस्तेमाल करता है, ऐसा करना मुश्किल है
    सुधार: source filter को ffmpeg.sources.color से हल कर लिया। जैसे normal filter के लिए vfilter/afilter इस्तेमाल करते हैं, वैसे arbitrary source filter इस्तेमाल करने का भी कोई तरीका है क्या, यह जानना चाहता हूँ

  • अगर Python में script-based video processing करनी है, तो मैं दृढ़ता से सुझाव दूँगा कि सीधे Vapoursynth पर जाएँ
    यह शुरू से इसी उद्देश्य के लिए बनाया गया था, actively maintained है, community और tools भी ठीक हैं, और ffmpeg command-line interface से बंधा नहीं है
    https://www.vapoursynth.com/

  • typed-ffmpeg “complete type safety, autocomplete, validation” को मुख्य selling point बताता है, लेकिन क्या कोई समझा सकता है कि यहाँ width और height या x/y coordinates को string के रूप में pass करना क्यों उचित है?

    .drawbox(x="50", y="50", width="120", height="120", color="red", thickness="5")  
    

    स्रोत: https://github.com/livingbio/typed-ffmpeg?tab=readme-ov-file...

    • शायद इसलिए कि वे values integers नहीं, बल्कि ffmpeg expressions हैं जो integer में evaluate होती हैं
      उदाहरण के लिए ffmpeg docs में ऐसा example है: drawbox=x=-t:y=0.5*(ih-iw/2.4)-t:w=iw+t*2:h=iw/2.4+t*2:t=2:c=red
      इसे ठीक से type-check करने के लिए शायद किसी तरह की DSL की ज़रूरत होगी
  • अच्छा idea है। निजी तौर पर मैं TypeScript version की उम्मीद कर रहा हूँ

    • Jules preview से करवाया था, तो implementation काफ़ी naive था
      कुछ और readable approaches दिमाग में आते हैं, लेकिन यह देखते हुए कि इसे बहुत छोटे prompt से बनाया गया था, बहुत बुरा नहीं है
      अगर रुचि हो तो changes इस branch में हैं: https://github.com/matt-hensley/typed-ffmpeg/tree/feature/mu...
    • TypeScript का कहीं भी ज़िक्र नहीं है
  • कई languages में generate कर सकने के लिए ffmpeg command line को machine-readable format में describe करने वाला material होना चाहिए

  • visual tool खास तौर पर शानदार दिखता है। FFMPEG जितने pieces देता है, उन सबको जानना मुश्किल है, इसलिए modular/visual programming सच में मददगार हो सकती है—यह उसका अच्छा example लगता है
    छोटा-सा UX note: Win11/Chrome पर लगा था कि DEL key से node या edge delete कर सकूँगा
    कुल मिलाकर बढ़िया है

    • अब जाकर MS के DirectShow GraphEdit जैसा कुछ आया है
  • बढ़िया है, लेकिन सोच रहा हूँ कि क्या यह पूरे commands के बीच frame pipe connection support करता है
    निजी तौर पर मुझे लगता है कि FFMpeg flows में सबसे interesting forms वहीं से खुलने लगते हैं

  • अच्छा है। अगर आप videos को visually edit करना चाहते हैं, तो मेरा बनाया tool भी आज़मा सकते हैं: https://newbeelearn.com/tools/videoeditor/
    यह ffmpeg commands generate करता है