2025, Oct 18 21:31
Python से ffmpeg चलाते समय subprocess आर्ग्युमेंट्स को सही तरह से पास करने का तरीका
Python से ffmpeg चलाते समय 'Unrecognized option' जैसी त्रुटियों का कारण subprocess में आर्ग्युमेंट्स का गलत पास होना है। shlex और सही टोकनाइज़ेशन से हल पाएं।
Python से ffmpeg चलाते समय, ऐसे पेचीदा एरर आ सकते हैं जो Terminal में वही कमांड लाइन बिना किसी दिक्कत के चलती है। अक्सर गलती इस बात में होती है कि subprocess को आर्ग्युमेंट्स कैसे दिए जा रहे हैं। शेल और Python स्पेसेज़ को अलग तरह से हैंडल करते हैं, और यही छोटा सा असमानता “Unrecognized option” या “Invalid stream specifier” जैसे संदेशों तक पहुंचा देती है। नीचे संक्षेप में बताया गया है कि गड़बड़ी कहाँ होती है और बिना अपने इच्छित ffmpeg विकल्प बदले उसे कैसे ठीक करें।
संदर्भ और काम करती शेल कमांड
काम सीधा है: एक FLAC फ़ाइल को मेटाडेटा सुरक्षित रखते हुए MP3 320k में बदलना और ID3v2 वर्शन 3 सेट करना। macOS Sequoia 15.5 पर Python 3 और ffmpeg 4.2.1 के साथ, टर्मिनल में यह कमांड उम्मीद के मुताबिक चलती है:
/usr/local/bin/ffmpeg -i "/Volumes/MainData/Media/Media Server/_Stage/03 - People Like Us - Aaron Tippin.flac" -b:a 320k -map_metadata 0 -id3v2_version 3 "/Volumes/MainData/Media/Media Server/_Stage/03 - People Like Us - Aaron Tippin.mp3"वह Python उदाहरण जो असफल होता है
उसे सीधे subprocess कॉल में बदलते हुए विकल्प और उनकी वैल्यू को एक-एक लिस्ट एलिमेंट में ठूंस देना पहली नज़र में ठीक लगता है, मगर यही टूटने की वजह बनता है:
import subprocess
argv = [
    '/usr/local/bin/ffmpeg',
    '-i',
    '/Volumes/MainData/Media/Media Server/_Stage/03 - People Like Us - Aaron Tippin.flac',
    '-b:a 320k',
    '-map_metadata 0',
    '-id3v2_version 3',
    '/Volumes/MainData/Media/Media Server/_Stage/03 - People Like Us - Aaron Tippin.mp3',
]
exit_status = subprocess.call(argv)इससे “Unrecognized option 'id3v2_version 3'” जैसे एरर मिलते हैं और उसे हटाने पर “Invalid stream specifier: a 320k.” दिखाई देता है।
असल में गलती कहाँ है
शेल कमांड लाइन को स्पेस के आधार पर टोकन में बाँट देता है—जब तक कि आप किसी हिस्से को एक साथ रखने के लिए क्वोट न करें। Python का subprocess, जब उसे एक लिस्ट दी जाती है, तो हर लिस्ट एलिमेंट के भीतर कोई स्प्लिटिंग नहीं करता। हर आइटम ज्यों‑का‑त्यों एक आर्ग्युमेंट के रूप में पास होता है। यानी “-id3v2_version 3” जैसे लिस्ट एलिमेंट को ffmpeg एक ही ऑप्शन नाम (जिसमें स्पेस है) समझता है, जिसे वह पहचानता नहीं। यही बात “-b:a 320k” पर भी लागू होती है: ffmpeg “-b:a” और “320k” को दो अलग आर्ग्युमेंट्स के रूप में चाहता है, न कि दोनों को एक ही आइटम में चिपकाकर।
समाधान: हर टोकन को अपने अलग लिस्ट एलिमेंट में पास करें
हर फ़्लैग और उसकी वैल्यू को अलग‑अलग आइटम में रखें। argv लिस्ट के किसी एक एलिमेंट के अंदर स्पेस न आने दें। ठीक किया गया कॉल इस तरह होगा:
import subprocess
cmd_parts = [
    '/usr/local/bin/ffmpeg',
    '-i',
    '/Volumes/MainData/Media/Media Server/_Stage/03 - People Like Us - Aaron Tippin.flac',
    '-b:a',
    '320k',
    '-map_metadata',
    '0',
    '-id3v2_version',
    '3',
    '/Volumes/MainData/Media/Media Server/_Stage/03 - People Like Us - Aaron Tippin.mp3',
]
status = subprocess.call(cmd_parts)इस तरह प्रोग्राम, विकल्प और उनकी वैल्यू वही रहती हैं जो काम करती हुई शेल कमांड में थीं, बस उन्हें उस रूप में लिखा जाता है जैसा subprocess वास्तव में चाहता है।
यदि आप एक सिंगल कमांड स्ट्रिंग से शुरू कर रहे हैं और उसे सुरक्षित तरीके से बाँटना है, तो शेल जैसे टोकनाइज़ करने के लिए shlex पर भरोसा करना उचित है।
यह बारीकी क्यों मायने रखती है
शेल की क्वोटिंग नियमों को Python के आर्ग्युमेंट हैंडलिंग के साथ मिलाना स्क्रिप्ट को नाज़ुक बनाता है और निदान भटकाता है। यहां ffmpeg के एरर संदेश सही हैं, मगर परोक्ष: असली समस्या ffmpeg नहीं, बल्कि आर्ग्युमेंट्स के पहुंचने का तरीका है। हर विकल्प और उसकी वैल्यू को अलग एलिमेंट रखने से अलग‑अलग वातावरण में भी व्यवहार अनुमानित रहता है और वे नाज़ुक बग्स खत्म होते हैं जो सिर्फ तब दिखते हैं जब पाथ में स्पेस हों या किसी ऑप्शन को वैल्यू चाहिए।
निष्कर्ष
Python से ffmpeg जैसे कमांड‑लाइन टूल चलाते समय argv लिस्ट को पहले से टोकनाइज़ किए गए आर्ग्युमेंट्स की श्रृंखला मानें। फ़्लैग और वैल्यू अलग रखें, किसी एक लिस्ट आइटम के भीतर स्पेस न घुसाएँ, और जब कमांड स्ट्रिंग को बाँटना पड़े, तो उसी काम के लिए बनी टूल से उसे टोकनाइज़ करें। यह छोटी‑सी सावधानी समय बचाती है, उलझाऊ एरर रोकती है और ऑटोमेशन स्क्रिप्ट्स को मज़बूत बनाती है।