कमांड लाइन के माध्यम से MP4 वीडियो से एनिमेटेड GIF कैसे बनाएं?


119

मैं .gifएक .mp4वीडियो से एक एनिमेटेड बनाना चाहते हैं । मैं इसे कमांड लाइन से करना पसंद करूँगा, इसलिए कृपया केवल कमांड लाइन टूल को सूचीबद्ध करें।


आप इस स्क्रिप्ट का उपयोग जीथब पर कर सकते हैं जो FFMPEG का उपयोग करता है और बेहतर चित्र गुणवत्ता के लिए मध्यवर्ती रंग पैलेट बनाता है।
ट्रॉयेन

जवाबों:


127

ffmpeg 3.4.4 इसे सीधे Ubuntu 18.04 पर कर सकते हैं

आप कुछ का उपयोग करना चाहते हैं:

sudo apt-get install ffmpeg
wget -O opengl-rotating-triangle.mp4 https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.mp4?raw=true
ulimit -Sv 1000000
ffmpeg \
  -i opengl-rotating-triangle.mp4 \
  -r 15 \
  -vf scale=512:-1 \
  -ss 00:00:03 -to 00:00:06 \
  opengl-rotating-triangle.gif

इस पोस्ट पर वर्णित टेस्ट जनरेशन प्रक्रिया ।

एक और प्रत्यक्ष:

sudo apt-get install ffmpeg
ffmpeg -i in.mp4 out.gif

यह भी काम करता है, लेकिन आउटपुट जीआईएफ इनपुट वीडियो की तुलना में बड़ा होगा, क्योंकि वीडियो प्रारूप फ्रेम भर में समझदारी से संपीड़ित करते हैं।

तर्क टूटना:

  • ulimit -Sv 1000000: कार्यक्रम के लिए अधिकतम 1 जीबी मेमोरी का आकार निर्धारित करें।

    ज्यादातर मैं यह सुनिश्चित करता हूं कि कमांड पिछले कुछ प्रयासों की तरह असीमित मेमोरी का उपयोग नहीं कर रहा है।

    500Mb ffmpeg साझा पुस्तकालयों को लोड करने में विफल रहता है ... आपके रैम को अपग्रेड करने का समय?

  • -ss 00:00:03 -to 00:00:06: वीडियो को काटने के लिए प्रारंभ और समाप्ति समय।

    नहीं है, GIFs सबसे अच्छा तरीका है करने के लिए नहीं कर रहे हैं समुद्री डाकू ऑनलाइन वीडियो वितरित करते हैं।

    इसे भी देखें: https://stackoverflow.com/questions/18444194/cutting-the-videos-based-on-start-and-end-time-use-ffmpeg

  • -vf scale=512:-1: आउटपुट 512पिक्सेल को ऊँचाई में बनाएँ, और पहलू अनुपात को बनाए रखने के लिए चौड़ाई समायोजित करें।

    यह वेब के लिए छवियों के लिए सामान्य उपयोग का मामला है, जिसमें वीडियो की तुलना में बहुत कम रिज़ॉल्यूशन होता है।

    यदि आप इस विकल्प को हटाते हैं, तो आउटपुट GIF की इनपुट वीडियो के समान ऊँचाई होती है।

    मूल वीडियो ऊंचाई को उदाहरण के लिए पाया जा सकता है ffprobe: https://superuser.com/questions/595177/how-to-retrieve-video-file-information-from-command-line-under-linux/103178#1035178 और हमारे मामले में 1024 x 1024।

  • -r 15: एफपीएस का नमूना लेना।

    उदाहरण के लिए, मूल वीडियो 30 एफपीएस था, इसलिए -r 15इसका मतलब है कि ffmpegप्रत्येक 2 ( = 30 / 15) में एक फ्रेम चुना जाएगा ।

    कथित आउटपुट FPS को इनपुट से मिलान करने के लिए समायोजित किया जाता है, लेकिन आप एक स्पीडअप को नोटिस नहीं करेंगे, केवल अधिक ग्रैन्युलैरिटी।

    इनपुट एफपीएस के साथ पाया जा सकता है ffprobe, और इनपुट फ्रेम की कुल संख्या के mediainfoरूप में समझाया जा सकता है : https://superuser.com/questions/84631/how-do-i-get-the-number-of-frames -इन-ए-वीडियो-ऑन-द लिनक्स कमांड लाइन / 1044894 # 1044894

    मैं इस विकल्प की सलाह देता हूं क्योंकि वीडियो प्रारूपों में आमतौर पर बड़े रिज़ॉल्यूशन के कारण उच्च फ्रैमरेट होता है। छोटे जीआईएफ के साथ, कम फ्रैमरेट कम ध्यान देने योग्य है, और इसलिए हम कुछ फ़्रेमों को छोड़ सकते हैं और छोटे जीआईएफ बना सकते हैं।

इससे पहले पूर्व 18.04: ffmpeg+ convertमध्यवर्ती फाइल बिना एक लाइनर

ffmpegपहले GIF को हैंडल नहीं कर सकता था। मेरे पास सबसे अच्छा कुछ था:

sudo apt-get install ffmpeg imagemagick
ffmpeg -i input.mp4 -r 10 -f image2pipe -vcodec ppm - | \
  convert -delay 5 -loop 0 - output.gif

कुछ तर्कों की व्याख्या:

  • -loop 0: आउटपुट के लिए नेटस्केप Gif एक्सटेंशन लूप काउंट फ़ील्ड जोड़ें। 0 का मतलब अनंत लूप है, जैसा कि यहां वर्णित है: http://www.vurdalakov.net/misc/gif/netscape-looping-application-extension eog , firefoxऔर क्रोमियम सभी लूप डिफ़ॉल्ट रूप से इसके बिना भी, इसलिए मुझे यकीन नहीं है कि यह कैसे संभव है अब है।

  • -delay 5: समय अगली फ्रेम दिखाने से पहले इंतजार किया, दूसरे के hundreths में, के रूप में वर्णित: https://en.wikipedia.org/wiki/GIF#Animated_GIF बाइट 324. तो 1001 एफपीएस, का 5मतलब है 1 / 0.5 == 20FPS

यहां तक ​​कि अगर आप ऊंचाई और फ्रैमरेट को कम करते हैं, तो भी आउटपुट जीआईएफ वीडियो से बड़ा हो सकता है, क्योंकि "वास्तविक" गैर-जीआईएफ वीडियो प्रारूप फ़्रेम में संकुचित होते हैं, जबकि जीआईएफ केवल व्यक्तिगत फ़्रेम को संकुचित करता है।

एक प्रत्यक्ष:

convert input.mp4 rpi2-bare-metal-blink.gif

काम किया है, लेकिन स्मृति अतिप्रवाह के कारण मेरे कंप्यूटर को लगभग मार डाला है, और मेरी 2s 1Mb इनपुट फ़ाइल के लिए एक ouptput 100x बड़ा उत्पादन किया है। शायद एक दिन ImageMagick पकड़ लेगा।

इसे भी देखें: https://superuser.com/questions/556029/how-do-i-convert-a-video-to-gif-use-ffmpeg-with-reasonable-quality

उबंटू 17.10 पर परीक्षण किया गया।


1
डाउनवोटर्स कृपया समझाएं ;-)
सिरो सेंटिल्ली 改造 explain explain explain explain

1
आपकी देरी आपके -r मान से मेल नहीं खाती (परिणामी gif 2x गति है)। इसके अलावा आपने बिना किसी स्पष्ट कारण के स्केल पैमाना जोड़ा (यह जिफ को वास्तव में छोटा बनाता है)।
asmeurer

2
मैं सहमत हूँ। छोटे आकार के जीआईएफ वेब के लिए बेहतर होते हैं। धन्यवाद के लिए scale=320:-1
zombic

2
उन लोगों के लिए जो सोच रहे हैं: हटाने -r 10से जीआईएफ वापस सामान्य गति में आ जाएगा।
मिच

2
मुझे mp4 से 20% बड़ा gif मिला: O
एडम गोल्डमैन

113

दो चरण:

  • वीडियो से छवियाँ निकालें

    अपनी .mp4फ़ाइल के साथ उसी निर्देशिका में फ़्रेम नामक एक निर्देशिका बनाएँ । कमांड का उपयोग करें:

    ffmpeg -i video.mp4  -r 5 'frames/frame-%03d.jpg'
    


    -r 5 stands for FPS value
        for better quality choose bigger number
        adjust the value with the -delay in 2nd step
        to keep the same animation speed
    
    %03d gives sequential filename number in decimal form
    

    स्रोत

  • कन्वर्ट छवियाँ gif के लिए

    cd frames
    convert -delay 20 -loop 0 *.jpg myimage.gif
    


    -delay 20 means the time between each frame is 0.2 seconds
       which match 5 fps above.
       When choosing this value
           1 = 100 fps
           2 = 50 fps
           4 = 25 fps
           5 = 20 fps
           10 = 10 fps
           20 = 5 fps
           25 = 4 fps
           50 = 2 fps
           100 = 1 fps
           in general 100/delay = fps
    
    -loop 0 means repeat forever
    

    डॉक्स: जीआईएफ विकल्प परिवर्तित करें

आप एक बड़ी फ़ाइल के साथ समाप्त हो जाएंगे, एक छोटी फ़ाइल प्राप्त करने के लिए दूसरे चरण कमांड में जोड़ सकते हैं विकल्पों पर gif को अनुकूलित करने के लिए छवि मैजिक गाइड पर एक नज़र डालें ।


1
शानदार जवाब- कुछ अतिरिक्त जानकारी: ffmpeg यहां
chepyle

3
ध्यान रखें कि framesकाम करने के लिए पहले कमांड के लिए फ़ोल्डर मौजूद होना चाहिए।
टोटमेडली

3
उन लोगों के लिए, जो आमतौर पर काम करने का अनुकूलन करने के लिए एक त्वरित तरीका चाहते हैं और लिंक को पढ़ने के लिए बहुत आलसी हैं, बस -layers Optimizeअंतिम convertकमांड में, पहले जोड़ें *.jpg। हालांकि आउटपुट की जाँच करें, यह प्रभावित हो सकता है। मेरे लिए इसने 5 एमबी से लेकर 700 केबी तक के जीआईएफ के आकार को बिना किसी नुकसान के कम कर दिया। गुणवत्ता में कमी
cpury

धन्यवाद कि यह एक दिलचस्प प्रक्रिया थी, एक 5.6MB mp4 ने एक 236MB gif को समाप्त किया, यह सुनिश्चित नहीं था कि मैं अपनी वेबसाइट पर इसे डालूंगा;) संभवतः एक gif को एक मिनट के बजाय सेकंड तक सीमित करने की आवश्यकता है।
इलायची

2
JPG फ़ाइल प्रारूप का उपयोग करने के बजाय, डिफ़ॉल्ट सेटिंग्स के साथ बहुत हानिरहित, मैं प्रारंभिक फ़ाइल निर्यात के लिए PNG का उपयोग करने की सलाह दूंगा। ffmpeg -i video.mp4 -r 5 'frames/frame-%03d.png'
पियरे एफ

12

gifify एक ऑल-इन-वन नोड-आधारित उपयोगिता है जो रूपांतरण को सरल बनाती है। यह पर निर्भर करता है nodejs, npm, ffmpeg, और imagemagickजो सभी रेपोस में उपलब्ध हैं।

आपके द्वारा npmस्थापित किए जाने के बाद आप gififyविश्व स्तर पर स्थापित कर सकते हैं :

    npm install -g gifify

एक वीडियो को .GIF के साथ परिवर्तित किया जा सकता है:

    gifify video.mp4 -o video.gif

आप वैकल्पिक रूप से वीडियो में एक शुरुआत और अंत स्थिति सेट कर सकते हैं और एक पाठ शीर्षक जोड़ सकते हैं:

    gifify clip.mp4 -o clip.gif --from 01:48:23.200 --to 01:48:25.300 --text 'we are the knights who say nip!'

Conversion छोटे वीडियो के साथ भी रूपांतरण पूरा होने में कई मिनट लग सकते हैं।

नोट: ffmpegऔर imagemagickकुछ विशिष्ट पुस्तकालयों (यानी libass और fontconfig तदनुसार) के साथ संकलित करने की आवश्यकता हो सकती है।


: लगभग> 40 सेकंड क्लिप को संभाल नहीं करता github.com/vvo/gifify/issues/99
oligofren

19.04: एक अन्य आवश्यक पैकेज है gifsicle, लेकिन फिर एक और समस्या तब होती है: github.com/vvo/gifify/issues/95 इसके अलावा, आप मन होगा हमें क्या निर्देशिका में NPM novices कह चलाने के लिए npm installऔर क्या रूट के रूप में इसे चलाने या नहीं? धन्यवाद!
निकोलस राउल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.