ffmpeg - एफएफएमपीईजी(libx264) "ऊंचाई 2 से विभाजित नहीं है"




h.264 (4)

बस -2 प्रयोग करें

स्केल फ़िल्टर दस्तावेज से :

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

उदाहरण

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

-vf scale=1280:-2

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

-vf scale=-2:720

"2 से विभाजित"

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

चेतावनी

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

मैं libx264 कोडेक का उपयोग कर FFMPEG का उपयोग कर फ्रेम के सेट से एक .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 लागू करता है?


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

बिटैंड (एक्स, 65534)

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

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

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

कारण:

  • इनपुट वीडियो में उनके डिस्प्ले पहलू अनुपात (डीएआर) सेट था
  • scale वास्तविक फ्रेम आयाम स्केल करता है
  • पूर्वावलोकन के दौरान नए वीडियो के आकार को डीएआर का उपयोग करके सही किया जाना चाहिए, जो काफी कम रेज्यूशन वीडियो (360x288, डीएआर 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 अब अंतिम हैं, कोई पहलू अनुपात सुधार लागू नहीं किया जाना चाहिए

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


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

scale=720:-1 

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

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

(सिर्फ लोगों के लिए स्केलिंग के साथ ऐसा करने के लिए खोज रहे हैं)


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

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

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