FFmpeg এর সাথে প্রদত্ত টাইমস্ট্যাম্পের আগে নিকটতম কীফ্রেমের টাইম স্ট্যাম্প কীভাবে পাবেন?


18

আমি একটি এফএফম্পেগ চাইছি দ্রুত এবং নির্ভুল কমান্ড চাই। আমি দেখেছি এই

সমাধানটি হ'ল আমরা -ssইনপুট (দ্রুত সন্ধানী) এবং আউটপুট (সঠিক অনুসন্ধান) উভয়ের জন্য আবেদন করি । তবে: ইনপুট সন্ধানটি যদি সঠিক না হয় তবে আমরা কীভাবে নিশ্চিত হতে পারি যে সন্ধানের অবস্থানটি সঠিক?


উদাহরণস্বরূপ: আমরা যদি সন্ধান করতে চাইতাম 00:03:00, আদেশটি হ'ল কিছু:

ffmpeg -ss 00:02:30 -i <INPUT> ... -ss 00:00:30 <OUTPUT>

প্রথমটি -ssঅন্য কোথাও অনুসন্ধান করবে 00:02:30, বলবে না 00:02:31। এবং দ্বিতীয় সেক প্রয়োগের পরে, চূড়ান্ত ফলাফলটি হবে 00:03:01- আমরা যা চাই তা নয় । এটা কি ঠিক?

প্রথম কোথায় -ssসন্ধান করে? এটি কি কীফ্রেমটির সর্বাধিক নিকটবর্তী সন্ধান করছে 00:02:30?

যদি তা হয় তবে এখানে আমার চিন্তা — আমি ভুল হলে আমাকে সংশোধন করুন: প্রথমে সন্ধানের পরে আমরা ফলাফলের টাইমস্ট্যাম্পটি পাই (উদাহরণস্বরূপ 00:02:31:), তবে আমরা এই ক্ষেত্রে যথাযথ সময় সহ দ্বিতীয় চাওয়া প্রয়োগ করি 00:00:29

প্রশ্নটি: আমরা প্রথম সন্ধানের ফলাফলের স্ট্যাম্প কীভাবে পাই?

উত্তর:


18

আক্ষরিকভাবে আপনার শিরোনামের প্রশ্নের উত্তর দিতে: আপনি আই-ফ্রেমের একটি তালিকা পেতে পারেন

ffprobe -select_streams v -show_frames <INPUT> 

আপনি এটি যোগ করে প্রয়োজনীয় আউটপুটটিতে আরও সীমাবদ্ধ করতে পারেন -show_entries frame=pkt_pts_time,pict_type

যা ফ্রেম নিকটস্থ হয় দেখতে (পরে আসে) একটি নির্দিষ্ট টাইমস্ট্যাম্প, আপনি কীফ্রেমগুলি সব টাইমস্ট্যাম্প খুঁজে বের করতে সঙ্গে উদাহরণস্বরূপ প্রথম প্রয়োজন চাই awk

প্রথমে আপনি যে সময়টি দেখতে চান তা নির্ধারণ করুন, উদাহরণস্বরূপ, 2: 30 মিটার যা 150 এর সমান।

ffprobe -select_streams v -show_frames -show_entries frame=pkt_pts_time,pict_type -v quiet in.mp4 | 
awk -F= ' 
  /pict_type=/ { if (index($2, "I")) { i=1; } else { i=0; } } 
  /pkt_pts_time/ { if (i && ($2 >= 150)) print $2; }  
' | head -n 1

উদাহরণস্বরূপ, এটি ফিরে আসবে 150.400000


নোট করুন যে -ssআগে ব্যবহার করার সময় -i, এফএফম্পেগ সন্ধান পয়েন্টের আগের কীফ্রেমটি সনাক্ত করবে , তারপরে সন্ধান বিন্দুতে না পৌঁছানো পর্যন্ত নীচের সমস্ত ফ্রেমে নেতিবাচক পিটিএস মান নির্ধারণ করুন। কোনও প্লেয়ারকে ডিকোড করা উচিত তবে নেতিবাচক পিটিএস দিয়ে ফ্রেম প্রদর্শন করা উচিত নয় এবং ভিডিওটি সঠিকভাবে শুরু করা উচিত।

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

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


1
ধন্যবাদ, আমি কোনও ভিডিও সম্পাদক তৈরি করছি না, তবে আমি এমন একটি সুনির্দিষ্ট ভিডিও চেয়েছি যাতে ফাঁকটি 0,5 সেকেন্ডের চেয়ে কম হওয়া উচিত।
জ্যাকোড

1
আপনি সম্ভবত পিটিএস দিয়ে ঘুরে বেড়াতে পারেন ffprobe। যদি তা না হয় তবে কোনও মধ্যবর্তী ফর্ম্যাটটি করবে, উদাহরণস্বরূপ প্রোরেস 422, ডিএনএক্সএইচডি, যা কেবল দৃষ্টিভঙ্গিহীন এবং কেবলমাত্র অন্তর্-ফ্রেম। অথবা আপনি হাফওয়াইইউভি ইত্যাদির মতো কিছু ব্যবহার করেন তবে অবশ্যই আপনি আবার "দ্রুত" দিকটি হারাবেন।
slhck

কমান্ডের জন্য আপনি ffprobe এর কোন সংস্করণ ব্যবহার করেছেন, কারণ আমার বলেছেUnrecognized option 'select_streams'
জ্যাকোড

2
আপনি কাছাকাছি ছিলেন, select_streamsবিকল্পটি অক্টোবর ২০১২ এ যুক্ত করা হয়েছিল । :) আপনি তা না করে করতে পারেন তবে তারপরে আপনি অডিও ফ্রেমের জন্যও তথ্য পেতে পারবেন, এর মধ্যে মিশ্রিত।
slhck

2
উল্লেখ্য আপনি যে awk দ্বারা দূরে নিক্ষিপ্ত পরার কাপড় অনেকটা বদলে এটি শুধুমাত্র আউটপুট প্রয়োজনীয় 2 ক্ষেত্র দিন এই ffmpeg লাইন যোগ করতে পারেন,: -show_entries ফ্রেম = pkt_pts_time, pict_type
Jannes

7

আমি বুঝতে পারি এই প্রশ্নটি বেশ কয়েক বছর পুরনো, তবে ffprobe এর সর্বশেষ সংস্করণে ফ্রেমগুলি এড়িয়ে যাওয়ার ক্ষমতা রয়েছে । আপনি -skip_frame nokeyকেবল কী ফ্রেমে (আই-ফ্রেম) তথ্য প্রতিবেদন করতে প্রবেশ করতে পারেন । এটি আপনাকে অনেক সময় বাঁচাতে পারে! 2 জিবি 1080 পি এমপি 4 ফাইলে এটি ফ্রেমগুলি এড়িয়ে 4 মিনিট সময় নেয়। স্কিপ পরামিতি যুক্ত করতে এটি কেবল 20 সেকেন্ড সময় নেয়।

COMMAND:

ffprobe -select_streams v -skip_frame nokey- show_frames-show_entries ফ্রেম = pkt_pts_Time, পিকচার_ টাইপ ডি: \ test.mp4

ফলাফল:

[FRAME]
pkt_pts_time=0.000000
pict_type=I
[/FRAME]
[FRAME]
pkt_pts_time=3.753750
pict_type=I
[/FRAME]
[FRAME]
pkt_pts_time=7.507500
pict_type=I
[/FRAME]
[FRAME]
pkt_pts_time=11.261250
pict_type=I
[/FRAME]
[FRAME]
pkt_pts_time=15.015000
pict_type=I
[/FRAME]

সুতরাং ফলাফলগুলিতে কেবল কী ফ্রেম সম্পর্কিত তথ্য থাকবে।


1

স্লাহকের উত্তরে বিল্ডিং , এখানে একটি বাশ ফাংশন রয়েছে যা Nসেকেন্ডের আগে ঘটে যাওয়া নিকটতম কীফ্রেমটি ফিরিয়ে দেবে ।

এটি -read_intervalsffprobe শুধুমাত্র আপনার কীফ্রেম সেকেন্ডের 25 সেকেন্ডের আগে সন্ধান শুরু করে তা নিশ্চিত করার জন্য এটি ব্যবহার করে N। টাইমস্ট্যাম্পটি পাওয়া গেলে এই কৌশলটি এবং বিশ্রী প্রস্থান করার সময় জিনিসগুলি প্রচুর গতি বাড়ায়।

function ffnearest() {
  STIME=$2; export STIME;
  ffprobe -read_intervals $[$STIME-25]% -select_streams v -show_frames -show_entries frame=pkt_pts_time,pict_type -v quiet "$1" |
  awk -F= '
    /pict_type=/ { if (index($2, "I")) { i=1; } else { i=0; } }
    /pkt_pts_time/ { if (i && ($2 <= ENVIRON["STIME"])) print $2; }
    /pkt_pts_time/ { if (i && ($2 > ENVIRON["STIME"])) exit 0; }
  ' | tail -n 1
}

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

➜ ffnearest input.mkv 30
23.941000

আমি ভিডিও ফাইলগুলিকে পুনরায় এনকোডিং ছাড়াই ছাঁটাতে এটি ব্যবহার করি। যেহেতু আপনি পুনরায় এনকোডিং ছাড়াই নতুন কীফ্রেমগুলি যুক্ত করতে পারবেন না, তাই ffnearestআমি কাটা চাওয়ার আগে আমি কীফ্রেমে অনুসন্ধান করতে চাই। এখানে একটি উদাহরণ:

ffmpeg  -i input.mkv -ss 00:00:$(echo "$(ffnearest input.mkv 30) - 0.5" | bc)  -c copy -y output.mkv;

মনে রাখবেন যে এই উদাহরণটির জন্য আপনাকে -ssপ্রথম seconds০ সেকেন্ডের চেয়ে বেশি দূরত্বে খুঁজলে পরমতে যা হয়েছে তার ফর্ম্যাটটি পরিবর্তন করতে হতে পারে ।

(বিরক্তিজনকভাবে, ffmpeg কে কীফ্রেমের টাইমস্ট্যাম্পের সন্ধান করতেই ffmpeg আউটপুটে সেই কীফ্রেমকে বাদ দেয় বলে মনে হয়, তবে কীফ্রেমের আসল টাইমস্ট্যাম্প থেকে 0.5 সেকেন্ড বিয়োগ করে ট্রিকটি করে। ব্যাশের জন্য আপনাকে bcদশমিকের সাথে এক্সপ্রেশন মূল্যায়নের জন্য প্রয়োজন , কিন্তু zsh -ss 00:00:$[$(ffnearest input.mkv 28)-0.5]কাজ করে।)


আমি ফ্রেম দেওয়ার পরে এটি পরবর্তী ফ্রেমের সময় দেবে।
এহসান চাওশি

0

আপনি যদি আই ফ্রেমের তথ্য পেতে চান তবে আপনি ব্যবহার করতে পারেন

ffprobe -i input.mp4 -v quiet -select_streams v -show_entries frame=pkt_pts_time,pict_type|grep -B 1 'pict_type=I'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.