Ffmpeg ব্যবহার করে কোনও ভিডিও থেকে কী ফ্রেমের সূচকটি বের করা


17

আমি ভিডিও থেকে কী ফ্রেমগুলি বের করার জন্য ffmpeg ব্যবহার করছি। এই হুকুম:

ffmpeg -i test2.mp4 -vf select='eq(pict_type\,I)' -vsync 2 -s 160x90 -f image2 thumbnails-%02d.jpeg

আমি কীভাবে প্রতিটি কী ফ্রেমের সূচকটি ভিডিওতে পেতে পারি? উদাহরণস্বরূপ, প্রথম আই-ফ্রেমের জন্য সূচক 0 হবে, দ্বিতীয়টির জন্য এটি 24 হবে etc.



Ffprobe ব্যবহার করে দেখুন, তাহলে সূচি পেতে আউটপুট পোস্ট প্রক্রিয়া করবেন?
dstob

@ ডিস্টব আপনি নিজের অর্থটি সম্পর্কে আরও ব্যাখ্যা করতে পারেন? আমি ffmpeg নতুন।
খালিফা

@ লর্ডনেকবার্ড ভিডিও ফ্রেমের ফ্রেম নম্বর, প্রাক্তন। ভিডিওর প্রথম ফ্রেমটি সূচীতে 0 হবে আমি ভিডিও ফ্রেমের প্রতিটি কী ফ্রেমের সূচি জানতে চাই।
খালিফা

আপনি চান যে থাম্বনেইলে ফ্রেম নম্বরটি মুদ্রিত হবে (চিত্রটিতে নিজেই)?
লগন

উত্তর:


21

@Dstob উল্লিখিত মত, আপনি ffprobeআই-ফ্রেম এবং তাদের সম্পর্কিত তথ্য পেতে ব্যবহার করতে পারেন । ডাউনলোড পৃষ্ঠায়ffprobe কিছু স্থিতিশীল বিল্ডগুলির সাথে আসে এবং উত্স থেকেও নির্মিত যেতে পারে।

এটি ধরে নিচ্ছে আপনি লিনাক্স / ইউনিক্সে রয়েছেন:

ফ্রেম এবং ফ্রেমের প্রকারগুলি বের করুন

ffprobe -select_streams v -show_frames \
-show_entries frame=pict_type \
-of csv bbb480.avi \
| grep -n I | cut -d ':' -f 1

grepআদেশের সঙ্গে লাইন ফিল্টার Iতাদের মধ্যে, এবং তাদের ইনডেক্স (ব্যবহার, মোট ছাত্র -nবিকল্প)। cutকমান্ড আউটপুট শুধুমাত্র (INDEX) প্রথম কলামে নির্বাচন করে। মনে রাখবেন যে এই সূচকটি 1-ভিত্তিক, 0-ভিত্তিক নয়।

সূচকের ভিত্তিতে আউটপুট ফাইলগুলির নাম পরিবর্তন করুন

আপনি আসলে এই সূচকগুলি একটি তালিকায় পাইপ করতে পারেন:

ffprobe -select_streams v -show_frames \
-show_entries frame=pict_type \
-of csv bbb480.avi \
| grep -n I | cut -d ':' -f 1 > frame_indices.txt

তারপরে সমস্ত থাম্বনেইলের একটি তালিকাও তৈরি করুন:

ls -1 thumbnails*.jpeg > thumbnails.txt

তারপরে এই দুটি এক সাথে পেস্ট করুন:

paste thumbnails.txt frame_indices.txt > combined.txt

তালিকায় এখন থাম্বনেল এবং সূচকের নাম রয়েছে। এর উপর ভিত্তি করে একটি নতুন নাম সম্পাদন করুন:

while read -r thumbnail index; do
  newIndex=$(echo $index - 1 | bc) # subtract 1 from the index
  mv -- "$thumbnail" "thumbnail-$newIndex.jpeg"  # rename file
done < combined.txt

উপরের নামকরণ thumbnail-01.jpegহবে thumbnail-0.jpeg। দ্রষ্টব্য যে আউটপুট সূচীতে কোনও শূন্য-প্যাডিং নেই। আপনি যদি এটিতে শূন্য-প্যাড করতে চান, বলুন, 5 সংখ্যা, ব্যবহার করুন printf:

newIndex=$(printf '%05d' $(echo $index - 1 | bc))

উইন্ডোজে আপনি ঠিক একই কাজটি করবেন ffprobeতবে আউটপুটকে আলাদাভাবে পার্স করবেন। কীভাবে সেখানে পুনরায় নামকরণ করা যায় তা ধারণা নেই।


এই ত্রুটিটি প্রদর্শিত হয়: 'গ্রেপ' কোনও অভ্যন্তরীণ বা বাহ্যিক কমান্ড, অপারেবল প্রোগ্রাম বা ব্যাচ ফাইল হিসাবে স্বীকৃত নয়।
খালিফা

2
কারণ আপনি উইন্ডোজে আছেন। আমি যেমন বলেছি, এই উত্তরটি লিনাক্স বা ইউনিক্স ধরে নিয়েছে। আপনি আপনার প্রশ্নে আরও নির্দিষ্ট হয়ে উঠছিলেন না। আপনি সাইগউইন বা উইন্ডোজের জন্য অনুরূপ জিএনইউ / লিনাক্স স্তরগুলি ব্যবহার করে উইন্ডোজে একই অর্জন করতে পারেন ।
ছোঁয়া

ধন্যবাদ এটি একটি বিশাল সহায়তা। একটি সংশোধন: আমি মনে করি আপনার প্রথম কমান্ডের সূচকগুলি তিনটি ফ্যাক্টর দ্বারা বন্ধ রয়েছে, কারণ প্রতিটি লাইনের জন্য একটি [FRAME]লাইন এবং একটি লাইন রয়েছে। [/FRAME]pict_type
জ্যাক ও'কনোর

2
@ জ্যাকও'কনর যদি আপনি -of csvবিকল্পটি ব্যবহার করেন তবে ফ্রেমে প্রতি একটি লাইন রয়েছে ffprobe। আপনি যা বর্ণনা করছেন তা হ'ল ডিফল্ট আউটপুট ফর্ম্যাট।
স্ল্যাক

0

আপনি যদি এফএফএমপিইজিটিকে মূলত বর্ণিত হিসাবে ব্যবহার করতে চান তবে আপনি সমস্ত বা আংশিক তালিকা তৈরি করার পাশাপাশি নীচের সাথে জেপিজি তৈরি করতে পারেন:

ffmpeg.exe \
  -i "C:\Users\UserName\Desktop\jpegs and list\VideoName.mp4" \
  -t 15 \
  -vf select="eq(pict_type\,PICT_TYPE_I)" \
  -vsync 2 \
  -s 160x90 \
  -f image2 thumbnails-%02d.jpeg \
  -loglevel debug 2>&1| for /f "tokens=4,8,9 delims=. " %d in ('findstr "pict_type:I"') do echo %d %e.%f>>"keyframe_list.txt"

-t 15কোনও সময়সীমা ছাড়াই সরান বা মামলা অনুসারে পরিবর্তন করুন। -s 160x90 -f image2 thumbnail-%02d.jpegথাম্বনেইল অপসারণের জন্য মুছুন বা অনুসারে পরিবর্তন করুন।


উইন্ডোজ 7 সিএমডি-তে, এটি \ এ ব্যর্থ হয় \ I থেকে ^ পরিবর্তনটি ব্যর্থ হওয়ার কারণ ঘটায়: আই "
you আপনার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.