FFMPEG (libx264) "ऊंचाई 2 से विभाज्य नहीं"


188

मैं FFMPEG का उपयोग कर libx264 कोडेक का उपयोग कर फ्रेम के एक सेट से .mp4 वीडियो को एनकोड करने की कोशिश कर रहा हूं।

यह वह कमांड है जो मैं चला रहा हूं:

/usr/local/bin/ffmpeg -r 24 -i frame_%05d.jpg -vcodec libx264 -y -an video.mp4

मुझे कभी-कभी निम्न त्रुटि मिलती है:

[libx264 @ 0xa3b85a0] height not divisible by 2 (520x369)

थोड़ा खोज करने के बाद ऐसा लगता है कि इस मुद्दे का स्केलिंग एल्गोरिथ्म के साथ कुछ करना है और इसे एक -vf तर्क जोड़कर तय किया जा सकता है।

हालाँकि, मेरे मामले में मैं कोई स्केलिंग नहीं करना चाहता। आदर्श रूप से, मैं आयामों को बिल्कुल उसी तरह रखना चाहता हूं जैसे कि फ्रेम। कोई सलाह? वहाँ पहलू अनुपात के कुछ प्रकार है कि h264 लागू करता है?


@AleksandrDubinsky लेकिन लॉर्डनेकबर्ड का जवाब मूल चौड़ाई और ऊंचाई को संरक्षित नहीं करता है। हमें मैन्युअल रूप से चौड़ाई या ऊंचाई को निर्दिष्ट करने की आवश्यकता है..और यदि w -vf स्केल = -2: ih या -vf स्केल - iw: -2 यह नहीं होगा अगर ऊंचाई और चौड़ाई दोनों असमान हैं तो काम करें। कृपया बताएं कि उत्तर कैसे अधिक इष्टतम है? .. धन्यवाद
varmashrivastava

1
@varmashrivastava खैर, जिस तरह से एसओ काम करता है वह यह है कि मूल रूप से एक प्रश्न हो सकता है, और फिर Google एक अलग सवाल के साथ लोगों का एक समूह भेजता है जो तब पृष्ठ को हाईजैक करते हैं। यह वह है जो इसे लड़ने की कोशिश नहीं करता है। मूल प्रश्न का सही उत्तर है -vf pad="width=ceil(iw/2)*2:height=ceil(ih/2)*2", जो उत्तरों में से एक भी नहीं है। अन्य सभी के प्रश्न का सही उत्तर लॉर्डनेकबर्ड है।
अलेक्सांद्र डबिन्सकी २ '

@varmashrivastava मैंने आगे बढ़ कर पहला जवाब तय कर दिया है। उम्मीद है कि यह mods द्वारा बर्बरता नहीं है।
अलेक्सांद्र डबिन्सकी २ '

@AleksandrDubinsky thanks..and उपयोगकर्ता उपयोग कर सकते हैं "scale="बजाय "pad="अगर वह / वह गद्दी पिक्सल colured नहीं करता चाहते हैं?
वर्माश्रीवास्तव

जवाबों:


269

मूल प्रश्न का उत्तर जो वीडियो को स्केल नहीं करना चाहता है:

-vf "pad=ceil(iw/2)*2:ceil(ih/2)*2"

कमान:

ffmpeg -r 24 -i frame_%05d.jpg -vcodec libx264 -y -an video.mp4 -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2"

मूल रूप से, .h264 को और भी अधिक आयामों की आवश्यकता होती है ताकि यह फ़िल्टर होगा:

  1. मूल ऊंचाई और चौड़ाई को 2 से भाग दें
  2. इसे निकटतम पिक्सेल तक गोल करें
  3. इसे फिर से 2 से गुणा करें, इस प्रकार यह एक समान संख्या बनाता है
  4. इस नंबर तक ब्लैक पैडिंग पिक्सल जोड़ें

आप फ़िल्टर पैरामीटर जोड़कर पैडिंग का रंग बदल सकते हैं :color=whiteपैड का प्रलेखन देखें ।


3
यह बग नहीं है। इससे कोई फर्क नहीं पड़ता कि आप स्केलिंग का प्रदर्शन नहीं कर रहे हैं क्योंकि आउटपुट इनपुट के फ्रेम आकार को प्राप्त करेगा।
लोलगन

5
रिकॉर्ड के लिए, मैं सिर्फ कुछ कर रहा था जहां मैंने एक छवि से एक वीडियो बनाया, और यह पिक्सेल प्रारूप के रूप में yuvj444p का उपयोग करता था; यह वीडियो आकार के बारे में परवाह नहीं था। तब मुझे इसे yuv420p में बदलने की आवश्यकता थी, और फिर इसने वीडियो के आकार की परवाह की। मैंने विकिपीडिया पर yuv420p देखा, मुझे लगता है कि यह एक बहु-पिक्सेल रंग प्रारूप है, जिसकी छवि को एक विशिष्ट आकार की आवश्यकता है। यकीन नहीं है कि यह संकुचित क्यों मायने रखता है, हालांकि।
लहरावन

7
काली पंक्ति / स्तंभ जोड़ने के लिए आप संभवतः स्केल के बजाय पैड का उपयोग करना बेहतर समझते हैं। एक पिक्सेल से एक छवि को स्केल करना उसे धुंधला कर देगा।
ग्लेन मेनार्ड

5
@NickeManarin, इस फिल्टर को ऊर्ध्वाधर आयाम में 1 पिक्सेल सफेद गद्दी को जोड़ने का काम करना चाहिए, जिसमें ऊपरी बाईं ओर वीडियो स्थित है -vf pad="width=iw:height=ih+1:x=0:y=0:color=white":। Ffmpeg पैड प्रलेखन यहाँ है: ffmpeg.org/ffmpeg-filters.html#pad-1
मार्क बेरी

4
यहां एक समाधान है जो केवल आयामों के लिए पैडिंग का एक पिक्सेल जोड़ता है जो विषम हैं -vf pad="width=ceil(iw/2)*2:height=ceil(ih/2)*2":।
danneu

250

महज प्रयोग करें -2

से पैमाने फिल्टर प्रलेखन :

यदि मूल्यों में से एक -nहै n > 1, तो स्केल फ़िल्टर एक मान का भी उपयोग करेगा जो अन्य निर्दिष्ट आयाम से गणना की गई इनपुट छवि के पहलू अनुपात को बनाए रखता है। कि वह ऐसा करेगा बाद, हालांकि, यह सुनिश्चित करें कि गणना की आयाम से विभाज्य है बनाने nऔर यदि आवश्यक हो मूल्य समायोजित करें।

उदाहरण

1280 सेट चौड़ाई और ऊंचाई स्वचालित रूप से पक्षानुपात बनाए रखने के की गणना की जाएगी, और ऊंचाई 2 से विभाज्य हो जाएगा:

-vf scale=1280:-2

ऊपर के समान, लेकिन इसके बजाय घोषित ऊंचाई के साथ; फ़िल्टर द्वारा निपटाए जाने के लिए चौड़ाई छोड़ना:

-vf scale=-2:720

"2 से विभाज्य"

जैसा कि x264 द्वारा आवश्यक है, "चौड़ाई और ऊंचाई के लिए 2 से विभाज्य" YUV 4: 2: 0 क्रोमा सब्मिटेड आउटपुट के लिए आवश्यक है। 4: 2: 2 को "चौड़ाई के लिए 2 से विभाज्य" की आवश्यकता होगी, और 4: 4: 4 में ये प्रतिबंध नहीं हैं। हालांकि, अधिकांश गैर-FFmpeg आधारित खिलाड़ी केवल 4: 2: 0 को ठीक से डिकोड कर सकते हैं, यही कारण है कि आप अक्सर H.264 वीडियो आउटपुट करते समय विकल्प के ffmpegसाथ कमांड देखते हैं -pix_fmt yuv420p

चेतावनी

दुर्भाग्य से आप -2चौड़ाई और ऊंचाई दोनों के लिए उपयोग नहीं कर सकते हैं , लेकिन यदि आप पहले से ही एक आयाम निर्दिष्ट करते हैं तो उपयोग -2करना एक सरल उपाय है।


14
मुझे लगता है कि शामिल नहीं "चाल" के कारण टिहिस को सही उत्तर के रूप में चिह्नित किया जाना चाहिए। एक से अधिक बार
उत्थान करने के लिए आशीष

1
-vf scale=-2:-2काम क्यों नहीं करता? मेरे मामले में मैं मूल फ़ाइल आकार को यथासंभव संरक्षित करना चाहता हूं। क्या मेरे लिए काम किया था -vf scale=-2:ih। लेकिन यह काम नहीं करता है अगर दोनों h / w असमान हैं।
पास्कल

2
@tuner परिणामी मान -2दूसरे आयाम के घोषित मूल्य पर निर्भर करता है।
ललगन

3
मेरे मामले में इसने मुझे निम्नलिखित त्रुटि दी: Size values less than -1 are not acceptable.लेकिन @Zbyszek के उत्तर ने पूरी तरह से काम किया।
जुलिएन

1
@ जुलिएन ऐसा नहीं हैffmpeg । आप एक स्थिर बिल्ड डाउनलोड कर सकते हैं ।
ललगन

64

यदि आप कुछ आउटपुट चौड़ाई निर्धारित करना चाहते हैं और मूल के समान अनुपात के साथ आउटपुट करना चाहते हैं

scale=720:-1 

और इस समस्या के साथ नहीं तो आप उपयोग कर सकते हैं

scale="720:trunc(ow/a/2)*2"

(बस स्केलिंग के साथ यह करने के लिए खोज करने वाले लोगों के लिए)


16
और एक निश्चित ऊंचाई के लिए यह हैscale="trunc(oh*a/2)*2:720"
टॉम

20

यहां समाधान के साथ समस्या scaleयह है कि वे स्रोत छवि / वीडियो को विकृत करते हैं जो लगभग कभी भी आप क्या चाहते हैं।

इसके बजाय, मैंने पाया है कि सबसे अच्छा समाधान विषम आयाम में 1-पिक्सेल पैड जोड़ना है। (डिफ़ॉल्ट रूप से, पेंडिंग काला है और नोटिस करना कठिन है।)

अन्य padसमाधानों के साथ समस्या यह है कि वे मनमाने आयामों पर सामान्यीकरण नहीं करते हैं क्योंकि वे हमेशा पैड करते हैं।

यदि वे विषम हैं तो यह समाधान केवल ऊंचाई और / या चौड़ाई में 1-पिक्सेल पैड जोड़ता है:

-vf pad="width=ceil(iw/2)*2:height=ceil(ih/2)*2"

यह आदर्श है क्योंकि यह हमेशा सही काम करता है, भले ही कोई पैडिंग आवश्यक न हो।


स्केल सॉल्यूशन पिक्सेल गणना को 1 से बदल देते हैं। वह शायद ही तस्वीर को विकृत करता है। यदि आप फ़िल्टरिंग गति के बारे में चिंतित हैं, तो उपयोग करें scale=iw+mod(iw,2):ih+mod(ih,2):flags=neighbor। यह केवल प्रत्येक आयाम को 1 से बढ़ा सकता है, यदि आवश्यक हो, और अंतिम पंक्ति / कॉलम की नकल करेगा।
ज्ञान

@ ज्ञान तब से बहुत समय हो गया है जब मुझे यह समस्या आई थी कि यह हल हो गया है (मेरा उत्तर उस टिप्पणी से निकाला गया था जो मैंने बहुत पहले की थी), लेकिन मुझे याद है कि एक एकल पिक्सेल द्वारा स्केलिंग ने कुछ परिस्थितियों में ध्यान देने योग्य दृश्य कलाकृतियों को पेश किया था, जिसके कारण मैंने परेशान किया था पहली जगह में। मुझे ठीक से याद नहीं है, शायद एक ही पिक्सेल परिवर्तन से धुंधला होने की अनुपातहीन राशि? शायद केवल कुछ vid / छवि प्रारूपों पर? मैं केवल इतना कह सकता हूं कि मैंने इस फिक्स के साथ हजारों vids को संसाधित किया और यह अनुकूल परिवर्तन था।
danneu

19

यह इस तथ्य के कारण होने की संभावना है कि H264 वीडियो आमतौर पर RGB से YUV अंतरिक्ष में 4: 2: 0 के रूप में संपीड़न लागू करने से पहले परिवर्तित हो जाता है (हालांकि प्रारूप रूपांतरण स्वयं एक हानिपूर्ण संपीड़न एल्गोरिथम है, जिसके परिणामस्वरूप 50% अंतरिक्ष बचत होती है)।

YUV-420 आरजीबी (रेड ग्रीन ब्लू) तस्वीर के साथ शुरू होता है और इसे YUV (मूल रूप से एक तीव्रता चैनल और दो "ह्यू" चैनल) में परिवर्तित करता है। फिर ह्यू चैनल को उस ह्यू के प्रत्येक 2X2 वर्ग के लिए एक ह्यू नमूना बनाकर सब्सक्राइब किया जाता है।

यदि आपके पास क्षैतिज या लंबवत रूप से RGB पिक्सेल की विषम संख्या है, तो आपके पास YUV फ़्रेम के सबम्यूलेटेड ह्यू स्पेस में अंतिम पिक्सेल कॉलम या रो के लिए अधूरा डेटा होगा।


2
एक और दिलचस्प तथ्य ... जब आप Microsoft Media Foundation सामान के साथ डिकोड करते हैं, तो आपको H264 के लिए 16 के गुणकों का उपयोग करने की आवश्यकता होती है। तो 1080P वीडियो वास्तव में एक बफर में डिकोड होता है जो 1088 उच्च है (हालांकि आप अंतिम 8 लाइनों को अनदेखा करते हैं)।
५५ पर आदिसक

2

लॉर्डनेकबर्ड का सही उत्तर है, बहुत तेज़

-vf scale=1280:-2

Android के लिए, न भूलें

"-preset ultrafast" and|or "-threads n"

आपको थ्रेड घोषित करने की आवश्यकता नहीं है: यह अपने आप से निपटा जाता है। मेरा मानना ​​है कि जब एच .264 को एन्कोडिंग लोकप्रिय "राइटिंगमाइंड्स / एफएमपीईजी-एंड्रॉइड" का उपयोग करने वाले लोगों के कारण एन्ड्रॉयड सुस्ती है जो --disable-asmइसकी x264 बिल्ड स्क्रिप्ट में उपयोग करता है । यह आवश्यक और महत्वपूर्ण धीमापन में परिणाम देता है (आप ffmpeg लॉग की जांच कर सकते हैं और यदि यह दिखाता है using cpu capabilties: none!कि यह बुरा है)। मुझे यकीन नहीं है कि उन्होंने ऐसा क्यों जोड़ा, लेकिन मैं एक Android डेवलपर नहीं हूं।
21

1

आप bitandइसके बजाय फ़ंक्शन का उपयोग कर सकते हैं trunc:

बिटंड (x, 65534)

के रूप में ही करेंगे trunc(x/2)*2और यह मेरी राय में अधिक पारदर्शी है।
( यहां 65534 जादुई संख्या पर विचार करें;))


मेरा कार्य स्वचालित रूप से बहुत सारी वीडियो फ़ाइलों को आधे रिज़ॉल्यूशन पर स्केल करना था ।

scale=-2,ih/2थोड़ी धुंधली छवियों के लिए नेतृत्व

कारण:

  • इनपुट वीडियो में उनका प्रदर्शन पहलू अनुपात (DAR) सेट था
  • scale असली फ्रेम आयामों को मापता है
  • पूर्वावलोकन के दौरान नए वीडियो के आकारों को DAR का उपयोग करके ठीक किया जाना चाहिए जो काफी कम-रिज़ॉल्यूशन वीडियो (360x288, DAR 16: 9) के मामले में धुंधला हो सकता है

उपाय:

-vf "scale='bitand(oh*dar, 65534)':'bitand(ih/2, 65534)', setsar=1"

स्पष्टीकरण:

  • output_height = input_height / 2
  • output_width = output_height * original_display_aspect_ratio
  • दोनों output_width और output_height अब 2 से विभाज्य निकटतम छोटी संख्या में गोल हैं
  • setsar=1इसका मतलब है कि output_dimensions अब अंतिम हैं, कोई भी पहलू अनुपात सुधार लागू नहीं किया जाना चाहिए

किसी को यह मददगार लग सकता है।

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