मैं एक वीडियो को एक निश्चित आकार में कैसे फिट कर सकता हूं, लेकिन इसे FFmpeg के साथ नहीं बढ़ा सकता?


13

मुझे 640x360 पर वीडियो फिट करने की आवश्यकता है (अधिकतम मेरे फोन का खिलाड़ी संभाल सकता है), पहलू अनुपात को संरक्षित करते हुए भी , लेकिन मैं यह भी चाहता हूं कि अगर यह 640x360 से छोटा है, तो वीडियो अपरिवर्तित रहेगा (इसके बाद इसे ऊपर-स्केल करने का कोई मतलब नहीं)।

Ffmpeg की कमांड लाइन का उपयोग करके इस व्यवहार को प्राप्त करने का कोई तरीका है?


मुझे नहीं लगता कि यह पूरी तरह से ffmpeg में किया जा सकता है, लेकिन यदि आप इसे स्क्रिप्ट करने के लिए तैयार हैं, तो यह निश्चित रूप से किया जा सकता है।

मैंने पहले ही इसे स्क्रिप्ट कर लिया है, लेकिन मैं अपने कोड को साफ करना चाहता था, अगर इसकी जरूरत नहीं थी।
शशोअल्लम

यह संभवतः एक स्केल फ़िल्टर के साथ संभव है जो फ़ंक्शंस का उपयोग करता है min(…)लेकिन आयामों को पार्स करने वाली एक सरल स्क्रिप्ट के साथ सबसे निश्चित रूप से आसान है। क्या किया जा सकता है, इसके एक उदाहरण के लिए यहां मेरी कमान देखें: superuser.com/questions/547296/…
slhck

जवाबों:


10

नए ffmpeg संस्करणों के साथ, आप scaleफ़िल्टर के force_original_aspect_ratioविकल्प का उपयोग कर सकते हैं । उदाहरण के लिए, एक वीडियो को 1280 × 720 में फिट करने के लिए, बिना अपस्कूल किए ( अधिक जानकारी के लिए यह पोस्ट देखें ):

ffmpeg -i input.mp4 -filter:v "scale='min(1280,iw)':min'(720,ih)':force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2" output.mp4

scaleयदि इनपुट वीडियो इससे बड़ा है , तो यहां फिल्टर 1280 × 720 हो जाता है। यदि यह छोटा है, तो यह अपक्षय नहीं होगा। padफिल्टर लक्ष्य आकार से अपने पक्ष अनुपात या आकार अलग है 1280 × 720 करने के लिए उत्पादन वीडियो लाने के लिए, इस मामले में आवश्यक है।


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

width=640; height=360
aspect=$( bc <<< "scale=3; $width / $height") # <= floating point division

अब, सुपर कॉम्प्लेक्स फ़िल्टर कमांड लागू करें जिसे जिम वॉर्ल ने लिखा था :

ffmpeg -i input.mp4 -vf "scale = min(1\,gt(iw\,$width)+gt(ih\,$height)) * (gte(a\,$aspect)*$width + \
lt(a\,$aspect)*(($height*iw)/ih)) + not(min(1\,gt(iw\,$width)+gt(ih\,$height)))*iw : \
min(1\,gt(iw\,$width)+gt(ih\,$height)) * (lte(a\,$aspect)*$height + \
gt(a\,$aspect)*(($width*ih)/iw)) + not(min(1\,gt(iw\,$width)+gt(ih\,$height)))*ih" \
output.mp4

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


1
+1 लेकिन यह वास्तव में एक भयावह आदेश है: P
evilsoup

मुझे सही पता है? मैंने इसे तार्किक भागों में तोड़ने और फिर कुछ मान डालने की कोशिश करते हुए दस मिनट बिताए लेकिन मैंने हार मान ली। यह थोड़ा पुराना है और हो सकता है कि इसे बहुत संक्षिप्त रूप से लिखना संभव है, हालांकि।
slhck

14

एक अधिक पठनीय संस्करण इस प्रकार दिख सकता है:

-filter_complex "scale=iw*min(1\,min(640/iw\,360/ih)):-1"

640 / iw क्षैतिज स्केलिंग कारक है और 360 / ih ऊर्ध्वाधर स्केलिंग कारक है

आप आउटपुट बॉक्स के अंदर स्केल की गई छवि को फिट करना चाहते हैं और (भंडारण) पहलू अनुपात रखना चाहते हैं। आप न्यूनतम फ़ंक्शन के साथ सबसे छोटे स्केलिंग कारक का चयन करके ऐसा करते हैं: न्यूनतम (640 / iw, 360 / ih)

आप किसी भी अपसंस्कृति (यानी स्केलिंग फैक्टर> 1.0) को रोकना चाहते हैं, इसलिए आप एक और न्यूनतम फ़ंक्शन जोड़ते हैं: मिनट (1, मिनट (640 / iw, 360 / ih))

अगला कदम इनपुट-चौड़ाई और इनपुट-ऊंचाई के साथ स्केलिंग-कारक को गुणा करके आउटपुट रिज़ॉल्यूशन की गणना करना है:
आउटपुट-चौड़ाई = iw * मिनट (1, मिनट (640 / iw, 360 / ih))
आउटपुट-ऊंचाई = ih * मिनट (1, मिनट (640 / iw, 360 / ih))

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


A + बॉक्स से बाहर काम करता है। चयनित उत्तर के समाधान ने पहलू अनुपात को संरक्षित नहीं किया । इसने तख्ते को निचोड़ दिया।
287352

5

मेरे पास भी यही समस्या थी, लेकिन वीडियो को एक वर्ग 640x640 (स्मार्टफोन के साथ बनाए गए ऊर्ध्वाधर वीडियो के कारण) में फिट करके हल किया गया।

इसलिए इमेरज़ी लॉजिक और कुछ शोध का उपयोग करके मैं इसे समाप्त करता हूं:

-vf "scale=iw*min(1\,if(gt(iw\,ih)\,640/iw\,(640*sar)/ih)):(floor((ow/dar)/2))*2"

अंतिम भाग 2 से ऊँचाई तक विभक्त होने के लिए है जिसे कई एन्कोडर की आवश्यकता है।

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