FFMPEG (libx264) "উচ্চতা 2 দ্বারা বিভাজ্য নয়"


188

আমি libx264 কোডেক ব্যবহার করে FFMPEG ব্যবহার করে ফ্রেমের একটি সেট থেকে একটি এমপি 4 ভিডিও এনকোড করার চেষ্টা করছি।

এই আদেশটি আমি চালাচ্ছি:

/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 প্রয়োগ করে এমন কোনও অনুপাত রয়েছে কি?


@ আলেকসান্ডারডুবিনস্কি তবে লর্ডনেকবার্ডের উত্তরটি মূল প্রস্থ এবং উচ্চতা সংরক্ষণ করে না e এখানে আমাদের ম্যানুয়ালি উভয় প্রস্থ বা উচ্চতা নির্দিষ্ট করতে হবে..আর যদি wv-স্কেল = -2: ih বা -vf স্কেল = iw: -2 এটি ব্যবহার করবে না উচ্চতা এবং প্রস্থ উভয়ই যদি অসম হয় তবে কাজ করুন .. দয়া করে ব্যাখ্যা করুন যে উত্তরটি আরও অনুকূল কীভাবে? .. ধন্যবাদ
ভার্মশ্রীবাস্তব

1
@ ভার্মশ্রীবাস্তব আচ্ছা, এসও কাজ করার পদ্ধতিটি হ'ল মূলত এখানে একটি প্রশ্ন থাকতে পারে এবং তারপরে গুগল একটি পৃথক প্রশ্ন সহ লোককে প্রেরণ করে যে এই পৃষ্ঠাটি কে হাইজ্যাক করে। এটি যা তা, এটির লড়াই না করার চেষ্টা করুন। মূল প্রশ্নের সঠিক উত্তর -vf pad="width=ceil(iw/2)*2:height=ceil(ih/2)*2"হ'ল এটি একটি উত্তরও নয়। অন্য সবার প্রশ্নের সঠিক উত্তর হ'ল লর্ডনেকবার্ডের।
আলেকসান্দ্র ডাবিনস্কি

@ ভার্মশ্রীবাস্তব আমি এগিয়ে গিয়ে প্রথম উত্তরটি স্থির করেছি। আশা করি এটি মোডগুলি দ্বারা ভাঙচুর হবে না।
আলেকজান্ডার ডাবিনস্কি

@ আলেকসান্ডারডুবিনস্কি ধন্যবাদ..আর ব্যবহারকারী রঙিন প্যাডিং পিক্সেলগুলি না চান তার "scale="পরিবর্তে ব্যবহার করতে পারবেন "pad="?
ভার্মশ্রীবাস্তব

উত্তর:


268

উত্তর মূল প্রশ্ন নেই যা না ভিডিও স্কেল করতে চাই:

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

COMMAND:

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 সন্ধান করেছি, আমি মনে করি এটি একটি বহু-পিক্সেলের রঙিন ফর্ম্যাট, যাতে চিত্রটির নির্দিষ্ট আকার হওয়া দরকার। যদিও এটি সংকুচিত হওয়ার বিষয়টি নিশ্চিত নয়।
lahwran

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"
ডানেউ

249

শুধু ব্যবহার -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 এর এই বিধিনিষেধ নেই। তবে, বেশিরভাগ অ-এফএফপিপেইগ ভিত্তিক প্লেয়ারগুলি কেবল 4: 2: 0 কে সঠিকভাবে ডিকোড করতে পারে, এজন্যই আপনি H.264 ভিডিও আউটপুট করার সময় প্রায়শই বিকল্পের ffmpegসাথে কমান্ডগুলি দেখতে পান -pix_fmt yuv420p

বিচারকার্য স্থগিত রাখার আদেশ

দুর্ভাগ্যক্রমে আপনি -2প্রস্থ এবং উচ্চতা উভয়ই ব্যবহার করতে পারবেন না , তবে আপনি যদি ইতিমধ্যে একটি মাত্রা নির্দিষ্ট করে থাকেন তবে ব্যবহার -2করা সহজ সমাধান।


14
আমি মনে করি যে কোনও "কৌশল" জড়িত থাকার কারণে তিহিসকে সঠিক উত্তর হিসাবে চিহ্নিত করা উচিত।
একাধিকবার উত্সাহিত

1
-vf scale=-2:-2কাজ হয় না কেন ? আমার ক্ষেত্রে আমি যথাসম্ভব মূল ফাইলের আকার সংরক্ষণ করতে চাই। আমার জন্য যা কাজ ছিল তা ছিল -vf scale=-2:ih। H / W উভয়ই অসম হলে এটি কাজ করে না।
পাস্কল

2
@ ভাগ্যমানের ফলাফলটি -2অন্যান্য মাত্রার ঘোষিত মানের উপর নির্ভর করে।
লগন

3
আমার ক্ষেত্রে এটি আমাকে নিম্নোক্ত ত্রুটি দিয়েছে: Size values less than -1 are not acceptable.তবে @ জিবিস্কের উত্তর পুরোপুরি কার্যকর করেছে worked
জুলিয়েন


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 দ্বারা পরিবর্তন করে by ছবিটি খুব কমই বিকৃত করে। আপনি যদি ফিল্টারিং গতির বিষয়ে উদ্বিগ্ন হন তবে ব্যবহার করুন scale=iw+mod(iw,2):ih+mod(ih,2):flags=neighbor। এটি প্রয়োজনে কেবল মাত্র প্রতিটি মাত্রা 1 দ্বারা বাড়িয়ে তুলতে পারে এবং শেষ সারি / কলামটিকে নকল করবে।
জ্ঞান

@ জ্ঞান আমার এই সমস্যার সমাধান হওয়ার পরে অনেক দিন হয়ে গেছে (আমার উত্তরটি আমি অনেক আগে করা একটি মন্তব্য থেকে বের করেছিলাম), তবে আমি মনে করি যে একক পিক্সেল দ্বারা স্কেলিং কিছু শর্তে লক্ষণীয় ভিজ্যুয়াল আর্টিক্টস প্রবর্তন করেছিল যার কারণে আমি বিরক্ত হয়েছিলাম প্রথম অবস্থানে. আমার ঠিক মনে নেই, একক পিক্সেল পরিবর্তন থেকে অসম্পূর্ণ পরিমাণ অস্পষ্ট হতে পারে? সম্ভবত কিছু বিড / চিত্রের ফর্ম্যাটগুলিতে? আমি যা বলতে পারি তা হ'ল আমি এই ফিক্সটি সহ কয়েক হাজার ভিড প্রক্রিয়া করেছি এবং এটি ছিল অনুকূল রূপান্তর।
ডানেউ

19

এটি সম্ভবত এইচ -264 ভিডিওটি কমপিউশন প্রয়োগের আগে 4: 2: 0 হিসাবে আরজিবি থেকে YUV স্পেসে রূপান্তরিত হয় (এই ফর্ম্যাট রূপান্তরটি নিজেই একটি ক্ষতির সংকোচনের অ্যালগরিদম যার ফলে 50% স্থানের সঞ্চয় হয়) এই সত্যটি ঘটে।

YUV-420 আরজিবি (রেড গ্রিন ব্লু) চিত্র দিয়ে শুরু হয় এবং এটিকে ইউইউভিতে রূপান্তরিত করে (মূলত একটি তীব্রতা চ্যানেল এবং দুটি "হিউ" চ্যানেল)। তারপরে হিউ চ্যানেলগুলি সেই রঙের প্রতিটি 2X2 বর্গক্ষেত্রের জন্য একটি করে হিউ নমুনা তৈরি করে সাবমেল করা হয়।

আপনার যদি অনুভূমিকভাবে বা উল্লম্বভাবে আরজিবি পিক্সেলের একটি বিজোড় সংখ্যা থাকে তবে আপনার কাছে ইউইউভি ফ্রেমের সাবম্যাপড হিউ স্পেসের শেষ পিক্সেল কলাম বা সারিটির জন্য অসম্পূর্ণ ডেটা থাকবে।


2
আরেকটি আকর্ষণীয় তথ্য ... আপনি যখন মাইক্রোসফ্ট মিডিয়া ফাউন্ডেশন স্টাফ দিয়ে ডিকোড করেন, আপনাকে H264 এর জন্য 16 এর গুণক ব্যবহার করা উচিত। সুতরাং 1080 পি ভিডিওটি এমন একটি বাফারে ডিকোড হয় যা 1088 উচ্চ (যদিও আপনি শেষ 8 টি লাইন উপেক্ষা করছেন)।
আদিসাক

2

লর্ডনেকবার্ডের সঠিক উত্তর রয়েছে খুব দ্রুত

-vf scale=1280:-2

অ্যান্ড্রয়েডের জন্য, অ্যাড যুক্ত করতে ভুলবেন না

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

আপনার থ্রেডগুলি ঘোষণা করার দরকার নেই: এটি স্বয়ংক্রিয়ভাবে ডিল করা হয়েছে। আমি বিশ্বাস করি যে এইচ .264--disable-asm এ এনকোড করার সময় অ্যানড্রিয়ড আস্তে আস্তে আস্তে আস্তে জনপ্রিয় "WritingMinds / ffmpeg-android" ব্যবহার করেন এমন লোকজন যা এর x264 বিল্ড স্ক্রিপ্টে ব্যবহার করে । ফলস্বরূপ অপ্রয়োজনীয় এবং উল্লেখযোগ্য significantিলে slালা হয় (আপনি ffmpeg লগ চেক করতে পারেন এবং যদি এটি দেখায় using cpu capabilties: none!তবে এটি খারাপ)। তারা কেন এটি যুক্ত করেছে তা সম্পর্কে আমি নিশ্চিত নই, তবে আমি অ্যান্ড্রয়েড বিকাশকারী নই।
লগন

1

আপনি এর bitandপরিবর্তে ফাংশন ব্যবহার করতে পারেন trunc:

বিটানড (এক্স, 65534)

হিসাবে একই কাজ করবে trunc(x/2)*2এবং এটি আমার মতে আরও স্বচ্ছ।
( 65534 এখানে একটি যাদুকরী সংখ্যা বিবেচনা করুন;))


আমার কাজটি ছিল স্বয়ংক্রিয়ভাবে প্রচুর ভিডিও ফাইলকে অর্ধেক রেজোলিউশনে স্কেল করা ।

scale=-2,ih/2সামান্য অস্পষ্ট চিত্রগুলি বাড়ে

কারণ:

  • ইনপুট ভিডিওতে তাদের ডিসপ্লে অ্যাসপেক্ট রেশিও (DAR) সেট ছিল
  • scale আসল ফ্রেমের মাত্রাগুলি স্কেল করে
  • পূর্বরূপের সময় নতুন ভিডিওর আকারগুলি ডিএআর ব্যবহার করে সংশোধন করতে হবে যা বেশ কম-রিসোশন ভিডিওর ক্ষেত্রে (360x288, ডার 16: 9) অস্পষ্ট হতে পারে

সমাধান:

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

ব্যাখ্যা:

  • আউটপুট_ উচ্চতা = ইনপুট_ উচ্চতা / 2
  • আউটপুট_উইথ = আউটপুট_ উচ্চতা * আসল_ডিসপ্লে_অ্যাস্পেক্ট_রেটিও
  • আউটপুট_উইথ এবং আউটপুট_ উচ্চতা উভয়ই এখন নিকটবর্তী ছোট সংখ্যায় 2 দ্বারা বিভাজ্য হবে
  • setsar=1মানে আউটপুট_ডিমেন্টেশন এখন চূড়ান্ত, কোনও দিক অনুপাত সংশোধন প্রয়োগ করা উচিত নয়

কেউ এই সহায়ক হতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.