স্থির আকারের প্লেয়ারের সাথে ফিট করার জন্য এফএফএমপিগ / অ্যাভকনভি সহ ভিডিওগুলির আকার পরিবর্তন করা


65

আমার কাছে এইচটিএমএল 5 ভিডিও প্লেয়ার রয়েছে যা 700px প্রশস্ত, 400px উচ্চ। আমি avconvপুনরায় আকার দিতে (দিকের অনুপাত বজায় রেখে) ffmpeg ব্যবহার করার চেষ্টা করছি এবং এটি আমার প্লেয়ারের সাথে খাপ খায় তা নিশ্চিত করে নিচ্ছি।

ইনপুট যে কোনও আকারের ফাইল হতে পারে, তাই আমার আরও বড় আকারগুলির আকার পরিবর্তন করতে হবে তবে কালো বারগুলির সাহায্যে ছোট ছোটকে কেন্দ্র করতে হবে। এখন পর্যন্ত আমি চেষ্টা করেছি: -sএবং -aspect, আমি স্যুইচটি padব্যবহার করতে দেখেছি -vfতবে বুঝতে হবে না যে এটি আমার কী প্রয়োজন তা পেতে যথেষ্ট কাজ করে।

চিত্র

এটি আমার যা প্রয়োজন তা মোটামুটি ধারণা। আমি এমনকি নিশ্চিত কিনা। এটি প্রায় CSS এর সর্বোচ্চ-প্রস্থ / সর্বোচ্চ-উচ্চতার মতো। আমি বুঝতে পারি এটি কেবল শব্দের এক ঝাঁকুনি হতে পারে তবে যদি আমি বুঝতে পারি যে আমি কী সম্পর্কে কথা বলছি তবে আমি সাহায্যের প্রশংসা করব, ধন্যবাদ।

avconv কমান্ড:

avconv -y -i control.avi -vcodec libx264 -b 2000k -bufsize 20M -acodec aac -strict experimental -ar 44100 -ab 256k bigbuck_out.mp4


4
আমি পরে উত্তর লিখব, তবে আমি ভেবেছিলাম যে আমি নিম্নলিখিতগুলি উল্লেখ করব: কেবল স্থির স্তম্ভ- বা লেটারবক্সিং যুক্ত করতে একটি ভিডিও পুনরায় এনকোড করা একটি ভয়ানক ধারণা। কেবলমাত্র আপনি এই প্রক্রিয়াতে গুণমান হারাবেন না (বা অযথা ফাইলের আকার বাড়িয়ে তুলবেন), তবে পরে বারগুলি থেকে মুক্তি পাওয়াও অসম্ভব করে ফেলবেন। আদর্শভাবে আপনার প্লেয়ারটি কেবল এটির যত্ন নেওয়া উচিত এবং ভিডিওটি প্রদর্শন করার সময় তাকে আকার পরিবর্তন করতে হবে। আমি যদি জিজ্ঞাসা করতে পারি তবে আপনার ব্যবহারের ক্ষেত্রে কী?
slhck

আমরা আসল ফাইলটি একটি এস 3 বাল্টিতে স্ট্যাশ করি, যাতে কোনও সমস্যা হয় না, এবং আমরা ভিডিও ধরণের একটি বিশাল স্কোপ গ্রহণ করার সাথে সাথে আমরা পুনরায় এনকোডিং করছি, এর সবগুলিই এইচ .264 এমপি 4 ফাইল হিসাবে স্ট্রিমিংয়ের জন্য উপযুক্ত হিসাবে শেষ হতে হবে একটি ব্রাউজার সুতরাং আপনি ভিডিওটির আকার পরিবর্তন এবং তারপরে এইচটিএমএল / সিএসএস স্তম্ভ / লেটারবক্স তৈরির পরামর্শ দিচ্ছেন? ধন্যবাদ
জেমি টেলর

1
গৃহীত উত্তরের মালিক হিসাবে আমি আপনাকে আমার পোস্টটি অ-স্বীকার করার পরিবর্তে এবং লর্ডনেকবেয়ার্ডের উত্তরটি গ্রহণ করার পরামর্শ দিচ্ছি, কারণ এটি সর্বাধিক সাম্প্রতিক এবং খুব সহজ।
slhck

@ এসএলএইচইচকি, আমি এটি বিবেচনা করছিলাম, আপনার আশীর্বাদ দিয়ে, আমি এটি তৈরি করব।
জেমি টেলর

উত্তর:


51

একটি সহজ পদ্ধতি স্কেল ফিল্টারেforce_original_aspect_ratio বিকল্পটি ব্যবহার করা ।

মূল চিত্র
আসল চিত্র। একটি 640x480, 4: 3 আকৃতির অনুপাতের ভিডিওটি উপস্থাপন করে।

এই উদাহরণগুলিতে মূল চিত্রটি মূল দিক অনুপাত সংরক্ষণ করার সময় 16: 9 টি অনুপাতের আউটপুট ফিট করতে স্কেল করা হবে। এটি করতে আপনি হয় করতে পারেন:

পিলারবক্স বা লেটারবক্স

স্তম্ভবক্সযুক্ত চিত্র
স্তম্ভবক্সযুক্ত চিত্র 1280x720 (16: 9) আউটপুটটিতে একটি 640x480 (4: 3) ইনপুট ফিট করা।

ffmpeg -i input -vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2" output
  • এটি চিত্রটিকে উপুড় করে তুলবে। আপনি যদি উপড়ে যাওয়া এড়াতে চান তবে নীচের উদাহরণটি দেখুন।

  • লেটারবক্সিং এর পরিবর্তে ঘটবে যদি আউটপুট দিক অনুপাতের চেয়ে ইনপুট দিক অনুপাত বিস্তৃত হয়। উদাহরণস্বরূপ, একটি 16: 9 আউটপুট 2 2.35: 1 আকৃতির অনুপাত সহ একটি ইনপুট লেটারবক্সিংয়ের ফলস্বরূপ।

উপরের মত একই কিন্তু আপসেলিং ছাড়াই

কোন upscaling
680x480 (4: 3) 1280x720 (16: 9) আউটপুট ছাড়াই ইনপুট।

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

ফসল

এখানে চিত্র বর্ণনা লিখুন
ফসলযুক্ত চিত্র। 4: 3 ইনপুট দিক অনুপাত, 16: 9 আউটপুট দিক অনুপাত।

ffmpeg -i input -vf "scale=1280:720:force_original_aspect_ratio=increase,crop=1280:720" output

এবং আমার জন্য একটি ফাঁকা ফিল যোগ করুন?
টিয়াগো ফেরেজিন

@ টিয়াগোফেরজিন একটি "ফাঁকা ফিল" কি?
লোগান

ওহ দুঃখিত, কালো রঙের পরিবর্তে অন্য রঙটি পূরণ করুন
টিয়াগো ফেরেজিন

2
@ টিয়াগোফেরেজিন আহ, হ্যাঁ করাটা সহজ. প্যাড ফিল্টার ব্যবহার করে এমন উদাহরণগুলিতে আপনি colorবিকল্পটি যুক্ত করতে পারেন , pad=1280:720:(ow-iw)/2:(oh-ih)/2:color=red(বা আপনি যদি চান তবে আপনি হেক্সাডেসিমেল ব্যবহার করতে পারেন)। রঙের তালিকা দেখুন ।
লোগান

61

এখানে নির্ধারিত কমান্ডটি নির্দিষ্ট আউটপুট প্রস্থের জন্য স্তম্ভ- বা লেটারবক্সিং যুক্ত করবে। এটি একটি দীর্ঘ লম্বা, তবে আপনাকে কোনওভাবে প্যাডিং নির্দিষ্ট করতে হবে।

প্রথমত, আপনার শেলের মধ্যে আউটপুট প্রস্থ এবং উচ্চতা নির্ধারণ করা হয়:

width=700
height=400

তারপরে কমান্ডটি চালান:

ffmpeg -i in.mp4 -filter:v "scale=iw*min($width/iw\,$height/ih):ih*min($width/iw\,$height/ih), pad=$width:$height:($width-iw*min($width/iw\,$height/ih))/2:($height-ih*min($width/iw\,$height/ih))/2" out.mp4

এটি পুনরায় আকার এবং প্যাড করার জন্য প্রয়োজনীয় খালি প্রয়োজনীয় জিনিসগুলিতে নামিয়ে দেওয়া হয়েছে you আপনি উপযুক্ত হিসাবে দেখেন আপনার অন্যান্য ভিডিও এবং অডিও বিকল্পগুলি যুক্ত করুন। উল্লেখ্য যে জন্য নম্বর widthএবং heightঅর্ডার সবচেয়ে কোডেক জন্য কাজ করতে আপনাকে 2 দ্বারা বিভাজ্য হতে হবে।

কী চলছে তার ব্যাখ্যা এখানে:

  • স্কেলিং:
    • প্রস্থ বা উচ্চতা অনুসারে স্কেল করা হবে কিনা তা আগে আমাদের খুঁজে বের করতে হবে।
    • এটি করার জন্য, আমরা ইনপুট প্রস্থকে আউটপুট প্রস্থ এবং ইনপুট উচ্চতার দ্বারা আউটপুট উচ্চতা ভাগ করব। এটি আমাদের প্রতিটি মাত্রার জন্য স্কেল ফ্যাক্টর দেবে।
    • তারপরে আমরা কোনটি নীচে (তার সাথে min()) কম তা যাচাই করি এবং পুনরায় আকার দেওয়ার জন্য কেবল সেই ফ্যাক্টরটিই চয়ন করি।
    • শেষ পর্যন্ত, আমরা ফ্যাক্টর ( iw*min(…):ih*min(…)) দ্বারা ইনপুট প্রস্থ এবং উচ্চতা উভয়কেই গুণ করি ly
  • প্যাডিং:
    • $width:$height আউটপুট প্রস্থ এবং উচ্চতা হয়
    • ফলস্বরূপ ভিডিওটি কোথায় রাখবেন তা নির্ধারণের জন্য, আমাদের সর্বাধিক আউটপুট প্রস্থ থেকে স্কেল করা প্রস্থ এবং সর্বোচ্চ আউটপুট উচ্চতা থেকে স্কেলড উচ্চতা বিয়োগ করতে হবে।
    • পরিমাপকৃত প্রস্থ এবং উচ্চতাগুলি scaleফিল্টার থেকে প্রকাশ ।
    • আমরা উভয় পক্ষের সীমানা যুক্ত করতে ফলস্বরূপ অফসেটটিকে 2 দ্বারা বিভক্ত করি।

3
@ জ্যামি টেলর -movflags +faststartস্লহকের উদাহরণে যোগ করার বিষয়ে বিবেচনা করুন । এটি আপনার ধীরে ধীরে ডাউনলোড করা ভিডিওটিকে সম্পূর্ণ ডাউনলোড হওয়ার আগে প্লেব্যাক শুরু করার অনুমতি দেবে এবং আরও এনকোডিংয়ের নির্দেশাবলী এবং উদাহরণগুলির জন্য এফএফপিপেগ এবং এক্স 264 এনকোডিং গাইড এবং এফএফপিজেগ এবং এএসি এনকোডিং গাইডও দেখতে পাবে ।
লগন

আপনি এটিতে প্যাড ফিল্টারটি সংক্ষিপ্ত করতে পারেন, আমি মনে করি:pad=$width:$height:(ow-iw)/2:(oh-ih)/2"
jdi

1
@jdi এই যদি ডাউনস্কেলিং হয় কাজ করবে না, কারণ এটি জন্য নেতিবাচক ফলে মান করব ow-iw
slhck

শুরুর দিকের জন্য ধন্যবাদ! তবে, নমুনা আকৃতির অনুপাত সহ ভিডিওগুলির জন্য একটি সঠিক দিক অনুপাত পেতে! = 1, "আইডাব্লু" এর প্রতিটি ঘটনাকে "সর" দ্বারা গুণিত করা দরকার, সুতরাং "আইডাব্লু" এর প্রতিটি ঘটনাকে "(সার * আইডাব্লু) এর সাথে প্রতিস্থাপন করুন" ফিল্টার এক্সপ্রেশন আমার জন্য কাজ করে।
শিফার্সট্যাপেল

@ এসএলএইচএইচকি আরে, আমি অ্যান্ড্রয়েডে চেষ্টা করছি কিন্তু এটি কাজ করছে বলে মনে হচ্ছে না, আপনি কি আমাকে এটিতে সাহায্য করতে পারেন !!! ffmpeg -i ইনপুট.এমপি 4-ফিল্টার: ভি স্কেল = 640 * মিনিট (700 / 640,400 / 360): 360 * মিনিট (700 / 640,400 / 360), প্যাড = 700: 400: (700-640 * মিনিট (700 / 640,400) / 360)) / 2 (400-360 * সর্বনিম্ন (700 / 640.400 / 360)) / 2 output.mp4
Nisarg

8

আমার কাছে মনে হচ্ছে আপনার তিনটি ধাপে এটি করা দরকার:

  1. ইনপুট দিক অনুপাত পরীক্ষা করুন
  2. একটি ড্যার> 7/4 প্রস্থ অনুসারে ভিডিও স্কেল করুন (প্রস্থটি 700 কে প্রস্থে পরিবর্তন করুন এবং দিক অনুপাত রাখতে উচ্চতা স্কেল করুন) এবং ডিআর <7/4 উচ্চতা অনুসারে স্কেল করুন
  3. ভিডিওটি এমনভাবে প্যাড করুন যাতে এটি 700: 400 স্পেসে ফিট করে।

FFmpeg / avconv শুধুমাত্র একবার ট্রান্সকোডিং করে একক পদক্ষেপে ভিডিও ফিল্টারগুলি দিয়ে স্কেলিং / প্যাডিং করতে পারে। উদাহরণস্বরূপ, একটি 16: 9 ভিডিও নিতে, এটি প্রস্থ অনুসারে স্কেল করুন এবং তারপরে ফলাফলগুলি লেটারবক্স করুন:

ffmpeg -i input.avi -filter:v 'scale=700:-1,pad=700:400:(ow-iw)/2:(oh-ih)/2' \
-c:v libx264 -b:v 2000k -bufsize 20M -c:a aac -strict experimental -ar 44100 -b:a 256k output.mp4

... তবে প্রথম পদক্ষেপের জন্য (দিক অনুপাতটি সনাক্তকরণ এবং এটি আপনার প্রয়োজন 7: 4 এর সাথে তুলনা করে) আপনাকে কোনও ধরণের স্ক্রিপ্ট ব্যবহার করতে হবে।

ffprobe input.avi 2>&1 | sed -n '/Video:/s/.*DAR \([0-9]*:[0-9]*\)].*/\1/p'

... আপনাকে ভিডিওর দিক অনুপাত দেবে, যা '16: 9 'বা' 4: 3 'এর মতো দেখাবে। ব্যাশ স্ক্রিপ্টে, আমি এরকম কিছু ব্যবহার করব:

#!/bin/bash

##  Get the aspect ratio in the form x/y
dar=$(ffprobe test0.mp4 2>&1 | sed -n '/Video:/s/.*DAR \([0-9]*:[0:9]*\)].*/\1/p' | sed 's|:|/|')
##  use bc to do x/y*100 (bash can't handle floats)
DAR=$(bc <<< 'scale=2; $dar*100')

##  ${DAR%.00} will remove the trailing .00 left by bc
if [ ${DAR%.00} -ge 175 ]; then
    ffmpeg -i "$1" -filter:v 'scale=700:-1,pad=700:400:(ow-iw)/2:(oh-ih)/2' \
    -c:v libx264 -b:v 2000k -bufsize 20M -c:a aac -strict experimental -ar 44100 -b:a 256k "${1%.*}.mp4
else
    ffmpeg -i "$1" -filter:v 'scale=-1:400,pad=700:400:(ow-iw)/2:(oh-ih)/2' \
    -c:v libx264 -b:v 2000k -bufsize 20M -c:a aac -strict experimental -ar 44100 -b:a 256k "${1%.*}.mp4
fi

exit 0

অবশ্যই আপনাকে এটি আপনার প্রয়োজনের সাথে খাপ খাইয়ে নিতে হবে।


1
যদিও একক পদক্ষেপে এটি করা সম্ভব, আমার উত্তর দেখুন।
6:38

@slhck এখন এটি আরও সহজ। গিটার-মাল্ট দিয়ে উত্তর দেখুন।
লগন

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