हजारों .png को एनिमेटेड .gif में बदलें, `Convert` बहुत अधिक मेमोरी का उपयोग करता है


29

Png छवियों के एक सेट से एक एनिमेटेड जिफ़ बनाने के तरीके पूछने वाले कई सवाल ImageMagick के फ़ंक्शन के एक संस्करण का उपयोग करने का सुझाव देते हैं : convert

convert -delay 2 -loop 0 *.png animated.gif

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


1
कैसे * .png फ़ाइलों को प्रबंधनीय विखंडू में विभाजित करने के बारे में? मान लें कि सभी फ़ाइल नाम एक अंक से शुरू होते हैं, फिर convert -delay 2 -loop 0 0*.png animated.gifकेवल उन्हीं फ़ाइलों को रूपांतरित करेंगे जो '0' से शुरू होती हैं। और इसी तरह।
जोस

2
तो प्रत्येक .png 1 एमबी के क्रम में है? उस स्थिति में, मुझे लगता है कि सबसे पहले .png फ़ाइलों को कम रिज़ॉल्यूशन या रंग गहराई में बदलने के लिए है, उन्हें छोटा करने के लिए।
जोस

10
आप कहते हैं कि आप एक और खुले प्रारूप का उपयोग कर सकते हैं। यह मुझे लगता है कि GIF फ्रेम के हजारों के लिए सबसे अच्छा प्रारूप नहीं है। क्या आपने इसके बजाय Ogg Theora के साथ एक वीडियो एन्कोडिंग पर विचार किया है?
रेकाडो

1
शायद gifsicle पर एक नज़र डालें , अगर आप वास्तव में GIF का उपयोग करना चाहते हैं? (हालांकि, जैसा कि दूसरों ने कहा है, यह GIF के लिए नहीं बनाया गया था; OGG एक बेहतर विकल्प होगा।)
wchargin

1
पुन। "जहां सभी मेमोरी जा रही है": 65 Kb एक संपीड़ित छवि का फ़ाइल आकार है। जब असम्पीडित, छवि लगभग 4 x चौड़ाई x ऊंचाई बाइट लेती है, तो एक 1024x768 चित्र ~ 3Mb RAM ले जाएगा। गुणा करें कि "कुछ हज़ार" और आप देखेंगे कि मेमोरी कहाँ जा रही है ...
सेर्गेई

जवाबों:


33

ऐसा लगता है कि आप एक वीडियो बनाने की कोशिश कर रहे हैं। अगर ऐसा है, तो मैं एक उचित वीडियो प्रारूप का उपयोग करूंगा।

इस स्थिति में, मैं व्यक्तिगत PNG फ़ाइलों को H.264 वीडियो में बदलने के लिए ffmpeg का उपयोग करूंगा । चूंकि ffmpeg ऐसे वीडियो के साथ काम करने के लिए बना है जो घंटों लंबे हो सकते हैं, इसलिए इसे आपकी हजारों छवियों के साथ कोई समस्या नहीं होनी चाहिए। एनिमेटेड gif के बजाय H.264 का उपयोग करने से छवि गुणवत्ता में व्यापक सुधार होगा ।

कुछ इस तरह से आप के लिए काम करना चाहिए:

 ffmpeg -framerate 1/2 -i img%04d.png -c:v libx264 -r 30 out.mp4
  • -framerate 1/2: यह फ्रैमरेट को एक-आधा FPS या 2 सेकंड प्रति फ्रेम पर सेट करता है।
  • -i img%04d.png: img0000.pngहालांकि यह फ़ाइलों को पढ़ने के लिए ffmpeg बताता है img9999.png
  • -c:v libx264: वीडियो कोडेक libx264 का उपयोग करें।
    • यदि आप चाहें, तो आप यहां वीडियो संपीड़न पैरामीटर निर्दिष्ट कर सकते हैं:
    • -crf <number>: गुणवत्ता सेटिंग। 0 से 51. 23 डिफ़ॉल्ट है। 0 सच दोषरहित एन्कोडिंग है, जो काफी उच्च बैंडविड्थ होगा। 18 नेत्रहीन दोषरहित है।
  • -r 30: आउटपुट को 30 FPS पर सेट करें। आपके द्वारा यहां निर्दिष्ट किए गए आउटपुट को बनाने के लिए प्रत्येक इनपुट छवियों को डुप्लिकेट किया जाएगा। आप इस पैरामीटर को छोड़ सकते हैं, और आउटपुट फ़ाइल इनपुट फ्रैमरेट पर होगी, लेकिन परिणामी फिल्म ने ठीक से प्रदर्शित नहीं किया जब मैंने अभी कोशिश की थी।
  • out.mp4: आउटपुट फ़ाइल नाम।

संदर्भ:


1
पहले दिन से फ्रैंटिक जवाब का अच्छा विस्तार।
एल्डर गीक

यहाँ ठोस परीक्षण डेटा के साथ ImageMagick बेंचमार्क बनाम एक सरल ffmpeg है: askubuntu.com/questions/648244/…
Ciro Santilli 新疆 f f 六四 '23

11

व्यक्तिगत रूप से, मैं इसे केवल एक बार में सभी फाइलों की सीमित संख्या में लॉन्च करूंगा। उदाहरण के लिए, कुछ इस तरह:

#!/usr/bin/env bash

## Collect all png files in the files array
files=( *png )
## How many should be done at once
batch=50

## Read the array in batches of $batch
for (( i=0; $i<${#files[@]}; i+=$batch ))
do
    ## Convert this batch
    convert -delay 2 -loop 0 "${files[@]:$i:$batch}" animated.$i.gif
done

## Now, merge them into a single file
convert  animated.*.gif all.gif

8

-limit memory 1GiBमेमोरी convertउपयोग की मात्रा को सीमित करने के लिए उपयोग करें ।

बहुत सारी छवियां एक विशाल जीआईएफ बनाएंगी जो अधिकांश कंप्यूटर प्रदर्शित करने के लिए संघर्ष करेंगे। मैं जब संभव हो तो अपने एनिमेटेड GIF को 200 छवियों से नीचे रखता हूं। कम बेहतर है। यदि आप अपनी छवियों को नंबर देते हैं, तो यह कमांड विषम संख्या वाली छवियों को हटा देगा rm *[13579].png

तो यहाँ एक फिल्म के दृश्य से एक एनिमेटेड GIF बनाने के लिए मेरी विशिष्ट कार्यप्रवाह है:

avconv -ss 00:26:00 -i someMovie.mpg %5d.png
rm  *[13579].png
convert -limit memory 1GiB -loop 0 -layers optimize -resize 400 *.png output.gif

1
धन्यवाद, वह समाधान अच्छी तरह से काम करता है। यह भी /etc/ImageMagick-6/policy.xml में अनुमति दी मेमरी सीमा को बढ़ाने के लिए देख आवश्यक हो सकता है github.com/ImageMagick/ImageMagick/issues/... अधिक जानकारी के लिए
लुइस गागनॉन

4

अगर .gifमैं समर्थित नहीं हूं तो मैं एक और खुला प्रारूप का उपयोग कर सकता हूं

शायद APNG आपके काम की है। यह फ़ायरफ़ॉक्स सहित कुछ ब्राउज़रों द्वारा समर्थित है , लेकिन फिलहाल क्रोम और IE को छोड़कर। चूंकि यह सिर्फ PNG एक्सटेंशन है, इसलिए PNG को APNG में बदलना बहुत सरल है। Apngasm उपकरण है जो कर सकते हैं। लेकिन प्रारूप इतना सरल है कि मैंने हाल ही में एक ऋषि के लिए स्वयं APNG कोडांतरक लिखा है। उस कोड को अपनाना एक विकल्प होगा।


मैं यह भी बताना चाहूंगा कि APNG अमानक है और लगभग 7 वर्षों से होने के बावजूद अभी भी बहुत अस्पष्ट है।
फराप

एक वैज्ञानिक प्रदर्शन के लिए, जहाँ आप इसके लिए उपयोग किए गए ब्राउज़र को चुनने में सक्षम हो सकते हैं, फिर भी यह एक सरल और मजबूत समाधान हो सकता है।
एमवीजी

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

3

यदि आपके पास हजारों png-s हैं, तो एगिफ प्रारूप अजीब है। मैं इसका उपयोग इस तरह से करूंगा avconv:

 avconv -i "%d.png" -r 25 -c:v libx264 -crf 20 -pix_fmt yuv420p animated.mov

इस दृष्टिकोण में जोड़ा गया लाभ है जिसे आप बाद में वॉयस-ओवर या म्यूजिक ऑडियो में बदल सकते हैं जो कि ग्राफिक्स इंटरचेंज फॉर्मेट के साथ असंभव है।
एल्डर गीक

2

GIF एनिमेशन को संभालने के लिए gifsicle एक कमांड-लाइन यूटिलिटी है। यदि आप गति के लिए मेमोरी का व्यापार करने के इच्छुक हैं, तो आप इसके --conerve- मेमोरी स्विच का उपयोग कर सकते हैं।


मुझे इसे इस तरह से करना चाहिए: gifsicle में पहले से ही ImageMagick की तुलना में एक छोटा पदचिह्न है - यदि आप पाते हैं कि यह अभी भी हाथ में कार्य के लिए बहुत अधिक मेमोरी का उपयोग करता है, तो आप उपयोग कर सकते हैं --conerve- मेमोरी
कोडहेड

ओह, मुझे लगता है कि आप जो कुछ कह रहे थे, मुझे गलत लगता है कि स्विच अधिक मेमोरी का उपयोग करेगा, जो बहुत अर्थ नहीं देता है। कोई बात नहीं।
जिज्ञासु

2

अन्य उत्तरों के अलावा: चूंकि आप जीआईएफ फ़ाइल का उत्पादन करना चाहते हैं, इसलिए मुझे लगता है कि आप वेब पेज पर छवि प्रदर्शित करना चाहते हैं। यदि हां, तो मैं आपके PNGs को परिवर्तित करने की जहमत नहीं उठाऊंगा। बस "जावास्क्रिप्ट स्लाइड शो" के लिए Google और लाखों मुक्त लिपियों में से एक का उपयोग करें। या अपना खुद का लिखें, यह वास्तव में तुच्छ है।

इस तरह से करने के लाभ इस प्रकार हैं:

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

  • लाखों छवियों के लिए समाधान। या अरबों, यदि आप उन सभी को देखने के लिए पर्याप्त धैर्य रखते हैं :)

  • आप अपने पृष्ठ पर नियंत्रणों को रोक सकते हैं, उलट सकते हैं, देरी को बदल सकते हैं या किसी विशेष फ्रेम में जा सकते हैं।


सर्गेई धन्यवाद। वास्तव में यह एक वेबपेज पर प्रदर्शित करने के लिए नहीं है। विचार के लिए +1, हालाँकि।
डॉटान्चेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.