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




h.264 (5)

बस -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"

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


इस के साथ खेलने के बाद, मुझे लगता है कि मैंने अपने स्वयं के प्रश्न का उत्तर दिया है। अगर कोई अन्य इसी तरह के मुद्दे पर चलता है तो समाधान यहां दिया गया है ... मुझे निम्न तर्क को कमांड में जोड़ना था:

-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2"

कमान:

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

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

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

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

-vf scale=1280:-2

एंड्रॉइड के लिए, जोड़ना न भूलें

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