वर्षों से, कई मौके आए जब मुझे मल्टीमीडिया संपादन के किसी न किसी रूप को करने की आवश्यकता पड़ी। ऑडियो, वीडियो, आप इसे नाम दें। चाहे वह मेरे YouTube चैनल के लिए मेरे अनफनी क्लिप बनाना हो, संगीत निकालना या कन्वर्ट करना, सबटाइटल एम्बेड करना, बार-बार, मुझे कमांड-लाइन पर ffmpeg का उपयोग करते हुए खुद को मिला और हमेशा इस प्रक्रिया का आनंद लेते हुए इस विनम्र प्रोग्राम की क्षमताओं से सूक्ष्म रूप से चकित हुआ।
और इसलिए मैंने सोचा, शायद मुझे ffmpeg पर एक अधिक व्यापक गाइड लिखना चाहिए, जो कार्यों और कार्यों की विविधता को सूचीबद्ध करता है, और फिर उन्हें वास्तविक जीवन के उदाहरणों और उपयोग के मामलों के चारों ओर लपेटता है। जबकि मैंने पहली बार 2008 में अपने Flash संपादन ट्यूटोरियल में ffmpeg का उल्लेख किया था, एक नए, अप-टू-डेट लेख का समय आ गया है। यह कमांड-लाइन होने जा रहा है, यह नर्डी होने जा रहा है, लेकिन यह मजेदार भी होना चाहिए। मेरा अनुसरण करें।
बुनियादी बातें
Ffmpeg व्यावहारिक रूप से सभी और किसी भी Linux डिस्ट्रीब्यूशन में उपलब्ध है, और Windows और Mac के लिए बिल्ड भी हैं। यदि आप जानना चाहते हैं कि यह क्या कर सकता है, तो आप बिना तर्कों के या वैकल्पिक -hide_banner फ्लैग के साथ ffmpeg चलाकर इसकी क्षमताओं की जांच कर सकते हैं। आप मुख्य प्रोग्राम के साथ-साथ इसके कई सब-कमांड के लिए हेल्प विकल्प का भी उपयोग कर सकते हैं। सुविधाओं की चकाचौंध भरी सरणी डराने वाली हो सकती है, इसलिए हम धीरे-धीरे लेकिन निश्चित रूप से आगे बढ़ेंगे। फिर, वास्तविक दस्तावेज़ीकरण को न भूलें, जो काफी साफ-सुथरा है।
रूपांतरण और ट्रांसकोडिंग
सबसे आम कार्यों में से एक फाइलों को एक फॉर्मेट से दूसरे में बदलना है। FLV क्लिप से ऑडियो फाइलें निकालने का मेरा उदाहरण याद रखें? वही बात। लेकिन आप एक कैमरे पर रिकॉर्ड किए गए वीडियो को MP4 जैसी किसी चीज़ में बदलना चाह सकते हैं, या शायद अपनी OGG फाइलों को MP3 में बदलना, या इसी तरह। परिदृश्यों की एक अंतहीन विविधता है, और ffmpeg में समर्थित मोड और फॉर्मेट की समान रूप से अंतहीन संख्या। आमतौर पर, आप क्या करेंगे:
- इनपुट फाइल निर्दिष्ट करें।
- वांछित वीडियो और ऑडियो कोडेक्स निर्दिष्ट करें।
- आउटपुट फाइल निर्दिष्ट करें।
यदि आप वीडियो स्ट्रीम में हेरफेर नहीं करना चाहते हैं, तो आप copy कोडेक का उपयोग कर सकते हैं। ऑडियो के लिए भी यही सच है। आप इस विकल्प का उपयोग कर सकते हैं यदि आप कंटेनर बदलना चाहते हैं, जैसे MOV से MP4 में वास्तविक एन्कोडिंग को बदले बिना।
ffmpeg -i MVI_1348.MOV -c:v copy -c:a copy new.mp4
नोट: सभी फॉर्मेट सभी कोडेक्स और विकल्पों का समर्थन नहीं करते हैं, इसलिए यह सभी मामलों में आवश्यक रूप से काम नहीं करेगा। जैसे:
[mp4 @ 0x55a21519fb20] Could not find tag for codec vp8 in stream #0, codec not currently supported in container
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Last message repeated 1 time
यदि आप केवल एक निश्चित स्ट्रीम - ऑडियो, वीडियो, सबटाइटल, या डेटा - निकालना चाहते हैं, तो आप अन्य स्ट्रीम के प्रसंस्करण को दबा सकते हैं (ऑपरेशन के लिए आवश्यक समय और CPU चक्र बचाने के लिए)। उदाहरण के लिए, यदि आप एक संयुक्त ऑडियो-वीडियो मीडिया फाइल से केवल ऑडियो चाहते हैं, तो आप -vn (नो वीडियो) विकल्प का उपयोग कर सकते हैं।
ffmpeg -i MVI_1348.MOV -vn -ar 44100 -ab 192k sound-only.mp3
यह शानदार उपयोगिता आपको चीजें करने के तरीके में बहुत लचीलापन देती है। उदाहरण के लिए, codec:v, vcodec और c:v समान हैं, और आप जो चाहें उपयोग कर सकते हैं। यदि आप केवल ऑडियो आउटपुट चाहते हैं, जैसे ऊपर, तो ffmpeg अनुमान लगाएगा और मान लेगा कि आपका -vn भी मतलब था। आप आउटपुट फॉर्मेट को बाध्य करने के लिए -f फ्लैग का भी उपयोग कर सकते हैं, लेकिन फिर से, टूल आपके कमांड से अंतिम परिणाम का अनुमान लगाने की कोशिश करेगा। उदाहरण के लिए, आप -f mp3 या acodec mp3 का उपयोग कर सकते हैं।
विभिन्न कोडेक्स के अलग-अलग विकल्प होंगे। उदाहरण के लिए, एक ऑडियो फाइल के लिए, आप ऑडियो सैंपलिंग दर और ऑडियो बिटरेट, चैनलों की संख्या, और बहुत कुछ निर्दिष्ट कर सकते हैं। यदि आप कुछ विकल्प छोड़ देते हैं, तो कमांड विफल हो सकती है, या डिफॉल्ट का उपयोग किया जाएगा।
स्केल और गुणवत्ता
एक और आम कार्य वीडियो का आकार (रिज़ॉल्यूशन) और स्ट्रीम की गुणवत्ता बदलना है। Ffmpeg आपको इसे अलग-अलग तरीकों से करने देता है। आप अनुपात को बाध्य कर सकते हैं (और डिफ़ॉल्ट पहलू अनुपात को तोड़ सकते हैं), या ऊर्ध्वाधर या क्षैतिज मूल्य प्लस एक जादू क्वालीफायर निर्दिष्ट करके इसे संरक्षित कर सकते हैं। आप वीडियो बॉर्डर को क्रॉप कर सकते हैं, और आप स्ट्रीम को फिर से एन्कोड कर सकते हैं। इस स्तर पर उदाहरण वारंटेड हैं।
ffmpeg -i input.avi -c:v mpeg4 -vtag xvid -qscale:v 3 -c:a libmp3lame -qscale:a 4 output.avi
यहां हमारे पास क्या है? हम MPEG4 वीडियो स्ट्रीम का उपयोग करके AVI इनपुट फाइल को ट्रांसकोड कर रहे हैं, गुणवत्ता को 3 (qscale) पर सेट करके। कुछ कोडेक्स के लिए, गुणवत्ता 1-31 से होती है, जिसमें 1 उच्चतम है। मैंने कई सामान्य इनपुट फाइलों पर परीक्षण किया, और उच्चतम गुणवत्ता आमतौर पर आकार में लगभग दोगुनी होती है, जबकि 3 या 4 ने लगभग 20-30% कमी दी। Vtag xvid एक MPEG-4 विशिष्ट विकल्प है। इसी तरह, हम ऑडियो के लिए LAME का उपयोग कर रहे हैं।
ffmpeg -i MVI_1348.MOV -vfilters scale=1280:-1 -c:a copy scaled.mp4
यह उदाहरण वीडियो स्केलिंग दिखाता है (आप -vf या -vfilters का उपयोग कर सकते हैं), -1 क्वालीफायर के माध्यम से पहलू अनुपात को संरक्षित करके। हम स्ट्रीम की गुणवत्ता नहीं बदलते हैं। ऑडियो स्ट्रीम को केवल आउटपुट कंटेनर में कॉपी किया जा रहा है। यदि आपका मूल वीडियो बताए गए से अधिक रिज़ॉल्यूशन वाला है, तो आप डाउनस्केलिंग करेंगे, और यदि यह कम है, तो आप अपस्केलिंग करेंगे।
छवि निष्कर्षण, संयोजन, GIFs
Ffmpeg चित्रों में भी हेरफेर कर सकता है, भले ही यह एक मीडिया उपयोगिता है। लेकिन हे, चित्र मीडिया हैं, और अनिवार्य रूप से, वीडियो चलती हुई तस्वीरें हैं, है ना! कुछ कार्य जो आप चाहेंगे - एक वीडियो से फ्रेम निकालकर थंबनेल बनाने के लिए (उच्च-गुणवत्ता वाले भी) मैन्युअल रूप से वीडियो रोकने या व्यस्त स्क्रीनशॉट बनाने के बजाय। आप विपरीत भी कर सकते हैं - स्टिल को स्टॉपमोशन वीडियो में संयोजित करें - या एक पूर्ण वीडियो। आप वीडियो को एनिमेटेड GIF में भी बदल सकते हैं, जो वेब के चारों ओर डैंक मीमिज्म के लिए उपयोगी हो सकता है। एक बार फिर, हम कुछ ... डैंक उदाहरणों के साथ प्रदर्शित करेंगे।
ffmpeg -i input.mp4 -r 1 -f image2 thumb-%3d.png
हम एक इनपुट फाइल निर्दिष्ट करते हैं, हम दर निर्दिष्ट करते हैं (इस मामले में हम वीडियो के 1 सेकंड प्रति 1 छवि चाहते हैं), हम फॉर्मेट निर्दिष्ट करते हैं (image2), और हम आउटपुट फॉर्मेट निर्दिष्ट करते हैं। इस मामले में, हम कुछ चालाक कर रहे हैं। यदि आपने कभी C भाषा कोड देखा है, तो यह परिचित लगेगा। हम चाहते हैं कि थंबनेल के लिए नंबरिंग क्रम में तीन अंक हों। आप किसी भी मात्रा में अंक चुन सकते हैं, लेकिन आदर्श रूप से, आप अपेक्षित निकाली गई छवियों की संख्या से अधिक चाहते हैं।

फिर, छवियों को एक वीडियो में संयोजित करना बहुत समान है:
ffmpeg -f image2 -i thumb-%3d.png stopmotion.mp4
आप दर भी निर्दिष्ट कर सकते हैं (आप चाहते हैं कि आपका वीडियो 24 या 30 FPS जैसा कुछ हो), लेकिन हम इस पर थोड़ा और बाद में गाइड में बात करेंगे, जब हम वीडियो प्लेबैक को धीमा और/या तेज बनाने के बारे में बात करते हैं। और चूंकि हम छवियों के बारे में बात कर रहे हैं, आप उन्हें रिसाइज़ भी कर सकते हैं:
ffmpeg -i thumb-004.png -vf scale=400:-1 test.png
एनिमेटेड GIF वास्तव में दिलचस्प हैं। बनाने में भी काफी सरल। बस एक इनपुट फाइल निर्दिष्ट करें और आउटपुट को gif एक्सटेंशन वाला सेट करें। Ffmpeg बाकी का अनुमान लगा लेगा और आपके लिए अच्छा, उच्च-गुणवत्ता वाला एनिमेटेड GIF बनाएगा।
ffmpeg -i MVI_6654.MOV test.gif

अंत में, GIF के विपरीत, आप एक ऐसी वीडियो भी चाह सकते हैं जो एक छवि से बनी हो - एक स्थिर पूर्वावलोकन लेकिन फिर पृष्ठभूमि में संगीत या पॉडकास्ट जैसा कुछ चल रहा हो। Ffmpeg आपको एक चालाक ट्रिक के साथ ऐसा करने की अनुमति देता है।
ffmpeg -loop 1 -i thumb-001.png -i sound-only.mp3 -c:v libx264 -shortest video-static-image.mp4
हम दो इनपुट प्रदान करते हैं, पहला लूप पर सेट एक छवि है। हम वीडियो को फिर से एन्कोड भी कर रहे हैं। लेकिन चूंकि छवि अनिश्चित काल तक लूप करने के लिए सेट है, हमें shortest विकल्प की भी आवश्यकता है, ताकि ऑपरेशन तब समाप्त हो जब सबसे छोटी क्लिप समाप्त हो जाए, जो इस मामले में वीडियो होगी।
वीडियो विभाजन और संयोजन
यह एक और उपयोगी परिदृश्य है। यदि आपके पास एक बहुत बड़ा क्लिप है, लेकिन आपको केवल कुछ मिनट या सेकंड की आवश्यकता है, तो ffmpeg आवश्यक टुकड़ों को काट सकता है। इसी तरह, आप कई फाइलों को एक स्ट्रीम में संयोजित कर सकते हैं - वीडियो और ऑडियो दोनों। Ffmpeg आपको वांछित प्रारंभ और अंत टाइमस्टैम्प चुनने देता है, इसलिए आपके पास इस बात में बहुत छूट है कि आप कार्य को कैसे संभालते हैं।
-t duration "duration" सेकंड के ऑडियो/वीडियो को रिकॉर्ड या ट्रांसकोड करें
-to time_stop रिकॉर्ड या ट्रांसकोड स्टॉप समय
-fs limit_size बाइट्स में लिमिट फाइल साइज़ सेट करें
-ss time_off प्रारंभ समय ऑफसेट सेट करें
-sseof time_off EOF के सापेक्ष प्रारंभ समय ऑफसेट सेट करें
-seek_timestamp -ss के साथ टाइमस्टैम्प द्वारा खोज सक्षम/अक्षम करें
-timestamp time रिकॉर्डिंग टाइमस्टैम्प सेट करें ('now' वर्तमान समय सेट करने के लिए
)
तो, आप कुछ ऐसा आज़माना चाह सकते हैं:
ffmpeg -i MVI_1348.MOV -ss 4 -t 4 spliced.mp4
यह कमांड इनपुट क्लिप से 4 सेकंड निकालेगा, क्लिप में 4 सेकंड के समय ऑफसेट से शुरू होकर। आप शॉर्ट नोटेशन (4 सेकंड इंगित करता है) या पूर्ण hh:mm:ss.mmm का उपयोग कर सकते हैं। यह आपको एक मिलीसेकंड तक सटीकता देता है, जो सभी व्यावहारिक उपयोग के मामलों के लिए पर्याप्त से अधिक होना चाहिए।
फाइलों को जोड़ना थोड़ा अधिक जटिल है। तकनीकी रूप से संयोजन (concat) कहा जाता है, यह काटने के विकल्प से अलग तरीके से काम करता है। आप कमांड लाइन पर उन वांछित भागों को निर्दिष्ट नहीं करते जिन्हें आप जोड़ना चाहते हैं, आप उन्हें एक फाइल में डालते हैं, एक बहुत विशिष्ट नोटेशन का उपयोग करके, और फिर उस फाइल को ffmpeg के साथ पढ़ते हैं। उदाहरण के लिए:
ffmpeg -f concat -i list.txt -codec copy joined.mp4
list.txt फ़ाइल की सामग्री होगी:
file 'part-1.mp4'
file 'part-2.mp4'
file 'part-3.mp4'
कृपया शब्द file और सिंगल कोटेशन मार्क्स के उपयोग पर ध्यान दें। आप निरपेक्ष और सापेक्ष दोनों पथों का उपयोग कर सकते हैं। यदि आप फ़ाइल फॉर्मेट में गलती करते हैं, तो आपको एक त्रुटि दिखाई देगी:
[concat @ 0x555ca89c38c0] Line 1: unknown keyword 'part-1.mp4'
list.txt: Invalid data found when processing input
यदि आप फ़ाइलों की सूची को कमांड लाइन पर प्रदान करने का प्रयास करते हैं (टेक्स्ट फ़ाइल के बजाय):
part-1.mp4: Invalid data found when processing input
सबटाइटल एम्बेड करें और निकालें
मेरा VLC और सबटाइटल लेख याद है? खैर, यदि आप कमांड लाइन से डरते नहीं हैं, तो आप वही काम ffmpeg के साथ कर सकते हैं। एक तुच्छ उदाहरण के रूप में, मान लें कि आपके पास अलग ऑडियो और सबटाइटल फाइलें हैं। किसी अतिरिक्त प्रसंस्करण के बिना, आप इसके लिए वीडियो फ़िल्टरिंग विकल्प का उपयोग कर सकते हैं:
ffmpeg -i input.avi -vf subtitles=subtitle.srt output.avi
एक अधिक जटिल उपयोग का मामला, नीचे दिया गया कमांड अलग MP4 और सबटाइटल फाइलें लेगा, और उन्हें वीडियो ट्रांसकोडिंग के साथ एक आउटपुट फाइल में संयोजित करेगा। -map विकल्प (दो बार दिखा रहा है, त्रुटि नहीं) उस क्रम को परिभाषित करते हैं जिसमें स्ट्रीम आउटपुट में मैप की जाएंगी। लेकिन फिर कोडेक्स की एक चालाक और कुछ हद तक भ्रमित करने वाली सूची है। क्योंकि हमारे पास कई स्ट्रीम हैं, हम केवल वीडियो भाग में हेरफेर करना चाहते हैं - लेकिन ऑडियो या सबटाइटल नहीं।
उस अंत तक, -c copy निर्दिष्ट करता है कि सभी कोडेक्स कॉपी किए जाने चाहिए, लेकिन -c:v का उपयोग करके इस विकल्प को ओवरराइड करता है, और वीडियो स्ट्रीम को ट्रांसकोड किया जाएगा। चूंकि हम libx264 कोडेक का उपयोग कर रहे हैं, हम कांस्टेंट रेट फैक्टर (CRF) विकल्प का भी उपयोग कर रहे हैं वेरिएबल बिटरेट के लिए, 23 पर सेट (लॉसलेस 0 से सबसे कम गुणवत्ता 51 तक) और veryfast प्रीसेट, जो अपेक्षाकृत छोटा आउटपुट बनाता है।
ffmpeg -i input.mp4 -i subtitle.srt -map 0 -map 1 -c copy -c:v libx264 -crf 23 -preset veryfast output.mp4
सबटाइटल निकालना निम्न रूप लेता है:
ffmpeg -txt_format text -i input.file out.srt
वीडियो तेज करें और धीमा करें
यह एक और दिलचस्प उपयोग का मामला है। किसी भी इंसान की तरह, आप किसी भी वीडियो को लेना चाह सकते हैं, इसे 2x तेज करना, और फिर बेनी हिल संगीत जोड़ना, और बहुत आनंद होना चाहिए। आप एक्शन को धीमा भी कर सकते हैं, और फिर, चीजों को मसाला देने के लिए, स्मूथिंग भी जोड़ सकते हैं ताकि धीमा अनुक्रम अटपटा न लगे।
उदाहरण के लिए, हमारे पास हमारा स्टॉप मोशन वीडियो हो सकता है - केवल 15-20 थंबनेल के साथ, इसे खेलने में केवल एक सेकंड लगता है। तो आप इसे 5 सेकंड तक खींचना चाह सकते हैं, लेकिन इसका मतलब है कि प्रत्येक फ्रेम मूल से पांच गुना अधिक समय तक दिखेगा। इसके बजाय आप संभावित रूप से इसे एक स्मूथ स्लो-मो की तरह दिखाने के लिए "अतिरिक्त" फ्रेम डाल सकते हैं। हमने इसे इंटीरियर डिज़ाइन गैलरी के साथ पुराने दिनों में किया था। हमने इस कार्य के लिए AviSynth और VirtualDub का उपयोग किया था।
वीडियो स्पीड फ़िल्टर प्रत्येक वीडियो फ्रेम के प्रेजेंटेशन टाइमस्टैम्प (PTS) को बदलकर काम करता है। सीधे शब्दों में कहें, भिन्नात्मक मान वीडियो को तेज करते हैं, 1 से अधिक गुणक इसे धीमा करते हैं। जब आप इसे तेज करते हैं, तो ffmpeg फ्रेम ड्रॉप करेगा, लेकिन आप एक उच्च फ्रेमरेट निर्दिष्ट कर सकते हैं। मूल को संरक्षित करने के लिए, आप अपने इनपुट में FPS को 1/PTS से गुणा कर सकते हैं जिसका आप उपयोग कर रहे हैं। तो अगर आप अपने 24FPS क्लिप की गति को दोगुना करते हैं, तो आपको 48FPS दर का उपयोग करना चाहिए।
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" output.mp4
ffmpeg -i input.mp4 -r 96 -filter:v "setpts=0.25*PTS" output.mp4
ffmpeg -i input.mp4 -filter:v "setpts=2*PTS" output.mp4
वीडियो को स्मूथ करना अधिक जटिल है। मुझे दस्तावेज़ीकरण से परामर्श करना पड़ा। अनिवार्य रूप से, एक वीडियो के लिए जो 5 गुना धीमा है (और मूल से 5 गुना लंबा), मैं स्मूथिंग प्रभाव बनाने के लिए वीडियो इंटरपोलेशन का उपयोग कर रहा हूं। यहां भी, आपको FPS जोड़ने की आवश्यकता है, ताकि ffmpeg के पास बीच के फ्रेम का अनुमान लगाने के लिए पर्याप्त डेटा हो। मेरे उदाहरण में, 5x धीमा, आपको 5x24 FPS (मूल गति) चाहिए, यानी 120 FPS।
ffmpeg -i input.mp4 -filter:v "minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=120'" output.mp4
यह एक CPU-गहन कार्य है, और इसे खत्म होने में थोड़ा समय लग सकता है। मैंने वीडियो का पूर्वावलोकन करने के लिए ffplay का उपयोग किया, और मैंने परिणामों को उचित पाया, लेकिन आप वास्तव में कुछ भी नहीं से जादू कर सकते हैं, इसलिए जब यह काम करता है, तो यह तब अच्छा काम करता है जब थोड़ी मात्रा में डेटा गायब हो (हर दो सेकंड में एक फ्रेम प्रति सेकंड या ऐसा नहीं)।
ऑडियो के लिए, आप atempo का उपयोग कर सकते हैं। इस विकल्प की सीमा 0.5-2.0 है, जिसका अर्थ है अधिकतम आधी या दोगुनी गति, हालांकि, कई atempo फिल्टर को श्रृंखलाबद्ध करके अतिरिक्त गति परिवर्तन प्राप्त करना संभव है। नीचे दिए उदाहरण की तरह कुछ:
ffmpeg -i input.mp4 -filter:a "atempo=2.0,atempo=2.0" -vn output.mp4
और यह इस ट्यूटोरियल के अंत को लाता है।
निष्कर्ष
मुझे आशा है कि आपने इसे फलदायी, आनंददायक और प्रासंगिक पाया। Ffmpeg Linux में ऑडियो और वीडियो ट्वीकिंग का वर्कहॉर्स है - नहीं, यह पूरी घुड़सवार सेना है - और इसमें इतने सारे व्यावहारिक उपकरण, विकल्प और कॉन्फ़िगरेशन हैं कि शुरुआत करना भ्रमित करने वाला और शायद डराने वाला भी हो सकता है। उन भावनाओं को अब तक वाष्पित हो जाना चाहिए क्योंकि आपने इस ट्यूटोरियल को पढ़ा है।
वैसे भी, हमने रूपांतरण और ट्रांसकोडिंग, स्केलिंग और गुणवत्ता, छवि निष्कर्षण, संयोजन और GIF निर्माण, वीडियो के विभाजन और संयोजन, सबटाइटल निष्कर्षण और एम्बेडिंग, वीडियो स्पीडअप और स्लोडाउन, और फिर कुछ के बारे में बात की। यह आपको थोड़ी देर के लिए खुश और व्यस्त रखना चाहिए। यदि आपके पास कोई ffmpeg-संबंधित अनुरोध या प्रश्न हैं, तो पूछें, ईमेल केवल एक क्लिक दूर है। या कुछ। अंत में, यदि यह ट्यूटोरियल वास्तव में उपयोगी था, तो कुछ प्यार वापस दें, क्योंकि क्यों नहीं।
चीयर्स।