स्थिर आकार के खिलाड़ी में फिट होने के लिए ffmpeg / avconv के साथ वीडियो का आकार बदलना


65

मेरे पास एक html 5 वीडियो प्लेयर है जो 700px चौड़ा, 400px ऊंचा है। मैं avconv(पहलू अनुपात को बनाए रखते हुए) आकार बदलने के लिए ffmpeg का उपयोग करने की कोशिश कर रहा हूं और यह सुनिश्चित करता हूं कि यह मेरे खिलाड़ी में फिट हो।

इनपुट किसी भी आकार की एक फ़ाइल हो सकती है, इसलिए मुझे बड़े लोगों का आकार बदलने की आवश्यकता है, लेकिन छोटे लोगों को काली पट्टियों के साथ केन्द्रित करें। अब तक मैंने कोशिश की है: -sऔर -aspect, मैंने स्विच के padसाथ उपयोग किया जा रहा है, -vfलेकिन यह नहीं समझता कि मुझे जो चाहिए वह प्राप्त करने के लिए यह पर्याप्त काम करता है।

इमेजिस

यह एक मोटा विचार है जो मुझे चाहिए। मुझे यकीन नहीं है कि यह भी संभव है। यह लगभग CSS की अधिकतम-चौड़ाई / अधिकतम-ऊंचाई की तरह है। मुझे लगता है कि यह केवल शब्दों का एक झंझट हो सकता है, लेकिन अगर किसी को यह समझ में आता है कि मैं किस बारे में बात कर रहा हूं, तो मैं मदद की सराहना करता हूं, धन्यवाद।

avconv कमांड:

avconv -y -i control.avi -vcodec libx264 -b 2000k -bufsize 20M -acodec aac -strict experimental -ar 44100 -ab 256k bigbuck_out.mp4


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

हम मूल फ़ाइल को S3 बाल्टी में दबाते हैं, ताकि कोई समस्या न हो, और हम वैसे भी फिर से एन्कोडिंग कर रहे हैं क्योंकि हम वीडियो प्रकारों के बड़े दायरे को स्वीकार करते हैं, इन सभी को h.264 mp4 फ़ाइलों के माध्यम से स्ट्रीमिंग के लिए उपयुक्त होना चाहिए एक ब्राउज़र। तो आप वीडियो का आकार बदलने और फिर html / css स्तंभ / लेटरबॉक्स बनाने का सुझाव देंगे? साभार
जेमी टेलर

1
स्वीकृत उत्तर के स्वामी के रूप में, मैं आपको अपनी पोस्ट अन-एक्सेप्ट करने का सुझाव दूंगा और इसके बजाय लॉर्डनेकरबर्ड के उत्तर को स्वीकार करूंगा, क्योंकि यह सबसे हालिया और बहुत सरल है।
बजे

@slhck, मैं इस पर विचार कर रहा था, आपके आशीर्वाद से, मैं इसे बनाऊंगा।
जेमी टेलर

जवाबों:


51

स्केल फिल्टरforce_original_aspect_ratio में विकल्प का उपयोग करने के लिए एक सरल विधि है ।

मूल छवि
मूल छवि। एक 640x480, 4: 3 पहलू अनुपात वीडियो का प्रतिनिधित्व करता है।

इन उदाहरणों में मूल छवि को मूल पहलू अनुपात को संरक्षित करते हुए 16: 9 पहलू अनुपात आउटपुट में फिट किया जाएगा। ऐसा करने के लिए आप या तो कर सकते हैं:

पिलरबॉक्स या लेटरबॉक्स

स्तंभित छवि
पिलरबॉक्स वाली छवि। 1280x720 (16: 9) आउटपुट में एक 640x480 (4: 3) इनपुट का उत्पादन।

ffmpeg -i input -vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2" output
  • इससे छवि खराब होगी। यदि आप अपसंस्कृति से बचना चाहते हैं तो नीचे दिए गए उदाहरण को देखें।

  • यदि इनपुट पहलू अनुपात आउटपुट पहलू अनुपात से अधिक व्यापक है, तो इसके बजाय लेटरबॉक्सिंग होगा। उदाहरण के लिए, 2.35: 1 पहलू अनुपात के साथ एक इनपुट 16: 9 आउटपुट में फिट होता है जिसके परिणामस्वरूप लेटरबॉक्सिंग होगा।

ऊपर के समान ही लेकिन बिना अपसंस्कृति के

कोई उतार-चढ़ाव नहीं
640x480 (4: 3) इनपुट में 1280x720 (16: 9) आउटपुट अपस्कूलिंग के बिना है।

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

काटना

यहाँ छवि विवरण दर्ज करें
फसली छवि। 4: 3 इनपुट पहलू अनुपात, 16: 9 आउटपुट पहलू अनुपात।

ffmpeg -i input -vf "scale=1280:720:force_original_aspect_ratio=increase,crop=1280:720" output

और मेरे लिए एक रिक्त भरण जोड़ने के लिए?
टिआगो फेरेसिन

@TiagoFerezin "रिक्त भरण" क्या है?
११:५३ पर ल्लगन

ओह क्षमा करें, काले रंग के बजाय एक और रंग भरें, उदाहरण के लिए
टिआगो फेरेसिन

2
@TiagoFerezin आह, हाँ। करने में आसान। पैड फ़िल्टर का उपयोग करने वाले उदाहरणों में आप colorविकल्प जोड़ सकते हैं , जैसे pad=1280:720:(ow-iw)/2:(oh-ih)/2:color=red(या यदि आप चाहें तो हेक्साडेसिमल का उपयोग कर सकते हैं)। देखें रंगों की सूची
ल्लगन

61

यहां वह कमांड है जो एक निश्चित आउटपुट चौड़ाई के लिए पिलर- या लेटरबॉक्सिंग जोड़ देगा। यह बहुत लंबा है, लेकिन आपको किसी तरह पैडिंग को निर्दिष्ट करना होगा।

सबसे पहले, अपने शेल में आउटपुट चौड़ाई और ऊंचाई को परिभाषित करें:

width=700
height=400

फिर कमांड चलाएँ:

ffmpeg -i in.mp4 -filter:v "scale=iw*min($width/iw\,$height/ih):ih*min($width/iw\,$height/ih), pad=$width:$height:($width-iw*min($width/iw\,$height/ih))/2:($height-ih*min($width/iw\,$height/ih))/2" out.mp4

यह आकार बदलने और पैड करने के लिए आवश्यक नंगे आवश्यक चीज़ों से नीचे छीन लिया गया है - जैसा कि आप फिट देखते हैं अपने अन्य वीडियो और ऑडियो विकल्प जोड़ें। ध्यान दें कि के लिए संख्या widthऔर heightक्रम सबसे कोडेक के लिए काम करने के लिए 2 से विभाज्य होना है।

यहाँ क्या हो रहा है की व्याख्या है:

  • स्केलिंग:
    • पहले हमें यह पता लगाने की जरूरत है कि चौड़ाई या ऊंचाई के हिसाब से क्या करना है।
    • ऐसा करने के लिए, हम आउटपुट चौड़ाई को इनपुट चौड़ाई और आउटपुट ऊंचाई को इनपुट ऊंचाई से विभाजित करते हैं। यह हमें प्रत्येक आयाम के लिए स्केल कारक देगा।
    • हम तब जांचते हैं कि कौन सा कम है (साथ min()) और आकार बदलने के लिए केवल उस कारक को चुनें।
    • अंत में, हम उस कारक ( iw*min(…):ih*min(…)) द्वारा इनपुट चौड़ाई और ऊंचाई दोनों को गुणा करते हैं ।
  • गद्दी:
    • $width:$height आउटपुट चौड़ाई और ऊंचाई है
    • यह पता लगाने के लिए कि परिणामी वीडियो को कहां रखा जाए, हमें अधिकतम आउटपुट चौड़ाई से स्केल की गई चौड़ाई और अधिकतम आउटपुट ऊंचाई से स्केल की गई ऊंचाई को घटाना होगा।
    • स्केल की चौड़ाई और ऊँचाई scaleफ़िल्टर से अभिव्यक्ति हैं ।
    • हम दोनों तरफ सीमाओं को जोड़ने के लिए परिणामी ऑफसेट को 2 से विभाजित करते हैं।

3
@JamieTaylor -movflags +faststartslhck के उदाहरण में जोड़ने पर विचार करें । यह आपके उत्तरोत्तर डाउनलोड किए गए वीडियो को पूरी तरह से डाउनलोड होने से पहले प्लेबैक शुरू करने की अनुमति देगा, और अधिक एन्कोडिंग निर्देशों और उदाहरणों के लिए FFmpeg और x264 एन्कोडिंग गाइड और FFmpeg और AAC एन्कोडिंग गाइड भी देखें ।
18

आप इसे करने के लिए पैड फ़िल्टर को छोटा कर सकते हैं, मुझे लगता है:pad=$width:$height:(ow-iw)/2:(oh-ih)/2"
jdi

1
@jdi यह काम नहीं करेगा यदि आप डाउनस्कूल कर रहे हैं, क्योंकि इससे नकारात्मक मान उत्पन्न होंगे ow-iw
21

शुरुआती बिंदु के लिए धन्यवाद! हालाँकि, नमूना पहलू अनुपात के साथ वीडियो के लिए एक उचित पहलू अनुपात प्राप्त करने के लिए! = 1, "iw" के प्रत्येक परिशोधन को "sar" से गुणा करने की आवश्यकता होती है, इसलिए "iw" के साथ "(sw * iw)" की हर जगह परिवर्तन करना चाहिए। फ़िल्टर एक्सप्रेशन में मेरे लिए काम करता है।
schieferstapel

@slhck अरे, मैं एंड्रॉइड में कोशिश कर रहा हूं, लेकिन यह काम नहीं कर रहा है, क्या आप मेरी मदद कर सकते हैं !!! ffmpeg -i input.mp4 -filter: v स्केल = 640 * min (700 / 640,400 / 360): 360 * min (700 / 640,400 / 360), पैड = 700: 400: (700-640) / मिनट (700 / 640,400) / 360)) / 2: (400-360 * मिनट (700 / 640.400 / 360)) / 2 output.mp4
Nisarg

8

यह मुझे लगता है कि आपको इसे तीन चरणों में करने की आवश्यकता है:

  1. इनपुट पहलू अनुपात की जाँच करें
  2. DAR> 7/4 चौड़ाई-वार (चौड़ाई 700 तक बदलें, और पहलू अनुपात रखने के लिए ऊँचाई स्केल करें) वाले स्केल वीडियो, और DAR <7/4 ऊँचाई-वार वाले पैमाने
  3. वीडियो को पैड करें ताकि यह 700: 400 स्पेस में फिट हो जाए।

FFmpeg / avconv एक ही चरण में वीडियो फिल्टर के साथ स्केलिंग / पैडिंग कर सकता है, केवल एक बार ट्रांसकोडिंग। उदाहरण के लिए, 16: 9 वीडियो लेने के लिए, इसे चौड़ाई-वार पैमाने पर ले जाएँ, और फिर परिणामों को लेटरबॉक्स में दें:

ffmpeg -i input.avi -filter:v 'scale=700:-1,pad=700:400:(ow-iw)/2:(oh-ih)/2' \
-c:v libx264 -b:v 2000k -bufsize 20M -c:a aac -strict experimental -ar 44100 -b:a 256k output.mp4

... लेकिन पहले चरण के लिए (पहलू अनुपात का पता लगाना और इसकी तुलना 7: 4 की आवश्यकता है) आपको किसी प्रकार की स्क्रिप्ट का उपयोग करना होगा।

ffprobe input.avi 2>&1 | sed -n '/Video:/s/.*DAR \([0-9]*:[0-9]*\)].*/\1/p'

... आपको वीडियो का पहलू अनुपात मिलेगा, जो '16: 9 'या' 4: 3 'जैसा दिखेगा। एक बैश स्क्रिप्ट में, मैं कुछ इस तरह उपयोग करूंगा:

#!/bin/bash

##  Get the aspect ratio in the form x/y
dar=$(ffprobe test0.mp4 2>&1 | sed -n '/Video:/s/.*DAR \([0-9]*:[0:9]*\)].*/\1/p' | sed 's|:|/|')
##  use bc to do x/y*100 (bash can't handle floats)
DAR=$(bc <<< 'scale=2; $dar*100')

##  ${DAR%.00} will remove the trailing .00 left by bc
if [ ${DAR%.00} -ge 175 ]; then
    ffmpeg -i "$1" -filter:v 'scale=700:-1,pad=700:400:(ow-iw)/2:(oh-ih)/2' \
    -c:v libx264 -b:v 2000k -bufsize 20M -c:a aac -strict experimental -ar 44100 -b:a 256k "${1%.*}.mp4
else
    ffmpeg -i "$1" -filter:v 'scale=-1:400,pad=700:400:(ow-iw)/2:(oh-ih)/2' \
    -c:v libx264 -b:v 2000k -bufsize 20M -c:a aac -strict experimental -ar 44100 -b:a 256k "${1%.*}.mp4
fi

exit 0

जाहिर है आपको इसे अपनी आवश्यकताओं के अनुकूल बनाना होगा।


1
हालांकि यह एक ही कदम में संभव है, मेरा जवाब देखें।
slhck

@ एसएलएचके अब यह आसान है। गिटार-मुलेट के साथ उत्तर देखें।
ललगन

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