আমি কীভাবে একটি নির্দিষ্ট আকারে কোনও ভিডিও ফিট করতে পারি, তবে এফএফপিপিগের সাথে এটি আপস্কেল করতে পারি না?


13

আসপেক্ট রেশিও সংরক্ষণ করার সময়, আমাকে 640x360 (সর্বাধিক আমার ফোনের প্লেয়ার হ্যান্ডেল করতে পারে) এর জন্য ভিডিওগুলি ফিট করতে হবে , তবে আমি এটিও চাই যে ভিডিওটি 640x360 এর চেয়ে ছোট হলে (এটি সর্বোপরি স্কেলিংয়ের কোনও মানে নেই)।

Ffmpeg কমান্ড লাইন ব্যবহার করে এই আচরণ করার উপায় আছে?


আমি মনে করি না এটি সম্পূর্ণভাবে ffmpeg এ করা যেতে পারে, তবে আপনি যদি এটির স্ক্রিপ্ট করতে ইচ্ছুক হন তবে এটি অবশ্যই করা যেতে পারে।
16-15 '

আমি ইতিমধ্যে এটি স্ক্রিপ্ট করেছি, তবে আমার কোডটির প্রয়োজন না হলে আমি এটি পরিষ্কার করতে চেয়েছিলাম।
সাশোলাম

স্কেল ফিল্টার দিয়ে সম্ভবত এটি সম্ভব যা এর মতো ফাংশনগুলি ব্যবহার করে min(…)তবে সাধারণ স্ক্রিপ্টের সাথে স্পষ্টতই সহজতর যা মাত্রাগুলিগুলিকে পার্স করে। কী করা যায় তার উদাহরণের জন্য আমার কমান্ডটি এখানে দেখুন: superuser.com/questions/547296/…
slhck

উত্তর:


10

নতুন ffmpeg সংস্করণ সহ, আপনি scaleফিল্টার force_original_aspect_ratioবিকল্প ব্যবহার করতে পারেন । উদাহরণস্বরূপ, কোনও চিত্রকে উপরে না রেখে 1280 × 720 এ ফিট করতে ( আরও তথ্যের জন্য এই পোস্টটি দেখুন):

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

এখানে, scaleফিল্টারটি যদি ইনপুট ভিডিওটির চেয়ে বড় হয় তবে 1280 × 720 এ স্কেল করে। এটি যদি ছোট হয় তবে এটি উপুড় করা হবে না। padফিল্টার লক্ষ্য আকার থেকে তার অনুপাত বা আকার পৃথক 1280 × 720 আউটপুট ভিডিও এনে ক্ষেত্রে প্রয়োজনীয়।


পুরানো ffmpeg সংস্করণ সহ, কিছুটা হ্যাকি ওয়ার্কারআউন্ড রয়েছে। প্রথমে আপনার আউটপুটটির প্রস্থ, উচ্চতা এবং দিক অনুপাত নির্ধারণ করুন। এটি আমাদের কিছু টাইপ করে সংরক্ষণ করবে।

width=640; height=360
aspect=$( bc <<< "scale=3; $width / $height") # <= floating point division

এখন, জিম ওয়ারোরাল লিখেছেন যে সুপার কমপ্লেক্স ফিল্টার কমান্ডটি প্রয়োগ করি :

ffmpeg -i input.mp4 -vf "scale = min(1\,gt(iw\,$width)+gt(ih\,$height)) * (gte(a\,$aspect)*$width + \
lt(a\,$aspect)*(($height*iw)/ih)) + not(min(1\,gt(iw\,$width)+gt(ih\,$height)))*iw : \
min(1\,gt(iw\,$width)+gt(ih\,$height)) * (lte(a\,$aspect)*$height + \
gt(a\,$aspect)*(($width*ih)/iw)) + not(min(1\,gt(iw\,$width)+gt(ih\,$height)))*ih" \
output.mp4

আমি এগুলি কী করে তা বোঝাতে সত্যিই যাব না, তবে মূলত আপনি কোনও ভিডিও ফিড করতে পারেন এবং এটি কেবল ডাউনস্কেলেই হবে, আপস্কেল নয়। আপনি যদি এটির জন্য প্রস্তুত থাকেন তবে আপনি ফিল্টারটিকে তার পৃথক প্রকাশগুলিতে বিচ্ছিন্ন করতে পারেন। এটি সংক্ষিপ্ত করা সম্ভব হতে পারে তবে এটি সেইর মতো কাজ করে।


1
+1 তবে এটি হ'ল সত্যই এক ভয়ঙ্কর আদেশ: পি
দুষ্টুমি 21

আমি ঠিক জানি? আমি দশ মিনিট এটিকে যৌক্তিক অংশগুলিতে ভাঙ্গার চেষ্টা করেছি এবং তার পরে কিছু মান সন্নিবেশ করলাম তবে আমি হাল ছেড়ে দিয়েছি। এটি কিছুটা পুরানো এবং সম্ভবত এটির চেয়ে অনেক বেশি সংক্ষিপ্তভাবে এটি লেখা সম্ভব।
slhck

14

আরও পঠনযোগ্য সংস্করণ নীচের মত দেখতে পাওয়া যায়:

-filter_complex "scale=iw*min(1\,min(640/iw\,360/ih)):-1"

640 / iw অনুভূমিক স্কেলিং ফ্যাক্টর এবং 360 / ih উল্লম্ব স্কেলিং ফ্যাক্টর

আপনি আউটপুট বাক্সের ভিতরে স্কেল করা চিত্রটি ফিট করতে এবং (স্টোরেজ) দিক অনুপাত রাখতে চান। আপনি সর্বনিম্ন ফাংশন সহ ক্ষুদ্রতম স্কেলিং ফ্যাক্টরটি নির্বাচন করে এটি করেন: মিনিট (640 / iw, 360 / ih)

আপনি যে কোনও আপস্কেলিং (যেমন একটি স্কেলিং ফ্যাক্টর> ০.০) প্রতিরোধ করতে চান যাতে আপনি আরও একটি ন্যূনতম ফাংশন যুক্ত করেন: মিনিট (1, মিনিট (640 / iw, 360 / ih))

পরবর্তী পদক্ষেপটি ইনপুট-প্রস্থ এবং ইনপুট-উচ্চতার সাথে স্কেলিং-ফ্যাক্টরকে গুণ করে আউটপুট রেজোলিউশন গণনা করা হয়:
আউটপুট-প্রস্থ = iw * মিনিট (1, মিনিট (640 / iw, 360 / ih))
আউটপুট-উচ্চতা = ih * মিনিট (1, মিনিট (640 / iw, 360 / ih))

শেষ পদক্ষেপটি ফিল্টার কমান্ডটি তৈরি করা। আউটপুট-উচ্চতা নির্দিষ্ট করার দরকার নেই, আপনি -1 নির্দিষ্ট করতে পারবেন এবং ffmpeg প্রস্থের মতো একই স্কেলিং ফ্যাক্টরটি প্রয়োগ করে অনুপাতের অনুপাত রাখবে।


এ + বক্সের বাইরে কাজ করে। নির্বাচিত উত্তরের সমাধান দিক অনুপাত সংরক্ষণ করে না । এটি ফ্রেমগুলি চেপে ধরেছিল।
287352

5

আমারও একই সমস্যা ছিল, তবে 640x640 স্কোয়ারে ভিডিওটি ফিট করে সমাধান করা হয়েছে (স্মার্টফোনের সাহায্যে উল্লম্ব ভিডিওগুলির কারণে)।

সুতরাং ইমারজি যুক্তি এবং কিছু গবেষণা ব্যবহার করে আমি এটি দিয়ে শেষ করব:

-vf "scale=iw*min(1\,if(gt(iw\,ih)\,640/iw\,(640*sar)/ih)):(floor((ow/dar)/2))*2"

শেষ অংশটি উচ্চতা 2 দিয়ে বিভাজ্য হওয়ার জন্য যা অনেক এনকোডারদের প্রয়োজন।

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