FFmpeg का उपयोग करके एक वीडियो बनाने के लिए एक छवि + एक ऑडियो फ़ाइल को मिलाएं


179

यह बहुत तुच्छ होना चाहिए, लेकिन मुझे इसे काम करने का तरीका नहीं मिल रहा है।

मैं चाहता हूं कि FFmpeg एक JPEG छवि और एक ऑडियो फ़ाइल इनपुट के रूप में ले और ऑडियो फ़ाइल के रूप में उसी अवधि की वीडियो फ़ाइल जनरेट करें (पूरी अवधि के लिए स्थिर छवि खींचकर)।

मुझे इस बात की बहुत परवाह नहीं है कि आउटपुट के लिए किस वीडियो कोडेक का उपयोग किया जाता है, लेकिन यह महत्वपूर्ण है कि मैं "कॉपी" को ऑडियो कोडेक के रूप में उपयोग कर सकता हूं (अर्थात इसे ट्रांसकोड किए बिना ऑडियो स्ट्रीम की प्रतिलिपि बनाएं)।

सही कमांड लाइन क्या है जो ऐसा करेगी?

मैंने कोशिश की:

ffmpeg -i image8.jpg -i sound11.amr -acodec copy test.avi

और के साथ या बिना संयोजनों की बहुत कोशिश की -s 640x360, -loop_input, -shortest, -t xxx, -r 0.1(उम्मीद है कि वीडियो अब होगा में कृत्रिम रूप से कम फ्रेम दर) और-f image2

या तो मुझे त्रुटियां मिलती हैं या मुझे एक फ्रेम की अवधि की एक वीडियो फ़ाइल मिलती है।

मैंने चारों ओर गुगली की है और प्रस्तावित समाधानों में से एक दर्जन (माना जाता है कि यह बहुत ही सवाल है) जिनमें से कोई भी काम नहीं करता है।

क्या कोई काम करने का आदेश दे सकता है और इसके पीछे का तर्क समझा सकता है?


मैंने सिर्फ आपकी कमांड लाइन की कोशिश की और यह उम्मीद के मुताबिक काम किया। आपकी समस्या ध्वनि प्रारूप के साथ हो सकती है। क्या साउंड ट्रांसकोडिंग काम करता है?
कप्तान जिराफ

"जैसा कि अपेक्षित है" क्या आपका मतलब है कि परिणामी वीडियो में ऑडियो इनपुट के समान अवधि है? क्या आपने इसे खेला है? क्या यह एक-फ्रेम-लंबा नहीं है?
मैटियो

ध्वनि प्रारूप समस्या नहीं है, ध्वनि कार्यों को ट्रांसकोडिंग
मैटियो

मेरे पास परमिशन इश्यू का ऑर्डर भी था और इसमें मुझे घंटों का समय लगता था! समस्याओं के इन प्रकार बहुत खराब मदद में शामिल नहीं हैं। gregoire.org/2009/12/05/fun-with-ffmpeg
पॉल ग्रेगोइर

2
यह चुने हुए उत्तर से बेहतर है, मैंने प्रयोग किया और यह तेज़ है और फ़ाइल का आकार छोटा है ..ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi
मुहम्मद उमर

जवाबों:


142

कमांड लाइन में विकल्पों का क्रम मायने रखता है। मेरे मामले के लिए निम्नलिखित काम करता है:

ffmpeg -loop 1 -y -i image8.jpg -i sound11.amr -shortest -acodec copy -vcodec mjpeg result.avi

एक अधिक सामान्य मामले में, आपके इनपुट कहां image.jpgऔर audio.wavहैं, आप निम्नलिखित कमांड का उपयोग कर सकते हैं, FFmpeg wiki से अनुकूलित :

ffmpeg -loop 1 -i image.jpg -i audio.wav -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -shortest out.mp4

यह libx264एनकोडर का उपयोग करेगा और आपको ऊपर उपयोग किए गए MJPEG कोडेक की तुलना में बेहतर संपीड़न प्रदान करेगा। ऑडियो AAC है, जिसमें अंतर्निहित ffmpegAAC एनकोडर है।


5
कैसे फाइल आ जाती है [छवि का आकार] + [ऑडियो फ़ाइल का आकार] से इतना बड़ा? मुझे उम्मीद है कि वीडियो संपीड़न एक निरंतर फ्रेम के साथ पागल हो जाएगा?
एलेक जैकबसन

2
यह आपके द्वारा उपयोग किए जाने वाले वीडियो कोडेक पर निर्भर करता है। यदि आप मेरे उदाहरणों में आदेशों की नकल कर रहे हैं, तो मैं एमजीपीपी को कोडेक के रूप में उपयोग कर रहा हूं, जो प्रत्येक फ्रेम को अलग से संपीड़ित करता है, इसलिए यह इस तथ्य का कोई लाभ नहीं लेता है कि सभी फ्रेम समान हैं। इसके अलावा, मुझे लगता है कि अन्य कोडेक्स भी पूरे फ्रेम को हर एक बार यानी हर एन-वें फ्रेम में फिर से लोड कर देंगे, इसलिए आपको एक बहुत छोटी फ़ाइल मिलेगी लेकिन फिर भी छवि + ध्वनि के आकार की तुलना में बहुत बड़ी होगी। वे ऐसा इसलिए करते हैं क्योंकि (ए) अन्यथा डिकोडर को शुरुआत से ही पूरी फाइल पढ़ने की जरूरत होती है, भले ही आप अंतिम फ्रेम पर कूदना चाहते हों, और
मैटो

2
Option shortest (finish encoding within shortest input) cannot be applied to input file image.jpg -- you are trying to apply an input option to an output file or vice versa. Move this option before the file it belongs to.
विम

2
ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.aviइस काम का बेहतर उपयोग करें !!! !!!?!?!
मुहम्मद उमर '

2
इस जवाब पर वर्तमान में मेटा पर चर्चा की जा रही है ।
DavidPostill

41

आप इसे वैसे ही कठिन बना रहे हैं जैसे इसे होना चाहिए। FFmpeg आपके द्वारा दिए गए क्रेडिट से बहुत अधिक स्मार्ट है - यह जानता है कि आप चाहते हैं कि वीडियो आपके ऑडियो ट्रैक के समान लंबाई वाला हो।

ffmpeg -i still.png -i narrate.wav -acodec libvo_aacenc -vcodec libx264 final.flv

pause

केवल गुण आप है निर्दिष्ट करने के लिए कर रहे हैं input filenames, output codecsऔर output filename(जो ईओ ipso शामिल output container,)।

बेशक, यह एक स्थिर छवि के साथ शुरू करने के लिए समझ में आता है जो आपके अंतिम वीडियो के समान आयाम साझा करता है; यदि आप FFmpeg के लिए आउटपुट आयामों को पूरा करने के बजाय एक समर्पित छवि संपादक का उपयोग कर रहे हैं, तो आपको यह सुनिश्चित करने की आवश्यकता है कि आपके इनपुट आयाम भी संख्याएँ हैं

आउटपुट आकार FFmpeg के सबसे आम हैंग-अप्स में से एक है; कुछ कोडेक्स आउटपुट आयामों में दूसरों की तुलना में अधिक प्रतिबंधित हैं, लेकिन किसी भी आउटपुट में विषम-संख्या ऊँचाई या चौड़ाई विशेषताएँ नहीं हो सकती हैं।

pauseआदेश बैच फ़ाइल के अंत में CLI खुला रहता है - अपने आदेश पंक्ति डिबग करने के लिए सबसे अच्छा तरीका त्रुटि संदेश पढ़कर है यह उत्पन्न करता है। वे बेहद विशिष्ट हैं - और सबसे अच्छा प्रलेखन FFmpeg के पास है - लेकिन डेवलपर्स की कड़ी मेहनत बर्बाद हो जाती है यदि आप खिड़की को बंद कर सकते हैं इससे पहले कि आप उन्हें पढ़ सकें।

कमांड शेल में एक स्विच होता है cmd /kजो एक खुली खिड़की को बनाए रखता है जहां आप कमांड प्रॉम्प्ट पर अपने बैच स्क्रिप्ट से समान निर्देश चला सकते हैं।

FFmpeg और avconv दोनों आप का उपयोग कर देगा -c:aके लिए -acodecऔर -c:vके लिए -vcodecअंत में, लेकिन पुराने निर्देश ठीक से काम बनाता में मैं का उपयोग करें।

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


मुझे Youurs की तुलना में एक अलग संस्करण का उपयोग करना चाहिए (यदि आपने अपनी कमांड की कोशिश की है और यह आपके वर्णन के अनुसार काम करता है), क्योंकि, जैसा कि मैंने पहले ही प्रश्न में उल्लेख किया है, मैंने पहले से ही आपके सटीक कमांड की कोशिश की थी और मुझे अवधि का वीडियो मिल गया है 1 फ्रेम (सेकंड का एक अंश), ऑडियो फ़ाइल की अवधि नहीं। मुझे उम्मीद थी कि यह बुद्धिमान होगा, लेकिन (मेरे संस्करण में) यह साबित नहीं हुआ।
मैट

2
हे माटेओ , हाँ, मैंने उस कोड को निष्पादित किया, और हाँ, यह विज्ञापित के रूप में काम करता है। मुझे यकीन है कि बहुत सारे ऐसे आधे-अधूरे काम होंगे जो बिना जांचे-परखे ऐसे दावे कर सकते हैं, इसलिए मैं नाराज होने की कोशिश नहीं करूंगा :) नीचे एक पूरी पोस्ट में मैं FFmpeg कंसोल आउटपुट और MediaInfo को Pastebin लिंक की आपूर्ति करूंगा इनपुट फ़ाइलों और अंतिम आउटपुट फ़ाइल पर डेटा। मेरी इनपुट फ़ाइलें, मेरी बैच फ़ाइल, मेरी आउटपुट फ़ाइल एक GoogleDrive पर है जहाँ वे स्वतंत्र रूप से डाउनलोड करने योग्य हैं , यदि आप अपने FFmpeg बिल्ड के खिलाफ उनका परीक्षण करना चाहते हैं।

@ShinMuraoka Mine is a win-64 ffmpeg build compiled on: Jan 6 2013, at: 16:16:53न तो आपके समाधान और न ही @matteo समाधान ने मेरे लिए काम किया। इसके अलावा, मैंने आपकी फ़ाइलों को Google ड्राइव से डाउनलोड किया है, लेकिन इसने अपेक्षित आउटपुट नहीं दिया (आउटपुट फ़ाइल केवल ऑडियो निहित थी)। कृपया सही कमांड का इस्तेमाल करने में मेरी मदद करें।
कोडिंग_डॉट

2
"कोई आउटपुट विषम-संख्या ऊँचाई या चौड़ाई विशेषता नहीं हो सकता है" सच नहीं है। Pix_fmt को कुछ ऐसे सेट करें जिसमें क्रोमा सबसम्पलिंग नहीं है, जैसे कि rgb24 या yuv444p, फिर सुनिश्चित करें कि कोडेक और कंटेनर इसे सपोर्ट करते हैं और आगे कोई प्रतिबंध नहीं है। Pix_fmt के संबंध में, FFmpeg बुद्धिमान से कम है; जब तक आप इसे अन्यथा नहीं बताते तब तक यह yuv420p (जिसे क्रोमा सबसम्प्लिंग है) मान लेता है।
जोनाथन बाल्डविन

कई छवियों के बारे में क्या? मुझे कुछ विशिष्ट समय पर छवि को दूसरी छवि में बदलने की आवश्यकता है। मैं उन्हें कमांड लाइन पर हर एक के लिए एक समय पैरामीटर के साथ निर्दिष्ट करने में सक्षम होना चाहता हूं।

36

और भी आसान:

ffmpeg -i ep1.png -i ep1.wav ep1.flv

FFmpeg आपके आउटपुट फ़ाइल के विस्तार के आधार पर, स्वचालित रूप से सर्वश्रेष्ठ कोडेक चुनने की कोशिश करेगा।

अद्यतन: मैंने देखा कि YouTube को वीडियो को संसाधित करने में कठिनाई होती है (95% पर अटक जाता है) मुझे लगता है कि केवल एक फ्रेम है। YouTube को खुश करने के लिए मुझे जो समाधान मिला है: अधिक फ़्रेम जोड़ें। इसके अलावा, मैंने -acodec copyऑडियो गुणवत्ता को संरक्षित करने के लिए जोड़ा । आपको जरूरत है -shortestया यह हमेशा के लिए बंद हो जाता है। (यह सबसे छोटी धारा के अंत में रुकता है, जो कि ऑडियो है, क्योंकि छवि लूप अनंत है।) आपके विकल्पों का क्रम गति के लिए बहुत महत्वपूर्ण है, क्योंकि फ़िल्टर (और ऐसे) आपके द्वारा निर्दिष्ट क्रम में संसाधित होते हैं। यदि आप इन मापदंडों के क्रम को बदलते हैं, तो परिणाम नाटकीय रूप से भिन्न होते हैं।

ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:720 ep1.flv

यह भी ध्यान दें कि मैंने फ्रेम दर को दो बार सेट किया है, यह कोई दुर्घटना नहीं है - पहला फ्रेम दर इनपुट के लिए है, दूसरा आउटपुट के लिए है। यदि आप इसे सही ढंग से करते हैं, तो वीडियो के प्रति सेकंड केवल एक फ्रेम होना चाहिए, जिसका अर्थ है कि यह अपेक्षाकृत तेजी से एन्कोड करता है। इसके अलावा, मैंने यहाँ 720p का रिज़ॉल्यूशन सेट किया है, जिसका अर्थ है कि आपको YouTube पर HD ऑडियो प्राप्त करना चाहिए :-)


यह भी संभव है कि आपकी ऑडियो फाइल आपके .flv कंटेनर के अनुकूल न हो। उस स्थिति में, आपको केवल एक अलग (आउटपुट) कंटेनर, जैसे .webm, .avi या जो भी प्रारूप की कोशिश करनी चाहिए, जब तक आपको एक कंटेनर प्रारूप नहीं मिल जाता है जो आपकी ऑडियो फ़ाइल के साथ संगत है।
पीजे ब्रुनेट

1
एक .JPG और .MP3 के लिए एक MP4 बनाने के लिए इसका इस्तेमाल किया - पूरी तरह से काम किया। जेपीजी / एमपी 3 से बनाई गई एफएलवी मुझे काम नहीं लगती थी - जो कि पिछली टिप्पणियों के अनुसार हो सकती है।

2
अपडेट किया गया संस्करण Youtube के लिए काम करता है। मुझे लगा कि यह 95% पर अटक गया है, लेकिन आखिरकार इसने काम किया।
बसज

यह मिला: No pixel format specified, yuvj420p for H.264 encoding chosen. Use -pix_fmt yuv420p for compatibility with outdated media players. [libx264 @ 0x2b5c940] height not divisible by 2 (700x457)... यह काम करता है:ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:-2 video.mp4
NineCattoRules

कई छवियों के बारे में क्या? मुझे कुछ विशिष्ट समय पर छवि को दूसरी छवि में बदलने की आवश्यकता है। मैं उन्हें कमांड लाइन पर हर एक के लिए एक समय पैरामीटर के साथ निर्दिष्ट करने में सक्षम होना चाहता हूं।

14

मेरे लिए काम करने वाला संस्करण:

 ffmpeg -loop 1 -y -i pic.jpg -i sound.amr -shortest video.mp4

-shortestयदि मुझे नीचे त्रुटि नहीं मिलती है तो आउटपुट का विकल्प चेकआउट आउटपुट फाइल के सामने होना चाहिए:

विकल्प सबसे छोटा (सबसे छोटा इनपुट के भीतर एन्कोडिंग) इनपुट फ़ाइल pic.jpg पर लागू नहीं किया जा सकता है - आप आउटपुट फ़ाइल या इसके विपरीत इनपुट विकल्प लागू करने की कोशिश कर रहे हैं। इस विकल्प को उस फ़ाइल से पहले ले जाएँ, जिसका वह संबंधित है। इनपुट फ़ाइल pic.jpg के लिए विकल्प पार्स करने में त्रुटि।


इसके लिए धन्यवाद। अन्य जवाबों में से अधिकांश मेरे लिए काम नहीं किया (अल्पाइन लिनक्स पर ffmpeg का उपयोग करके)। इस उत्तर में सबसे छोटी कमांड है जो मेरे लिए त्रुटिपूर्ण काम करती है।
डैनीबी

8

Ffmpeg मैनपेज से:

ffmpeg [[infile options][-i infile]]... {[outfile options] outfile}...

जैसा कि आपने खोजा, शिशु विकल्प उस शिशु से पहले आना चाहिए, जिस पर वे लागू होते हैं।

यह एक बग नहीं है, हालांकि, सिर्फ एक तंत्र जिसके द्वारा आप यह निर्दिष्ट कर सकते हैं कि कौन से शिशु तर्क लागू होते हैं।


कई छवियों के बारे में क्या? मुझे कुछ विशिष्ट समय पर छवि को दूसरी छवि में बदलने की आवश्यकता है। मैं उन्हें कमांड लाइन पर हर एक के लिए एक समय पैरामीटर के साथ निर्दिष्ट करने में सक्षम होना चाहता हूं।

4

इसने मेरे लिए काम किया

ffmpeg -loop 1 -shortest -y -i image.jpg -i audio.mp3 -acodec copy -vcodec libx264 video.avi

मैंने पाया कि vcodec libx264ने mpjeg10 एमबी (100 एमबी के बजाय 10 एमबी) की तुलना में बहुत छोटी फाइलें बनाई हैं ।


1
-shortestएक आउटपुट विकल्प है और इसे इनपुट विकल्प के रूप में अनदेखा किया जा सकता है क्योंकि आप इसका उपयोग कर रहे हैं।
ललगन

1

मैं @matteo के रूप में करने की कोशिश कर रहा था , लेकिन ऑडियो के बिना, और @ कोलोनियल पैनिक के समाधान ने सबसे अच्छा काम किया:

ffmpeg -loop 1 -shortest -y -i still.png -vcodec libx264 -t 10 video.avi

मुझे केवल सेकंड में अवधि तर्क जोड़ना था ( -t 10)।


-shortestएक आउटपुट विकल्प है, लेकिन आप इसे एक इनपुट विकल्प के रूप में उपयोग कर रहे हैं। आउटपुट फ़ाइल से पहले इसे स्थानांतरित करें और आप इसे समाप्त कर सकते हैं -t 10, लेकिन फिर आपका उत्तर दूसरों की तरह ही बहुत अधिक होगा।
ललगन

0

ffmpeg -loop 1 -i img.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest out.mp4


5
क्या आप बता सकते हैं कि आपने जो कमांड जोड़ा है वह कैसे काम करता है?
नील्स

यह उत्तर अन्य सरल "टिप्पणी-जवाब" से बहुत अलग नहीं है।
21

0

यदि कोई व्यक्ति उन्हें परिवर्तित करना चाहता है, तो यह प्रयास करें।

आप इनपुट और आउटपुट फ़ोल्डर सेट कर सकते हैं, और वह प्रारूप भी जिसमें आप चाहते हैं कि वीडियो अंदर हो। इस मामले में मैंने इसे AVI में सेट किया है।

यह उत्तर FFmpeg का उपयोग करके एक वीडियो बनाने के लिए एक छवि + एक ऑडियो फ़ाइल का संयोजन करता है जिससे मुझे बहुत मदद मिली।

 @echo off
 set "sourcedir=C:\Users\CodeHard\Desktop\BOX\Newfolder"  
 set "outputdir=C:\Users\CodeHard\Desktop\BOX\Converted" 

 PUSHD "%sourcedir%"

 for %%F in (*.mp3) DO ffmpeg -r 1 -loop 1 -i abc.jpeg -i "%%F" -acodec copy -r 1 -shortest -vf scale=1280:720 "%outputdir%\%%F.avi"  

 POPD

-1

इस कमांड को आज़माएं। यह मेरे लिए काम किया है।

-y -i /storage/emulated/0/images.jpg -i /storage/emulated/0/audio.wav -acodec aac -vcodec mpeg4 -s 480*320 -f mp4 -r 2 /storage/emulated/0/output.mp4"

2
यह एक अधूरी आज्ञा है जो संभवतः काम नहीं कर सकती। हालाँकि मैं आपकी आज्ञा को ठीक और डीबग कर सकता हूं, लेकिन मैं आपके लिए अपना काम नहीं करूंगा, इसलिए कृपया अपना उत्तर संपादित करें और इसे स्वयं ठीक करें। मैंने यह भी देखा कि आपके वीडियो का आकार वैसा नहीं है जैसा मैट्टो चाहता था।
कैरेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.