Ffmpeg নির্বাচন ফিল্টার দিয়ে সঠিক ফ্রেমে ভিডিও কাটা


16

প্যারামিটারগুলি ব্যবহার -ssএবং -toসন্ধানের পরিবর্তে , যা খুব সঠিক বলে মনে হচ্ছে না, আমি কি প্রদত্ত ফ্রেম সংখ্যার জন্য ভিডিওগুলি কাটতে পারি? উদাহরণ স্বরূপ;

ffmpeg -i video.webm -startingframe 80 -endingframe 560 output.webm

[৮০ তম ফ্রেম এবং 560 তম ফ্রেম অন্তর্ভুক্ত। সুতরাং, মোট হিসাবে এটি (560 - 80 +1) ফ্রেম তৈরি করে]

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

যদি কেউ 250 তম এবং 750 তম ফ্রেমের মধ্যে ভিডিও স্ট্রিমটি কাটাতে চায় তবে এটি যাওয়ার উপায়। এটি আউটপুট হিসাবে 501 ফ্রেম দেবে:

দ্রষ্টব্য: মুভি.এমপি 4 এর 25 এফপিএস রয়েছে এবং এর অডিও নমুনা হার 48 কে k

ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm

যেমনটি প্রত্যাশিত, আউটপুটটি 20 সেকেন্ড দীর্ঘ, হুবহু।

অডিওর জন্য একই পদ্ধতি ব্যবহার করা:

ffmpeg -i movie.mp4 -vn -af "aselect=between(n\,480\,1440),setpts=PTS-STARTPTS" a_stream.webm

অপ্রত্যাশিতভাবে, এটির খুব কম নির্ভুলতা রয়েছে। এটি আমাকে 960001 (960 কে + 1) নমুনা দেওয়া উচিত যা 20 সেকেন্ডের অডিও সমান। তবে পরিবর্তে, আউটপুটটি 20.505 সেকেন্ড দীর্ঘ এবং 984240 নমুনা রয়েছে। এছাড়াও, আমি যদি সময়কাল বৃদ্ধি করি তবে ত্রুটিও বৃদ্ধি পায়।

তারপরে আমি অডিও স্ট্রিমটি কাটানোর জন্য -ss-to পরামিতিগুলি ব্যবহার করার চেষ্টা করেছি:

ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm

পুরানো ক্লাসিক উপায় আরও ভাল কাজ করে। আউটপুট 20.003 সেকেন্ড দীর্ঘ ছিল এবং 960144 নমুনা রয়েছে। এছাড়াও, ক্রমবর্ধমান সময়কাল ত্রুটি বৃদ্ধি করে না, ত্রুটিটি স্থির থাকে, input ইনপুট ফাইলের সাথে সর্বদা 144 নমুনা উদ্বৃত্ত থাকে।

selectসারাংশ : ফিল্টার বেশিরভাগ সময় ভাল কাজ করে তবে একটি নির্বাচন হয় না select ক্লাসিক -ssপরামিতি অডিওর জন্য আরও ভাল কাজ করে তবে নমুনা-নির্ভুল নয়। এছাড়াও, একসাথে ব্যবহার -vf selectএবং -ssপরামিতিগুলি সম্ভব নয় , কারণ -ssআমরা চাইলে এটি কেবল অডিওকেই প্রভাবিত করে যখন অডিও এবং ভিডিও উভয় স্ট্রিমকেই প্রভাবিত করবে।

সুতরাং, মিডিয়া ফাইলটি অবশ্যই কাটাতে আমাকে এই 3 টি পদক্ষেপটি করতে হবে:

ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm 
ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm 
ffmpeg -i v_stream.webm -i a_stream.webm -c:v copy -c:a copy  movie-between_10th_and 20th_seconds.webm

এটি সবচেয়ে সঠিক ফলাফল দেয়। ভিডিওটি 20.000 সেকেন্ড দীর্ঘ এবং ফ্রেম-অ্যাকিউর্ট অডিও 20.003 সেকেন্ড লম্বা এবং 960144 নমুনা রয়েছে। ভিডিও স্ট্রিমের সাথে ঠিক মেলে না তবে এটি ঠিক আছে। এখানে মাত্র ১৪৪ টি নমুনা উদ্বৃত্ত রয়েছে। সবচেয়ে বড় ক্ষতিটি হ'ল, যখনই আমি কোনও ফাইল কাটতে চাই, আমাকে একটি সাধারণ কাজের জন্য 3 টি কমান্ড প্রেরণ করতে হয় এবং এটি দুটি অপ্রয়োজনীয় ফাইল তৈরি করে: a_stream.webm এবং v_stream.webm। এবং selectফিল্টারটি চেষ্টা করেছি এমন কিছু ইনপুট ফাইলগুলিতে কাজ করছে না। এটি সফলভাবে কাজটি (?) করে তবে এনকোডিং প্রক্রিয়াটি কখনও থামায় না, তাই আমাকে প্রতিবার কমান্ড প্রম্পটটি বন্ধ করতে হবে।


আমি এই প্রশ্নটি পোস্ট করার আগে আমি পৃষ্ঠাটি পড়েছি। এই পৃষ্ঠাটি আমাকে সাহায্য করেনি। যদি কোনও ইনপুটটির পরিবর্তনশীল fps থাকে আমরা সেই সমীকরণটি ব্যবহার করে কী সহজেই গণনা করতে পারি? আমি তাই মনে করি না। তবুও আমি ভাবি না যে '-এসএস' আমাকে সঠিক অবস্থান দেবে। ফ্রেম সন্ধানের মাধ্যমে ফ্রেমটি আমার ধারণা ভাল।
গন্তব্য

নোটটি -ssফ্রেম-নির্ভুল ( এখানে দেখুন )। আপনার কি আসলে ভেরিয়েবল-এফপিএস ইনপুট রয়েছে? আমার উত্তর মেইলিং তালিকা থ্রেডে selectফিল্টারগুলি ব্যবহার করে যেখানে আপনি ফ্রেম নম্বর নির্দিষ্ট করতে পারেন তা উল্লেখ করে। আপনি কি চেষ্টা করেছেন?
18:25

আমি ভিডিও এবং অডিও স্ট্রিম ব্যবহার selectএবং aselectফিল্টার চেষ্টা করেছি । Selectভিডিওর জন্য ফ্রেম-নির্ভুল, তবে aselectনমুনা-সঠিক নয়। আসলে এটি নির্ভুল হওয়া অনেক দূরে। এটি সাধারণ -ss -toপরামিতিগুলি ব্যবহার করার চেয়ে আরও খারাপ ফলাফল দেয় । যে কারণে, আপাতত, আমি সবচেয়ে নির্ভুল কাটিয়া অর্জনে selectফিল্টার এবং -ss -toপরামিতিগুলির সংমিশ্রণ ব্যবহার করি । তবে এটি করার একটি grungy উপায়। দয়া করে আমার প্রথম পোস্টটি দেখুন আমি কিছু
কমান্ডলাইন

ffmpeg সংস্করণ?
fie

আপনি যেভাবে কোনও ফ্রেম নম্বর দিয়ে কাটতে চেষ্টা করছেন। যদি সেই ধরণের নির্ভুলতার প্রয়োজন হয় তবে অ্যাভিডেমাক্স ব্যবহার করবেন না কেন? এছাড়াও আপনার মূল সমস্যাগুলি হ'ল কারণ এটি নিকটতম কী ফ্রেমটি নির্বাচন করে?
fie

উত্তর:


3

অডিও সেকেন্ড থেকে আসে ফ্রেম নয়, তাই আপনি কোনও ভিডিও কাটতে চাইলে আপনাকে ভিডিও fps × 20 সেকেন্ডের মতো গণনা করতে হবে: 23.97 fps = 479.4 এর 20 সেকেন্ড

ফ্রেম কাটিয়াটি সঠিক নয় কারণ আপনি শেষ দ্বিতীয়টির জন্য পুরো fps পেতে পারবেন না, তাই অডিওটি আরও সেকেন্ডে পাবে বা মাত্র দেড় সেকেন্ড বা কিছুটা কম বা কম! সঠিক কাটা পেতে ফ্রেমের পরিবর্তে আপনার সেকেন্ড ব্যবহার করা উচিত আপনি ffmpeg কে এটি করার জন্য বলুন। এবং যদি আপনি 1 টি অতিরিক্ত ফ্রেম পান তবে 250 তম এবং 750 তম ফ্রেমকে 250 তম এবং 749 তম ফ্রেমে কী পরিবর্তন করবেন?! আপনি সর্বদা কত ফ্রেম চাইবেন তা পেতে সর্বদা সেখানে বিয়োগ 1 ব্যবহার করুন!


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