FFmpeg ব্যবহার করে প্রতিটি সমতুল্য বা বিজোড় ফ্রেম ফেলে দিন?


14

কাঁচা ভিডিও নেওয়ার এবং এর থেকে নতুন ভিডিও বের করার কোনও সঠিক উপায় আছে যেখানে কেবল বিজোড় ফ্রেম বা এমনকি ফ্রেম (পছন্দ অনুসারে) রয়েছে?

উদাহরণ স্বরূপ:

আমার 400 টি ফ্রেম (0-399) সহ "ব্লাহ.ইউভ" রয়েছে। আমি "blahOdd.yuv" তৈরি করতে চাই যাতে ফ্রেম 1-39999 (1,3,5,7 ... 399) এবং "ব্লেভেন" ফ্রেমে 0-398 থাকে (0,2,4,6 ... 398 )।

কোনও ধারণা কীভাবে এটি কেবল এফএফপিপে ব্যবহার করে করবেন?

উত্তর:


11

সঠিকভাবে কাজ করতে, প্রথমে ভিডিওটি RAW YUV বিটস্ট্রমে রূপান্তর করুন (যদি এটি ইতিমধ্যে না থাকে):

ffmpeg -i input.mp4 -an -vcodec rawvideo -pix_fmt yuv420p rawbitstream.yuv

পরবর্তী পদক্ষেপ: selectফিল্টারটি একটি অভিব্যক্তি নেয় , nফ্রেমের সংখ্যাটি কোথায় ।

ffmpeg -r 2 -s WxH -i rawbitstream.yuv -filter:v select="mod(n-1\,2)" \
-c:v rawvideo -r 1 -format rawvideo -pix_fmt yuv420p -an odd.yuv

ffmpeg -r 2 -s WxH -i rawbitstream.yuv -filter:v select="not(mod(n-1\,2))" \
-c:v rawvideo -r 1 -format rawvideo -pix_fmt yuv420p -an even.yuv

ffmpegফ্রেমের সদৃশ না করার জন্য আপনাকে আপনার ইনপুটটির ফ্রেমরেটের অর্ধেক জোর করতে হবে - সুতরাং আপনি ইনপুট হিসাবে "2" এবং আউটপুটে "1" সেট করবেন। আপনার ক্লিপের আসল মাত্রাগুলির সাথে ডাব্লুএক্সএইচ প্রতিস্থাপন করতে ভুলবেন না কারণ কাঁচা বিটস্ট্রমে এই তথ্য বহন করে এমন শিরোনাম নেই।

উপরের পরিবর্তে, আর একটি সম্ভাবনা setptsহ'ল আউটপুটটির জন্য নতুন টাইমস্ট্যাম্প সেট করতে ফিল্টার যুক্ত করা। তবে সাবধান থাকুন যেহেতু এটি ফ্রেমগুলি সঠিকভাবে না ফেলে। এখানে 25 হ'ল আসল আউটপুট ফ্রেম হার যা আপনি চান:

ffmpeg -i input.mp4 -filter:v select="mod(n-1\,2)",setpts="N/(25*TB)" \
-c:v rawvideo -r 12.5 -format rawvideo -pix_fmt yuv420p -an odd.yuv

ffmpeg -i input.mp4 -filter:v select="not(mod(n-1\,2))",setpts="N/(25*TB)" \
-c:v rawvideo -r 12.5 -format rawvideo -pix_fmt yuv420p -an even.yuv

আপনি অবশ্যই অন্য একটি পিক্সেল ফর্ম্যাট (যে কোনও ffmpeg -pix_fmts) চয়ন করতে পারেন । নিশ্চিত করুন যে ফাইলটি পড়ার সময় আপনি পিক্সেল আকার এবং পিক্সেল ফর্ম্যাটটি জানেন:

ffmpeg -f rawvideo -s:v 1280x720 -pix_fmt yuv420p input.yuv …

ধন্যবাদ, এফএফএমপিইগের নতুন সংস্করণগুলির জন্য এটি ফিল্টার: ভি এর পরিবর্তে -vf হওয়া উচিত। এছাড়াও এটি মোড হওয়া উচিত (n-1 2, 2) কারণ এন গণনা 1 থেকে শুরু হবে বলে মনে হচ্ছে ফ্রেম গণনা 0 থেকে (অন্যথায় প্রথম ফ্রেমটি 3 বার নকল হয়েছে)। তবে এখনও একটি সমস্যা আছে, আমি ফ্রেমগুলি সেগুলি থেকে মুক্তি দিতে চাইলে এটি সদৃশ করে - উদাহরণস্বরূপ চূড়ান্ত ক্লিপটিতে ফ্রেমের অর্ধেক অংশ থাকবে।
চিহ্নিত করুন

-vfএর একটি উপনাম -filter:v। আমি এখন এটি নির্ভরযোগ্যভাবে পরীক্ষা করতে পারি না, তবে আমি আমার মেশিনে ফিরে এলে পরে এটি খতিয়ে দেখব। tinterlaceফিল্টার কি একই কাজ করতে পারে ?
slhck

আমি '-r 2 -i blah.yuv -r 1' চেষ্টা করেছি তবে এটি আমাকে একটি ত্রুটি দেখায় বিকল্প অপশন ফ্রেমরেট পাওয়া যায় নি।
চিহ্নিত করুন

আহ দুঃখিত .. এটি স্ক্র্যাচ করুন যে, এটি কাজ করে না (আর?) এবং কেবল চিত্রগুলির জন্য।
slhck

1
@ আনমোলসিংহ জাগি না, এটি কেবল ফ্রেমগুলি ফেলেছে, তবে আমি নিশ্চিত হতে পারি না যে এটি এতটাই নির্মাতারা (যেমন, প্রতিটি বিজোড় ফ্রেমটি ফেলে দেয়)। এটি সময় কোডের উপর ভিত্তি করে তৈরি হবে, যা সঠিক নাও হতে পারে।
slhck

2

যদি আপনার ffmpegটি অ্যাভিআইসেন্ট পতাকা সহ নির্মিত হয়েছিল, তবে আমি বিশ্বাস করি আপনি একটি .avsফাইল পাস করতে পারেন ।

আপনি চালিয়ে পরীক্ষা করতে পারবেন ffmpegএবং খুঁজছেন --enable-avisynthমধ্যে কনফিগারেশন তথ্য। --enable-avisynth

তাহলে এটা সেখানে যদি আপনি এটি তাই মত ব্যবহার করতে পারেন: ffmpeg -i blahEven.avs blahEven.yuv

যেখানে blahEven.avsসহজভাবে:

ffvideosource ( "blah.yuv")। SelectEven ()

বিজোড় ফ্রেমের জন্য, ব্যবহার করুন SelectOdd()

আরও উন্নত ব্যবহারের জন্য, সিলেক্ট্রি ডকুমেন্টেশন দেখুন।


এটি একটি দুর্দান্ত বিকল্প, তবে যেমনটি আমি উল্লেখ করেছি - আমি কেবল ffmpeg ব্যবহারের মধ্যে সীমাবদ্ধ। এর কারণ হ'ল এটি একটি স্বয়ংক্রিয় সিস্টেমের একটি অংশ যা কেবলমাত্র .bat ফাইল তৈরি করবে, সংযোজন এভিএসের কোনও সম্ভাবনা নেই।
চিহ্নিত

@ মার্ক আমি ভাবছিলাম যে যদি --enable-avisynthসেখানে থাকে তবে এর অর্থ অভিসিন্থ ffmpeg হিসাবে নির্মিত হয়েছিল, তবে আমি সে সম্পর্কে নিশ্চিত নই।
লুই 18
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.