मैं ffmpeg के साथ वीडियो का आकार कैसे कम कर सकता हूं?


201

मैं ffmpegगुणवत्ता को कम करके वीडियो के आकार को कम करने के लिए कैसे उपयोग कर सकता हूं (स्वाभाविक रूप से जितना संभव हो कम से कम, लेकिन मुझे मोबाइल डिवाइस पर चलाने की आवश्यकता है जिसमें बहुत अधिक स्थान नहीं है)?

मैं अभी एक बात लिखना भूल गया। जब वीडियो उपशीर्षक (* .srt या * .sub) का उपयोग कर सकता है तो मैं उन्हें परिवर्तित वीडियो फ़ाइल के मापदंडों को फिट करने के लिए परिवर्तित करना चाहूंगा।


4
मैंने इसका उपयोग नहीं किया है, लेकिन ffmpegमैन पेज -fsआउटपुट आकार को सीमित करने के लिए एक विकल्प दिखाता है , कुछ ffmpeg -i in.avi -fs 100M out.aviकाम करता है ?
केविन

1
मैं आपको उस आदमी पृष्ठ पर नहीं man ffmpeg | wc -l --> 5254

3
.aviमुख्य मुद्दा नहीं है .. aviसिर्फ एक कंटेनर है। मुख्य मुद्दा यह है कि आप किस कोडेक्स का उपयोग करते हैं .. कई (सबसे?) .aviVids पुराने शैली के कोडेक्स (जैसे XviD) का उपयोग करते हैं जो ठीक हैं, लेकिन बाद की पीढ़ी के कोडेक्स की तुलना में समान गुणवत्ता के लिए बड़े होते हैं .. आप आमतौर पर प्राप्त कर सकते हैं। H.264वीडियो संपीड़न मानक (जैसे। कोडेक x264) और aacऑडियो के लिए संपीड़न का उपयोग करके तंग एन्कोडिंग .. आपके द्वारा उपयोग किए जाने वाले कंटेनर और कोडेक आपके और आपके फोन पर निर्भर हैं ... .mp4कंटेनर अच्छी तरह से स्वीकार किया जाता है .. (लेकिन क्या आपका फोन इसे संभाल सकता है: इस लिंक को
पीटर

@ केविन यह रूपांतरण के लिए अधिक पैरामीटर चाहता है।
xralf

@ हाय यह क्या मतलब है?
xralf

जवाबों:


277

इस जवाब को देखें । सुविधा के लिए नीचे उद्धृत:

सेकंड में वीडियो की लंबाई से 1 जीबी विभाजित करके आपको आवश्यक बिटरेट की गणना करें। तो, लंबाई 16:40 (1000 सेकंड) के वीडियो के लिए, 1000000 बाइट्स / सेकंड की एक बिटरेट का उपयोग करें:

ffmpeg -i input.mp4 -b 1000000 output.mp4

अतिरिक्त विकल्प जो विचार करने योग्य हो सकते हैं वह लगातार दर कारक स्थापित कर रहा है, जो औसत बिट दर को कम करता है, लेकिन बेहतर गुणवत्ता रखता है। लगभग 18 और 24 के बीच CRF से भिन्न - निम्न, उच्च बिटरेट।

ffmpeg -i input.mp4 -vcodec libx265 -crf 20 output.mp4

जरूरत के अनुसार कोडेक से भिन्न - libx264 उपलब्ध हो सकता है यदि libx265 थोड़ा बड़ा परिणाम फ़ाइल आकार की कीमत पर है।


आकार 338 एमबी का वीडियो आकार 130 एमबी पर कम हो गया था। गुणवत्ता तेजी से कम हुई। क्या इस प्रक्रिया के लिए कुछ स्पष्टीकरण है? मूल लेखक अपने दिशानिर्देश की व्याख्या नहीं करता है।
xralf

13
दूसरी कमांड, -crf 24मेरे पास एक 255.3MB का वीडियो लिया और गुणवत्ता को कम किए बिना इसे 72.7MB तक घटा दिया। एक उत्थान है!
पैट्रिक रॉबर्ट्स

2
प्रभावशाली तरीके से ~ 2G वीडियो को 14MB तक कम कर दिया, फिर भी अच्छा लग रहा है, यह पहला खोज परिणाम था और यह वही है जो मैं देख रहा था, धन्यवाद!
sinisterstuf

5
यह नोट करना अच्छा होगा कि आप अब libx265और भी अधिक आकार में कमी के लिए उपयोग कर सकते हैं ।
ZN13

6
का इस्तेमाल किया ffmpeg -i input.avi -vcodec libx264 -crf 24 output.avi। इसने 100mb वीडियो को 9mb तक कम कर दिया .. वीडियो की गुणवत्ता में बहुत कम बदलाव। धन्यवाद!
अल्फा_989

32

जब तक आप एक विशिष्ट बिटरेट की तलाश में न हों, मैं -crfविकल्प की सिफारिश करूंगा । यह x264एन्कोडिंग के लिए सबसे अधिक उपयोग किया जाता है : http://slhck.info/articles/crf

संक्षेप में: 23 का एक सीआरएफ "डीवीडी" गुणवत्ता वाली फिल्म (~ 700 एमबी -1 जीबी) बना देगा और कम सीआरएफ मूल्य उच्च गुणवत्ता (बड़ी फाइलें) होगा।


3
कृपया किसी बाहरी वेबसाइट से लिंक करने के बजाय पूर्ण आदेश का उदाहरण दें (जो किसी दिन टूट सकता है :)
जेक बर्गर

1
@ विक्की चिजवानी उपरोक्त उदाहरण में कोड प्रदान करता है। यह एक टिप्पणी के लिए बेहतर है, लेकिन यह इस साइट पर मेरी पहली गतिविधि थी। लिंक में crf विकल्प पर अधिक स्पष्टीकरण है, लेकिन कोड को काम करने के लिए आवश्यक नहीं है।
टॉम केली

27

आपने मोबाइल डिवाइस पर अधिक वीडियो फिट करने के लिए फ़ाइलों को कम करने की इच्छा का उल्लेख किया है, जो कि मेरा usecase भी है। यहाँ सभी उत्तर संपीड़न गुणवत्ता को कम करने के लिए हैं, लेकिन किसी ने भी वीडियो फ्रेम के आकार को कम करने का उल्लेख नहीं किया है। यह बहुत तेज है, मेरे अनुभव में लगभग 3 से 5 गुना तेज है। अधिक जानकारी के लिए स्केलिंग पर ffmpeg डॉक्स देखें ।

ffmpeg -i input.mkv -vf "scale=iw/2:ih/2" half_the_frame_size.mkv
ffmpeg -i input.mkv -vf "scale=iw/3:ih/3" a_third_the_frame_size.mkv
ffmpeg -i input.mkv -vf "scale=iw/4:ih/4" a_fourth_the_frame_size.mkv

20

मैंने इस प्रश्न के अन्य प्रस्तावित उत्तरों में से अधिकांश का परीक्षण किया। परीक्षण डेटा निष्कर्ष नीचे हैं। ये प्रस्तावित उत्तर हैं जिनका मैंने परीक्षण किया:

(BR), बिटरेट संशोधित करें, का उपयोग कर:

ffmpeg -i $infile -b $bitrate $newoutfile 

(सीआर) का उपयोग करते हुए लगातार दर कारक से भिन्न:

ffmpeg -i $infile -vcodec libx264 -crf 23 $outfile

(SZ) वीडियो स्क्रीन-आकार बदलें (उदाहरण के लिए इसका पिक्सेल आकार आधा), का उपयोग कर:

ffmpeg -i $infile -vf "scale=iw/2:ih/2" $outfile

(बीएल) H.264 प्रोफ़ाइल को "बेसलाइन" में बदलकर, उपयोग करें:

ffmpeg -i $infile -profile:v baseline $outfile

(DF) का उपयोग करते हुए डिफ़ॉल्ट ffmpeg प्रोसेसिंग का उपयोग करें:

ffmpeg -i $infile $outfile

डेटा

  • "आकार" - मूल के संबंध में परिवर्तित वीडियो का प्रतिशत पिक्सेल आकार।
  • "बिटरेट" - मूल और परिवर्तित वीडियो के बिटरेट।
  • "परिभाषा" - वीडियो का पिक्सेल आकार।
  • "कन्वर्ट" - सेकंड में वीडियो कन्वर्ट करने का समय।

मैंने प्रस्तावित पद्धति का उपयोग करके (बीएल) के लिए लक्ष्य बिटरेट की गणना की।

=== फ़ाइल A - नोड को प्रोपेल कोणीय - Fnbixa7Ts6M.mkv =

            original    BR         CR         SZ         BL         DF
            --------    ---        --         --         --         --
size        64152 kb    214%       76%        40%        83%        76%
bitrate     411 kb/s    883        313        165        342        313
definition  1920x1080   1920x1080  1920x1080  960x540    1920x1080  1920x1080
convert     --          648        509        225        427        510

=== फ़ाइल B - Angular _ के साथ ग्राफक्लाइन का उपयोग करके - ली कोस्टेलो- OGyFxqt5INw.m.mv/ =

            original    BR         CR         SZ         BL         DF
            --------    ---        --         --         --         --
size        410301 kb   33%        109%       28%        143%       109%
bitrate     2687 kb/s   880        2920       764        3843       2920
definition  3840x2160   3840x2160  3840x2160  1920x1080  3840x2160  3840x2160   
convert     --           2307       3188       1116       2646       3278

निष्कर्ष

  • (SZ) विधि निश्चित रूप से सबसे तेज तरीका है। यह 2X से 4X तेज था। यह उच्च-डेफ वीडियो पर बहुत अधिक समस्या हो सकती है, क्योंकि वीडियो की वास्तविक लंबाई की तुलना में अन्य सभी तरीकों को परिवर्तित होने में अधिक समय लगता है! उदाहरण के लिए, (CR) विधि ने 21 मिनट के वीडियो को परिवर्तित करने में 53 मिनट का समय लिया।

  • SZ विधि निश्चित रूप से सबसे अच्छी विधि है यदि वीडियो की परिभाषा स्क्रीन की परिभाषा से बड़ी है जो इसे प्रदर्शित करेगी। उदाहरण के लिए, यदि आपका फोन केवल 1080p चित्र प्रदर्शित कर सकता है, तो उसे 3840x2160 वीडियो भेजना सिर्फ बेकार है। यह 1080p के आकार के आधे हिस्से के लिए सबसे अच्छा होगा।

  • कुछ प्रस्तावित उत्तर वास्तव में कुछ वीडियो के आकार को बढ़ाते हैं। उदाहरण के लिए, (BR) विधि 1080p नमूने के आकार को दोगुना से अधिक कर देती है। हालांकि इसने 2160p का आकार एक तिहाई कर दिया। उच्च-डीईएफ़ नमूने के लिए, (CR), (BL) और (DF) विधियाँ सभी वीडियो के आकार को बढ़ाती हैं।

सही (या सर्वोत्तम) उत्तर

अपने लक्ष्य प्रदर्शन द्वारा समर्थित अधिकतम के लिए पहले रिज़ॉल्यूशन को कम करना हमेशा सबसे अच्छा होता है।

यदि आप फ़ाइल आकार को और कम करना चाहते हैं, तो यह व्यक्तिगत विकल्पों पर निर्भर करेगा। आप या तो सूचना सामग्री कम कर सकते हैं या संपीड़न बढ़ा सकते हैं।

  • आप रिज़ॉल्यूशन को कम कर सकते हैं यदि ऐसा कुछ नहीं है जो आपको चिंतित करता है।

  • यदि वीडियो में तेज़ एक्शन दृश्य शामिल नहीं हैं, तो आप फ्रेम दर कम करना चाहते हैं।

  • यदि आपके पास एक शक्तिशाली प्रोसेसर है और स्थान एकमात्र मुद्दा है, तो आप संपीड़न दर बढ़ा सकते हैं।

  • बिट दर कई कारकों का एक संयोजन है। तो बस बिट दर को कम करने के लिए ffmpeg बताने से आप अपने इच्छित परिणाम नहीं दे सकते हैं।

  • कम जानकारी सामग्री का दूसरा तरीका रंग की गहराई को कम करना है। यह कैसे किया जाए इस पर अभी चर्चा नहीं हुई।


13

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

ffmpeg -i input.mp4 output.mp4

मेरे मामले में इसने वीडियो और ऑडियो दोनों की बिटरेट को कम कर दिया (आप उन पर चलकर इनपुट और आउटपुट फ़ाइल की जांच कर सकते हैं और तुलना कर सकते ffprobeहैं), 700 एमबी के वीडियो को 60 एमबी के एक प्रतीत होता है कि समान गुणवत्ता में बदल दिया।


1
इसके साथ 4Gb से 2Gb पर गए, धन्यवाद !!
सैम होसेनी

1
(10Mo से 1.2 mb तक, ffmpeg ऑटो ने मेरे वीडियो को परिवर्तित किया जो VP8 से VP9 में था )
sodimel

इसने मेरे वीडियो का आकार 10.8MB से बढ़ाकर 14MB
pjtnt11

3

मेरे पास एक नुस्खा है जो मैंने मूल रूप से खुद के लिए जाली बनाया था ताकि मोशन जेपीईजी वीडियो को परिवर्तित करने के लिए मेरा पुराना कैमरा उत्पन्न हो (वे बहुत बड़े वीडियो हैं, क्योंकि प्रत्येक फ्रेम एक पूरी जेपीईजी छवि है) को h264। यहां अन्य प्रकार के वीडियो (पाठ्यक्रम, आदि) के लिए एक अनुकूलन है।

मैं ffmpeg का उपयोग नहीं कर रहा हूँ , लेकिन mplayer और mencoder । सबसे पहले, हमें ऑडियो को mplayer के साथ हटाना है:

mplayer -vo null -ao pcm:fast:file=<audio_pcm.wav> <video>
  • -vo nullऔर -ao nullमानकों MPlayer बताता वीडियो को अलग नहीं कर सकते हैं।

अगले चरणों में, हम mencoder के साथ एक 3-पास संपीड़न करेंगे। पहली बार में हम एक प्रारंभिक बिंदु के रूप में एक उपयुक्त निरंतर गुणवत्ता मोड संपीड़न ( crf पैरामीटर) चुनेंगे :

mencoder <video> -ovc x264 \ 
         -x264encopts ratetol=100:preset=veryslow:crf=<value>:pass=1 \
         -nosound -o video1.h264
  • यदि आप वीडियो की अंतिम गुणवत्ता के साथ विरोधाभास हैं, तो आप -x264encopts में slow_firstpass पैरामीटर जोड़ सकते हैं । मेन्कोडर मैनुअल का कहना है कि यह विकल्प कुछ मापदंडों को अक्षम करता है जो "अंतिम पास की गुणवत्ता पर बहुत कम या कोई प्रभाव नहीं होने पर एन्कोडिंग गति में सुधार करते हैं"। तो, इसे केवल अंतिम चरण में उपयोग करें।

  • आपको crf के लिए कई मान आज़माने चाहिए - 25 से शुरू करने की कोशिश करें और इसे तब तक बढ़ाते रहें जब तक कि आप परिणामी वीडियो पर कलाकृतियों को नोट न करें (उच्च मान अधिक संपीड़ित करता है)। याद रखें कि बाद में एन्कोडिंग पास उस गुणवत्ता में सुधार करेगा जो आपने crf के लिए चुना है

  • के लिए वैकल्पिक veryslow पूर्व निर्धारित कर रहे हैं धीमी , धीमी गति से , मध्यम आदि पूरी सूची के लिए mencoder मैनुअल देखें।

  • रिटेटोल बिटरेट भिन्नता को नियंत्रित करता है - मुझे यकीन नहीं है कि मैं यहां सही काम कर रहा हूं, लेकिन मैंने प्रत्येक दृश्य के लिए सही बिटरेट का चयन करने के लिए mencoder को कुल स्वतंत्रता देने के लिए इसे अधिकतम मूल्य पर सेट किया है।

पहले पास के बाद, आप ध्यान देंगे कि अंतिम पंक्ति आपको औसत बिटरेट देती है जिसका उपयोग आप अगले चरणों में करेंगे:

(...)
x264 [info]: kb/s:526.43

पहले पास में सुझाए गए crf पैरामीटर को बदलें , बाद में पास करने के लिए आवश्यक बिटरेट करें :

mencoder <video> -ovc x264 \
       -x264encopts slow_firstpass:ratetol=100:preset=veryslow:bitrate=526:pass=3 \
       -nosound -o video2.h264

यह दूसरा पास एन्कोडिंग संपीड़न को अनुकूलित करने के लिए पहले पास ( divx2pass.logऔर divx2pass.log.mbtree) में उत्पन्न आंकड़ों को पढ़ेगा ।

  • ध्यान दें कि आप समान वीडियो इनपुट का उपयोग करेंगे, न कि प्रथम पास द्वारा उत्पन्न - पहला पास 'आउटपुट वीडियो केवल प्रारंभिक गुणवत्ता की जांच करने के लिए उपयोगी है।

  • यह भी ध्यान दें कि pass=3( नहीं pass=2 ) एक नई सांख्यिकी फ़ाइल उत्पन्न करेगा, इसलिए आप अंतिम चरण को जितनी बार चाहें उतनी बार दोहरा सकते हैं। मैं आमतौर पर pass=3दो बार करता हूं , हमेशा परिणाम बिटरेट पर ध्यान देता हूं ।

इस बीच, आप ऑडियो का उपयोग lameया oggenc:

oggenc -q<n> <audio_pcm.wav>

अंत में, हम ऑडियो और वीडियो को रीमूक्स करेंगे

mencoder -audiofile <audio>.ogg video2.h264 -oac copy -ovc copy \
         -of lavf -lavfopts format=mp4 -o <video>.mp4
  • -of lavf -lavfopts format=mp4उत्पन्न करता है mp4lavopts muxers का उपयोग कर फ़ाइल स्वरूप।

3

मैंने 505MB से 183MB तक 40 मिनट की HD वीडियो प्रस्तुति को संपीड़ित किया,
यह 100MB → 36MB से जाने जैसा है।
मूल वीडियो एचडी था और आउटपुट लगभग शून्य ध्यान देने योग्य अंतर था।
यह एक वीडियो फ़ाइल है "मैं आसपास रखना चाहूंगा, लेकिन HD ओवरकिल है।"
यहाँ मैं कारण के साथ प्रयोग किया जाता है:

ffmpeg -n -loglevel error -i inputfile.mp4 -vcodec libx264 -crf 28 -preset faster -tune film outputfilename.mp4

  • -n: ओवरराइटिंग आउटपुट फ़ाइलों से बचें (परीक्षण के लिए सुरक्षित है तो बैचिंग)
  • -loglevel error : त्रुटियों को दिखाएं और प्रगति की पंक्तियों और पंक्तियों को छिपाएं
  • -i inputfile.mp4 : इनपुट फ़ाइल नाम
  • -vcodec libx264: ऊपर के शीर्ष उत्तर से स्वाइप किया गया
  • -crf 28: मामूली ध्यान देने योग्य अंतर के साथ एकल-पास संपीड़न ( "0 = दोषरहित, 23 = डिफ़ॉल्ट, 51 = सबसे खराब; विषयगत रूप से साने की सीमा 17- 28 है " ) डॉक्स
  • -preset faster: 'मध्यम' रेफरी डॉक्स के डिफ़ॉल्ट एन्कोडिंग समय की तुलना में तेजी से 2x दिखता है
  • -tune film: निर्दिष्ट इनपुट एक मुख्यालय वीडियो है (अन्य विकल्पों में 'कार्टून', 'स्टिलिमेज' ..) रेफ डॉक्स शामिल हैं
  • outputfilename.mp4 : आउटपुट फ़ाइल नाम

वीडियो फ़ाइलों की निर्देशिका के लिए:

for i in *.{avi,flv,m4v,mov,wmv,mp4,MP4,TS,mkv}; do ffmpeg -n -loglevel error -i "$i" -vcodec libx264 -crf 28 -preset faster -tune film "cc${i}"; done

मुद्दे:

  • कमांड में सभी एक्सटेंशन के बिना "सभी वीडियो फ़ाइलों" को इकट्ठा करने का एक क्लीनर तरीका
  • "cc" उपसर्ग के बिना फाइलनाम को आउटपुट करने के लिए एक क्लीनर तरीका है, और हटाने से पहले वीडियो की पुष्टि करने में सक्षम है
  • .webmफ़ाइलें कमांड के साथ काम नहीं करती हैं। स्वैप करना था "cc${i}""${i%.*}.mp4"

हैंडब्रेक एक यूआई के साथ एक ओपन-सोर्स विकल्प है


यह काम करता हैं। लेकिन इसमें बहुत अधिक समय लगता है। क्या कम निष्पादन समय के लिए कोई सुधार है
निराली

2

आपको गुणवत्ता को कम किए बिना, निर्दिष्ट फ़ाइल आकार (बिटरेट) के भीतर एक वीडियो को "फिट" करने के लिए 2-पास एन्कोडिंग का उपयोग करने की आवश्यकता होगी। यह काफी विस्तृत विषय है: http://web.archive.org/web/20171130050515/http://www.mpabo.com/2014/12/14/ffmpeg-and-x264-encoding-guide/


1

मैंने वीडियो के आकार को कम करने और स्वचालित रूप से विभिन्न crf मानों को आज़माने के लिए एक बैश स्क्रिप्ट लिखी।

मूल रूप से आप करेंगे

  • crf मानों की एक श्रृंखला चुनें
  • स्क्रिप्ट चलाएँ
  • उत्पन्न वीडियो का आकार जांचें और जिसे आप चाहते हैं उसे चुनें

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

मुझे उम्मीद है कि यह किसी की मदद करेगा। मैंने अपने सहयोगियों के साथ साझा किया और सभी ने इसे मददगार पाया।

#!/bin/bash

# bigger values of crf will lead to a bigger compression (smaller video size)
#for i in 1 2 3 4 5
for i in {25..28}
do
# you can remove the option -y if you want to be asked if to overwrite a file with the same name (leave the -y only if you understand what you are doing, otherwise you might rewrite an important file)
   ffmpeg -y -i NAMEOFTHEVIDEOTOCOMPRESS.mp4 -c:v libx264 -crf $i -preset veryfast -profile:v baseline -level 3.0 -strict -2 out_$i.mp4
   printf "\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Done compression at crf=$i \n\n"
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.