FFmpeg का उपयोग करके छवियों से वीडियो कैसे बनाएं?


86

क्या ffmpegअनुक्रम के सेट से एक वीडियो बनाना संभव है , जहां संख्या शून्य से शुरू नहीं होती है?

उदाहरण के लिए, मेरे पास कुछ छवियां हैं [test_100.jpg, test_101.jpg, test_102.jpg, ..., test_200.jpg], और मैं उन्हें वीडियो में परिवर्तित करना चाहता हूं। मैंने निम्नलिखित कमांड की कोशिश की, लेकिन यह काम नहीं किया (ऐसा लगता है कि संख्या शून्य से शुरू होनी चाहिए):

ffmpeg -i test_% d.jpg -vcodec mpeg4 test.avi

कोई सलाह?


यह पूछे जाने के बाद से कुछ समय हो गया है, लेकिन अगर आप अभी भी सवाल में रुचि रखते हैं, तो इसका उत्तर हां है - मैंने नीचे विवरण और एक उदाहरण पोस्ट किया है: stackoverflow.com/a/12160155/181638
असद अब्राहिम

@casperOne एक विचार के लिए उपयोगी होगा कि यह विषय क्यों है। यह एक विशिष्ट प्रोग्रामिंग समस्या की तरह लगता है। FFmpeg टैग 3.7k अनुयायियों है, और साथ 27k विचारों स्पष्ट रूप से लोगों उपयोगी लगता है ..
geotheory

2
@geotheory टैग आँकड़े अप्रासंगिक हैं। Winfar कहने के तरीके में ffmpeg एक कार्यक्रम है। जबकि आप ffmpeg में पुस्तकालयों के खिलाफ कार्यक्रम कर सकते हैं , यह सवाल उस बारे में नहीं है। कमांड लाइन से ffmpeg का उपयोग करना सुपर उपयोगकर्ता पर पूछा जाना है , जहां यह विषय पर है।
कैस्परऑन

जवाबों:


81

-start_numberस्विच का उपयोग करने पर फ़ाइलों का नाम बदलने की कोई आवश्यकता नहीं है :

ffmpeg -start_number n -i test_%d.jpg -vcodec mpeg4 test.avi

nचित्र के अनुक्रम की शुरुआत कहां है।

ध्यान दें, यह तब तक काम करेगा जब तक यह क्रम शुरू न हो जाए। यदि अंतराल हैं और आप सभी स्टिल्स को शामिल करना चाहते हैं, तो अंतराल को भरने के लिए रिन्यूमरिंग करना आवश्यक हो सकता है।

कुछ अन्य स्विच हैं जो आपको उपयोगी लग सकते हैं।

मैं निम्न एक-लाइनर का उपयोग धीमी फ्रेम दर पाने के लिए और छवियों को संपीड़ित करने और एक छोटे परिणामी वीडियो के लिए करता हूं:

ffmpeg.exe -f image2 -framerate 25 -pattern_type sequence -start_number 1234 -r 3 -i Imgp%04d.jpg -s 720x480 test.avi

-r 3विकल्प प्रति सेकंड 3 फ्रेम करने के लिए जिसके परिणामस्वरूप वीडियो के फ़्रेमरेट सेट इतना है कि मैं समय की एक छोटी अवधि के लिए अभी भी एक देख सकते हैं। -sविकल्प वांछित समाधान करने के लिए चित्रों rescales जिसके परिणामस्वरूप वीडियो के आकार का प्रबंधन करने के।

(विंडोज शेल में, इसके -i Imgp%04d.jpgसाथ बदलें -i "Imgp%%04d.jpg"। इसका श्रेय माइक फिट्ज़पैट्रिक https://superuser.com/a/344178/153054 को दिया जाता है )


4
-r और -framerate में क्या अंतर है?

1
वे एक ही IIRC
rogerdpack

22
बकवास करने की कोई आवश्यकता नहीं है, जब तक आप उस आदेश को स्वीकार करने में प्रसन्न होते हैं जो वे (कहते हैं) 'ls' में दिखाई देते हैं ... बस उपयोग करें: ffmpeg -pattern_type glob -i '* .jpg' movie.mp4
Orwellophile

2
क्या छवियों के बीच समय अंतराल को नियंत्रित करने के लिए कोई स्विच है , कहते हैं, मैं पहली छवि 13s, दूसरा 15s, 24s तीसरे के लिए दिखाना चाहता हूं, समय अंतराल उपयोगकर्ता परिभाषित है, क्या यह संभव है?
जियोन्पी

2
यह भी देखें trac.ffmpeg.org/wiki/…
david.libremone

38

आप नीचे दिए गए कोड स्निपेट का उपयोग कर सकते हैं:

 cat *.jpg | ffmpeg -f image2pipe -r 1 -vcodec mjpeg -i - -vcodec libx264 out.mp4

यह मेटाडेटा में बताए गए रोटेशन को JPG को नहीं घुमाता है।
एरिक जोहानसन

17

आप ffmpeg प्रलेखन में एक उदाहरण स्क्रिप्ट पा सकते हैं :

3.2 मैं फिल्मों में एकल चित्रों को कैसे एन्कोड करूं?

यदि आपके पास नाम बदलने के लिए बड़ी संख्या में चित्र हैं, तो आप बोझ को कम करने के लिए निम्न कमांड का उपयोग कर सकते हैं। कमांड, बॉर्न शेल सिंटैक्स का उपयोग करते हुए, प्रतीकात्मक रूप से वर्तमान निर्देशिका में सभी फ़ाइलों को लिंक करता है जो * jpg से /tmp' directory in the sequence ofimg001.jpg ', `img002.jpg' और इसी तरह से मेल खाते हैं ।

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done

तो भागो:

ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg

2
बेहतर होगा कि आप छवि का नाम img000.jpg शुरू करने के लिए x = 0 बना लें क्योंकि यह ffmpeg की अपेक्षा है। इसके अलावा सिम्फ्लिंग मेरे लिए काम नहीं करता था क्योंकि ffmpeg फाइलें नहीं पा सकता था इसलिए मुझे इसके बजाय cp का उपयोग करना पड़ा (स्पष्ट गति और स्पेस ड्रॉ बैक लेकिन फिर भी मैं उन्हें rm करता हूं)। mv भी ​​काम करेगा अगर आप मूल खोने का मन नहीं है।

ध्यान दें कि इस उत्तर में, प्रदान की गई कमांड हार्डलिंक्स बनाती है, सिम्बलिंक नहीं। cpयदि लिंकिंग काम नहीं करता है, तो इसके उपयोग के संबंध में , यदि आपका फाइल सिस्टम समर्थन करता है तो यह cp --reflink=autoबेहतर गति / स्थान उपयोग को प्राप्त करेगा।
फेलिक्स सपरेली

12

से ffmpeg के डॉक्स:

एक ग्लोब पैटर्न का उपयोग करना

ffmpeg भी बैश-स्टाइल ग्लोबिंग का समर्थन करता है (* किसी भी वर्ण की संख्या का प्रतिनिधित्व करता है)।

यह उपयोगी है यदि आपकी छवियां अनुक्रमिक हैं, लेकिन पिछले उदाहरणों के रूप में संख्यात्मक रूप से अनुक्रमिक क्रम में आवश्यक नहीं हैं।

ffmpeg -r 1 -pattern_type glob -i 'test_*.jpg' -c:v libx264 out.mp4

इसलिए, जब तक आपकी फाइलें सॉर्ट की जाती हैं, -pattern_type globस्विच का उपयोग करना आपके लिए काम करना चाहिए।


ध्यान दें कि यह गोला नियमित शेल ग्लब्स की तुलना में अधिक सीमित है: trac.ffmpeg.org/ticket/3620 जाहिरा तौर पर क्योंकि छवि प्रकार एक्सटेंशन से घटाया गया है।
सिरो सेंटिल्ली 新疆 改造 i i 事件 16

11

जहाँ तक मुझे पता है, आप क्रम को यादृच्छिक संख्याओं में शुरू नहीं कर सकते हैं (मुझे याद नहीं है कि आपको इसे 0 या 1 पर शुरू करना चाहिए), इसके अलावा, इसमें अंतराल नहीं हो सकता है, अगर यह होता है, तो ffmpeg मान जाएगा कि अनुक्रम खत्म हो गया है और अधिक छवियां जोड़ना बंद करें।

इसके अलावा, जैसा कि मेरे जवाब में टिप्पणियों में कहा गया है, याद रखें कि आपको अपने सूचकांक की चौड़ाई निर्दिष्ट करने की आवश्यकता है। पसंद:

छवि% 03d.jpg

और यदि आप% 03d सूचकांक प्रकार का उपयोग करते हैं, तो आपको अपने फ़ाइल नाम को 0 के साथ पैड करने की आवश्यकता है, जैसे:

image001.jpg image002.jpg image003.jpg

आदि।


1
यदि छवि फ़ाइल नामों में अग्रणी शून्य है तो प्रारूप स्ट्रिंग को "% 03d" जैसी चौड़ाई भी निर्दिष्ट करनी होगी।

1
यदि यह एकमात्र बाधा है, तो आप अपनी स्क्रिप्ट को या तो नाम बदल सकते हैं या अपनी छवियों को ठीक से सेट किए गए सेट से जोड़ सकते हैं।
कास्कैबेल

1
हां, मैंने पहले भी इसके साथ काम किया है, मैंने कुछ समय पहले रूबी में एक रैपर लिखा था, जहां आपने उदाहरण कहा था। और वीडियो बनाएं। यह काफी आसान है।

@ जेफ्रोमी मैंने एक सिम्कलिन बनाया है, लेकिन मैं सिम्फ़लिंक फ़ाइल का रास्ता कैसे दे दूं ffmpeg? यह सिर्फ सहानुभूति फ़ाइल मानता है वह छवि है जिसे मैं बदलने की कोशिश कर रहा हूं? मैं win7 btw पर हूँ

अनुक्रम 0 से 4 समावेशी से कहीं भी शुरू हो सकता है।
असद अब्राहिम

5

मैं फ्रांसिस्को के साथ सहमत हूं, लेकिन वर्कअराउंड के रूप में आप सिर्फ अनुक्रमित फाइलों के लिए प्रतीकात्मक लिंक को स्थानांतरित करने या बनाने के लिए एक त्वरित स्क्रिप्ट लिख सकते हैं जो कि ffmpeg की जरूरत है। स्क्रिप्ट तब ffmpeg को कॉल कर सकती थी और फिर लिंक हटा सकती थी या फ़ाइलों को उनके मूल स्थानों पर वापस ले जा सकती थी।


1

देखो

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i"
/tmp/img"$counter".jpg; x=$(($x+1)); done

1

मुझे पता है कि यह एक पुराना सवाल है लेकिन मैं उसी जवाब की तलाश में गूगल में आया था। यहाँ किसी भी उत्तर ने मुझे पूरी तरह से संतुष्ट नहीं किया इसलिए मैंने अधिक खोज और पढ़ना किया और यह एक आदेश है जो मैं अपनी समस्या के लिए आया था।

cat {0032..1501}*.png | ffmpeg -f image2pipe -framerate 5 -i - -s 720x480 test2.avi

कारण है कि मैं इस तरह एक आदेश का उपयोग करेगा ...

  1. बिल्ली और -f image2pipe आपको किन छवियों का उपयोग करने पर बेहतर नियंत्रण देता है। उदाहरण के लिए यह आपको ब्रैश विस्तार और अन्य कमांड जैसे कि grep जैसे बैश फीचर का उपयोग करने की अनुमति देता है ताकि आपके द्वारा चुने गए परिणामों को ठीक किया जा सके।
  2. याद रखने के लिए कम स्विच।
  3. मैं -r का उपयोग नहीं करने की सलाह देता हूं, और इसके बजाय सिर्फ -framerate का उपयोग करें। मेरे अनुभव में, आर फ्रेम को अधिक बार छोड़ने के लिए जाता है।
  4. कम जटिल, उपयोग में कोई अनावश्यक स्विच नहीं है और यह काम करेगा। आप अपनी आवश्यकताओं के अनुरूप अधिक जटिलता (उदाहरण के लिए, एनकोडर को निर्दिष्ट करना) और ठीक धुन जोड़ सकते हैं।

ओपी के सवाल के लिए, क्या -start_numberइसकी जरूरत है।
ज्ञान

0

मैंने flv एनकोडर का उपयोग किया क्योंकि मेरा वीडियो एक फ़्लैश प्लेयर (Jwplayer) में जा रहा था

ffmpeg -i% d.jpg -vcodec flv test.flv


0

से प्रलेखन , यह तो आप बस का उपयोग कर सकते लगता है *

For example, for creating a video from filenames matching the glob pattern foo-*.jpeg:

ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi

एक नोट के रूप में, गुणवत्ता को प्रभावित करने के लिए, दर / एफपीएस महत्वपूर्ण हो सकता है (जैसे, पहले बहुत कम / उच्च फ्रेम दर निर्दिष्ट करना और फिर एक दूसरे फिल्टर से गुजरना जो धीमी गति के वीडियो को सामान्य कर देगा?)


0

मेरे मामले में, फाइलों में संख्या के कारण यह थोड़ा पेचीदा था। यहां बताया गया है कि मेरी छवियां कैसी दिखती हैं:

$ ls | head -5
2014_aq_unprocessed 001.jpg
2014_aq_unprocessed 002.jpg
2014_aq_unprocessed 003.jpg
2014_aq_unprocessed 004.jpg
2014_aq_unprocessed 005.jpg

और यहाँ कमांड का उपयोग मैंने किया है:

ffmpeg -i 2014_aq_unprocessed\ %3d.jpg  -vcodec mpeg4 test.avi

0

आप इसके साथ कर सकते हैं convert -morph:

convert *.jpg -delay 10 -morph 10 %05d.jpg

यदि आप उपयोग करना चाहते हैं ffmpeg, तो मैंने उपयोग किया

ffmpeg -pattern_type glob -i '*.jpg' -vf "setpts=10*PTS" movie.mp4

जहां 10*PTSffmpeg इसे 10 बार धीमा करने के लिए कहता है। इसे तेज करने के लिए आपको वहां फ्रैक्चर भी हो सकते हैं।


यह आपके मूल छवि अनुक्रम को एक नए स्थान पर प्रक्षेपित कर रहा है, यह एक वीडियो फ़ाइल नहीं बनाता है जैसे ओपी ने पूछा है।
f0ster

0

-pattern_type glob ऑडियो के साथ ठोस उदाहरण

इस विकल्प का उल्लेख यहां किया गया था: https://superuser.com/a/782520/128124 लेकिन यहां इसके उपयोग के कुछ ठोस उदाहरण हैं, जिसमें आउटपुट वीडियो में ऑडियो शामिल करना शामिल है।

स्लाइडशो वीडियो प्रति सेकंड एक छवि के साथ

ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
  -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

इसमें कुछ संगीत जोड़ें, जब चित्र समाप्त होते हैं तो ऑडियो को कटऑफ करें:

ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \
  -c:a copy -shortest -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

यहां YouTube पर दो डेमो दिए गए हैं:

एक हिप्पी बनें और थेओरा पेटेंट-अनएकेनम्बर वीडियो प्रारूप का उपयोग करें :

ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \
  -c:a copy -shortest -c:v libtheora -r 30 -pix_fmt yuv420p out.ogg

आपकी छवियों को वर्णानुक्रम में क्रमबद्ध किया जाना चाहिए, आमतौर पर निम्नानुसार:

0001-first-thing.jpg
0002-second-thing.jpg
0003-and-third.jpg

और इसी तरह।

यह भी देखें: http://unix.stackexchange.com/questions/68770/converting-png-frames-to-video-at-1-fps/339399#339399

30 एफपीएस पर प्रति फ्रेम एक छवि के साथ सामान्य गति वीडियो

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -c:v libx264 -pix_fmt yuv420p out.mp4

यहाँ यह कैसा दिखता है:

जीआईएफ के साथ उत्पन्न: https://askubuntu.com/questions/648603/how-to-create-an-animated-gif-from-mp4-video-via-command-line/837574#837574

इसमें कुछ ऑडियो जोड़ें:

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -i audio.ogg -c:a copy -shortest -c:v libx264 -pix_fmt yuv420p out.mp4

परिणाम: https://www.youtube.com/watch?v=HG7c7lldhM4

YouTube अपलोड के लिए एक निश्चित छवि के साथ एक संगीत फ़ाइल को वीडियो में बदलें

उत्तर दिया गया: MP3 को Youtube से अनुमति प्राप्त वीडियो प्रारूप में कैसे बदलें?

कुछ सिंथेटिक परीक्षण इनपुट छवियों को प्राप्त करें

ये परीक्षण चित्र हैं जिनका मैं इस उत्तर में उपयोग कर रहा हूं:

wget -O opengl-rotating-triangle.zip https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.zip?raw=true
unzip opengl-rotating-triangle.zip
cd opengl-rotating-triangle
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg

इसके साथ उत्पन्न छवियां: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292

यह देखने के लिए अच्छा है कि वीडियो जीप की तुलना में वीडियो अनुक्रम के तरीके को कितना बेहतर तरीके से संकुचित करता है क्योंकि यह विशेष एल्गोरिदम के साथ फ्रेम भर में संपीड़ित करने में सक्षम है:

  • opengl-rotating-triangle.mp4: 340 के
  • opengl-rotating-triangle.zip: 7.3M

सीएलआई विकल्पों के बारे में

ध्यान दें कि नाम के बावजूद, -globयह शेल ग्लोब पेटेंट के रूप में सामान्य नहीं है, उदाहरण के लिए: -i '*'विफल रहता है: https://trac.ffmpeg.org/ticket/3620 (जाहिरा तौर पर क्योंकि filetype एक्सटेंशन से घटाया गया है)।

-r 30-framerate 1कम फ्रैमरेट्स के लिए वीएलसी जैसे खिलाड़ियों में कीड़े को दूर करने के लिए वीडियो 30 एफपीएस बनाता है : https://stackoverflow.com/questions/19267443/playback-issues-in-vlc-with-low-fps-video-from-images-use ffmpeg / 41797724 # 41797724 इसलिए यह दूसरे प्रभाव के लिए वांछित 1 छवि को रखने के लिए प्रत्येक फ्रेम को 30 बार दोहराता है।

अगला कदम

आप यह भी चाहेंगे:

TODO: कमांड लाइन से वीडियो में कई ऑडियो फाइलों को काटना और समेटना सीखें:

पर परीक्षण किया गया

ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04।

ग्रन्थसूची

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.