FFmpeg ব্যবহার করে কোনও ভিডিওর অর্থপূর্ণ থাম্বনেইল


80

FFmpeg ভিডিওগুলি থেকে চিত্রগুলি ক্যাপচার করতে পারে যা থাম্বনেল হিসাবে ভিডিও উপস্থাপন করতে ব্যবহার করা যেতে পারে। এটি করার সর্বাধিক সাধারণ উপায়গুলি এফএফপিপেইগ উইকিতে ধরা পড়ে ।

তবে, আমি কিছু বিরতিতে এলোমেলো ফ্রেম তুলতে চাই না। দৃশ্যের পরিবর্তনগুলি ক্যাপচার করতে আমি এফএফপিপেতে ফিল্টার ব্যবহার করে কিছু বিকল্প পেয়েছি:

ফিল্টারটি thumbnailভিডিওতে সর্বাধিক প্রতিনিধি ফ্রেমগুলি সন্ধান করার চেষ্টা করে:

ffmpeg -i input.mp4 -vf  "thumbnail,scale=640:360" -frames:v 1 thumb.png

এবং নিম্নলিখিত কমান্ডটি কেবলমাত্র এমন ফ্রেমগুলি নির্বাচন করে যা পূর্বের তুলনায় 40% এর বেশি পরিবর্তন (এবং সম্ভবত দৃশ্য পরিবর্তনগুলি হয়) এবং 5 পিএনজির ক্রম তৈরি করে।

ffmpeg -i input.mp4 -vf  "select=gt(scene\,0.4),scale=640:360" -frames:v 5 thumb%03d.png

উপরের কমান্ডগুলির জন্য তথ্য ক্রেডিট ফ্যাবিও সোনাতিকে । দ্বিতীয় চিত্রটি আরও ভাল মনে হয়েছিল কারণ আমি এন ইমেজ পেতে পারি এবং সেরাটি বেছে নিতে পারি। আমি এটি চেষ্টা করেছিলাম এবং এটি একই চিত্রটি 5 বার উত্পন্ন করে।

আরও কিছু তদন্ত আমাকে নেতৃত্ব দিয়েছে:

ffmpeg -i input.mp4 -vf "select=gt(scene\,0.5)" -frames:v 5 -vsync vfr  out%02d.png

-vsync vfrআপনি বিভিন্ন চিত্র পেতে নিশ্চিত করে। এটি এখনও সর্বদা ভিডিওর প্রথম ফ্রেম বেছে নিয়েছে, বেশিরভাগ ক্ষেত্রে প্রথম ফ্রেমটি ক্রেডিট / লোগো এবং অর্থবহ নয়, তাই আমি -ssভিডিওর প্রথম 3 সেকেন্ড ফেলে দেওয়ার জন্য একটি 3 যুক্ত করেছি ।

আমার চূড়ান্ত আদেশটি এরকম দেখাচ্ছে:

ffmpeg -ss 3 -i input.mp4 -vf "select=gt(scene\,0.5)" -frames:v 5 -vsync vfr out%02d.jpg

এটিই আমি করতে পারি সেরা। আমি লক্ষ্য করেছি যেহেতু আমি কেবল 5 টি ভিডিও বাছাই করেছি, সেগুলি সমস্তই বেশিরভাগ ভিডিওর শুরু থেকেই এবং ভিডিওতে পরবর্তী সময়ে ঘটে যাওয়া গুরুত্বপূর্ণ দৃশ্যের হাতছাড়া হতে পারে may

অন্য কোনও উন্নত বিকল্পের জন্য আমি আপনার মস্তিষ্ক বেছে নিতে চাই।


চমৎকার কমান্ড উদাহরণ। এফডাব্লুআইডাব্লু, আমি ওএস এক্স (10.8, এফএফপিপেইগ 1.1 এবং নীচে) এফএফপিপেগ-উত্পাদিত জেপিইজি ছবি নিয়ে কোনও সমস্যায় পড়িনি। আপনার দ্বিতীয় থেকে শেষ কমান্ডটি আমার পক্ষে ঠিক কাজ করে — তাই শেষ does এবং এর কোনওটিই ফাঁকা জেপিজি ফাইলগুলিতে আসে না। আমি সাথে সংকলন করেছি libopenjpeg.. নিশ্চিত না যে এটি কোনও পার্থক্য করে কিনা।

ধন্যবাদ slhck Ffmpeg কনফিগারেশন / সংস্করণ বিবরণ সহ প্রশ্ন সম্পাদনা করা হয়েছে। আমি এই মেশিনে 1.1 এ আপগ্রেড করেছি না। আমি এটি করব এবং দেখুন এটির কোনও ফলাফল পরিবর্তন হয়েছে কিনা।
d33pika

1
তাহলে আপনি উবুন্টুতে আছেন? আপনি কি একটি স্ট্যাটিক বিল্ড থেকে সর্বশেষতম গিট মাস্টার সংস্করণ চেষ্টা করতে পারেন বা নিজেকে সংকলন করে আবার চালাচ্ছেন? বা সর্বশেষ স্থিতিশীল। আমি শুধু চেক করা থাকে, এটি ব্যবহার করে mjpegপাশাপাশি আমার জন্য এনকোডার, এবং আমি চেক করা jpegoptimএবং exiv2, উভয়ই আপনার উদাহরণ কমান্ড থেকে সব JPG, ফলাফল নিয়ে আমার জন্য ভাল কাজ।
13'8

1
আমি আপডেট করেছি, এবং এটি এখন কাজ করে! আমার ধারণা পূর্ববর্তী সংস্করণটিতে কিছু বাগ রয়েছে।
d33pika

আপনি কি আরও এগিয়ে গিয়ে সমাধানটি নতুন সংস্করণটি পোস্ট করতে পারবেন, সম্ভবত আপনি যে বাগটিটি দেখিয়েছিলেন এবং তারপরে নতুন সংস্করণটি সংশোধন করেছেন তা চেঞ্জলগের লিঙ্ক সহ?
লিজ

উত্তর:


29

আদর্শ হিসাবে, 5 টি সময়ের স্প্যানের মধ্যে প্রথম> 40% - পরিবর্তন ফ্রেমটি কীভাবে সন্ধান করা যায়, যেখানে সময়কালগুলি ভিডিওর 1 ম, দ্বিতীয়, তৃতীয়, চতুর্থ এবং 5 তম 20% হয়।

আপনি এটিকে time সময়ের স্প্যানেও বিভক্ত করতে পারেন এবং ক্রেডিট এড়ানোর জন্য 1 মটিকে অবজ্ঞা করে।

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

...কিছুটা এইরকম:

ffmpeg -ss 3 -i input.mp4 -vf "select=gt(scene\,0.4)" -frames:v 5 -vsync vfr -vf fps=fps=1/600 out%02d.jpg

1
পুরোপুরি কালো বা সাদা চিত্রগুলি বাছাই করা হবে those আমি কীভাবে সেগুলি এড়াতে পারি?
d33pika

1
সেগুলির কালো ফ্রেম এবং ক্রমগুলি সনাক্ত করার জন্য ফিল্টার রয়েছে ( ffmpeg.org/ffmpeg-filters.html#blackframe বা ffmpeg.org/ffmpeg-filters.html#blackdetect )। আপনি তাদের উভয়কেই আপনার ক্রমবর্ধমান ওয়ান-লাইনারে কাজ করতে সক্ষম করতে পারবেন না, তবে অবশ্যই আপনি অবশ্যই কালো ফ্রেমগুলি আলাদা করতে পারবেন (পৃথক পদক্ষেপ) এবং ফলস্বরূপ ভিডিও থেকে থাম্বনেইল বের করতে পারবেন।
এএম

5
সাদা ফ্রেম হিসাবে, এখন এটি জটিল হয়ে উঠছে, তবে এটি এখনও মনে হচ্ছে একটি উপায় আছে: 1. কালো ফ্রেমগুলি ফেলা 2 (নিন্দিত করা (সাদা থেকে কালো হয়ে যায়)) 3. সাদা ফ্রেমগুলি ফালা ফেলা করুন again. আবার প্রত্যাখ্যান করুন thumb থাম্বনেলগুলি বের করুন (আপনি যদি বিশেষ করে এক লাইনে কালো বা সাদা ফ্রেমগুলি সরিয়ে ফেলার ব্যবস্থা করেন তবে আপনি কি এটি এখানে আবার পোস্ট করতে পারেন? আমি এটি ভবিষ্যতের পাঠকদের উত্তরের জন্য যুক্ত করতে পারি ... ... বা আসলে আপনি একটি নতুন প্রশ্ন এবং উত্তর তৈরি করতে পারেন এটি। আমি অবশ্যই এটি upvote করব।)
এএম

3
প্লেইন ব্ল্যাক অ্যান্ড হোয়াইটের মতো বিরক্তিকর চিত্রগুলি এড়াতে: আপনার প্রয়োজনের তুলনায় আরও বেশি থাম্বনেইল তৈরি করুন, তাদের জেপিগ দিয়ে সংকুচিত করুন এবং বড় ফাইল আকারের চিত্রগুলি চয়ন করুন। শালীন থাম্বনেইলগুলি পেতে এটি আশ্চর্যজনকভাবে ভাল কাজ করে।
স্যাম ওয়াটকিন্স

2
এই আদেশটি কার্যকর হয়নি, আমি একটি ত্রুটি পেয়েছি Unable to find a suitable output format for 'fps=fps=1/600'। সমাধানটি -vfসেই যুক্তিটির আগে যুক্ত করা হয় (দেখুন স্ট্যাকওভারফ্লো.com/ জিজ্ঞাসা / ২৮৮৫০৯০০/ffmpeg-command-issue )
জন বুদ্ধিমান

7

অর্থপূর্ণ সংজ্ঞা দেওয়া শক্ত তবে আপনি যদি এন থাম্বনেইলগুলি দক্ষতার সাথে পুরো ভিডিও ফাইলটি বিস্তৃত করতে চান তবে এটি আমি ব্যবহারকারী আপলোড করা সামগ্রীর সাহায্যে উত্পাদনে থাম্বনেইল তৈরি করতে ব্যবহার করি।

সুডোকোড

for X in 1..N
  T = integer( (X - 0.5) * D / N )  
  run `ffmpeg -ss <T> -i <movie>
              -vf select="eq(pict_type\,I)" -vframes 1 image<X>.jpg`

কোথায়:

  • ডি - ভিডিও সময়কাল ffmpeg -i <movie>একা থেকে পড়া বা ffprobeএতে ভাল JSON আউটপুট লেখক রয়েছে বিটিডব্লিউ
  • এন - আপনি চান থাম্বনেলগুলির মোট সংখ্যা
  • এক্স - থাম্বনেইল নম্বর, 1 থেকে এন
  • টি - টুমনেইলের জন্য সময় পয়েন্ট

কেবল উপরেরটি সিনেমার প্রতিটি বিভাজনের কেন্দ্র-কী-ফ্রেম লিখে রাখে। উদাহরণস্বরূপ যদি সিনেমাটি 300s দীর্ঘ হয় এবং আপনি 3 থাম্বনেইল চান তবে এটি 50s, 150 এবং 250 এর পরে একটি কী ফ্রেম নেয়। 5 থাম্বনেইলের জন্য এটি 30s, 90s, 150s, 210, 270s হবে। আপনি মুভি সময়কাল ডি এর উপর নির্ভর করে N কে সামঞ্জস্য করতে পারেন, উদাহরণস্বরূপ 5 মিনিটের মুভিতে 3 টি থাম্বনেইল থাকবে তবে 1 ঘণ্টারও বেশি সময় 20 টি থাম্বনেইল থাকবে।

কর্মক্ষমতা

উপরের ffmpegকমান্ডের প্রতিটি অনুরোধ ~ 1GB H.264 এর জন্য সেকেন্ড (!) এর একটি ভগ্নাংশ নেয়। কারণ এটি তাত্ক্ষণিকভাবে <time>পজিশনে চলে যায় ( -ssআগে মনে -i) এবং প্রথম কী ফ্রেম নেয় যা কার্যত জেপিইজি সম্পূর্ণ। সঠিক সময় অবস্থানের সাথে মেলে সিনেমা রেন্ডার করার জন্য কোনও সময় নষ্ট হয় না।

পোস্ট প্রসেসিং

আপনি উপরে scaleবা অন্য কোনও আকার পরিবর্তন পদ্ধতির সাথে মিশ্রিত করতে পারেন । আপনি কঠিন রঙের ফ্রেমগুলিও মুছে ফেলতে পারেন বা এটি অন্যান্য ফিল্টারগুলির সাথে মিশ্রিত করতে চেষ্টা করতে পারেন thumbnail


2
বাহ -ss Nআগে সরানো -iএকটি আশ্চর্যজনক টিপ। ধন্যবাদ!
আপিনস্টাইন

2

আমি একবার অনুরূপ কিছু করেছি, তবে আমি ভিডিওটির সমস্ত ফ্রেম রফতানি করেছি (1 এফপিএসে) এবং তাদের সাথে পার্ল ইউটিলিটিটি তুলনা করেছিলাম যা চিত্রগুলির মধ্যে পার্থক্য গণনা করে comp আমি প্রতিটি ফ্রেমকে পূর্ববর্তী থাম্বনেইলের সাথে তুলনা করেছি এবং এটি যদি সমস্ত থাম্বনেইল থেকে আলাদা হয় তবে আমি এটিকে থাম্বনেইল সংগ্রহের সাথে যুক্ত করেছি। এখানে সুবিধাটি হ'ল যদি আপনার ভিডিওটি A থেকে B দৃশ্যে চলে যায় এবং সেগুলি এ এ ফিরে আসে, ffmpeg এ 2 এর ফ্রেম রফতানি করে will


2 টি চিত্রের তুলনায় আপনি কোন কারণগুলি ব্যবহার করেছেন?
d33pika

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

আমি এখানে জোরে জোরে চিন্তা করছি কিন্তু এই খারাপ বিকল্প না? আপনি যখন ভিডিও থেকে 2 রফতানি করা চিত্রের তুলনা করেন আপনি ইতিমধ্যে এটি থেকে কিছু তথ্য হারিয়ে ফেলেছেন। মানে, কোডেক তথ্য থেকে 2 টি চিত্রের তুলনায় মিল খুঁজে পাওয়া সহজ, তাইনা? ইমেজগুলির তুলনা করার জন্য আমি কিছু অ্যালগরিদম / গ্রন্থাগারগুলিতে সন্ধান করেছি এবং সেগুলি যেমন প্রয়োজন তেমন কাজ করে না।
স্যামুয়েল

ঠিক আছে, ffmpeg দিয়ে আপনি একই_মানের পতাকাটি ব্যবহার করে মানের ক্ষতি ছাড়াই ফ্রেমগুলি বের করতে পারেন। আপনি যদি কোডেক তথ্য ব্যবহার করেন তবে আপনাকে পরীক্ষা করতে হবে যে আপনি কেবল আইফ্রেমেস পান না। যাইহোক যে পার্ল ইউটিলিটিটি আমার পক্ষে ঠিক কাজ করেছে, এবং এটি খুব কনফিগারযোগ্য। এখানে দেখুন: search.cpan.org/~avif/
ইমেজ- Compare-0.3.3

2

এটা চেষ্টা কর

 ffmpeg -i input.mp4 -vf fps= no_of_thumbs_req/total_video_time out%d.png

এই আদেশটি ব্যবহার করে আমি প্রয়োজনীয় সংখ্যক থাম্বনেইল তৈরি করতে সক্ষম যা পুরো ভিডিওর প্রতিনিধি representative


সঠিক সূত্র fpsহবে না (no_of_frames_req * fps_of_vid) / total_video_frames?
ফ্লোলিলো

আমি একটি বিপরীত সমাধানের সন্ধান করছি: পিরিয়ড থেকে আরও ফ্রেম নির্বাচন করুন যেখানে ক্যামেরা আরও স্থিতিশীল এবং চলমান নয়? (যেখানে ধারাবাহিক ফ্রেমের মধ্যে পার্থক্য কম, বেশি নয়)। এটা করার কোন উপায় আছে?
টিনা জে

1

পোস্টার হিসাবে ব্যবহার করার জন্য লাইভ m3u8 স্ট্রিমগুলির জন্য পর্যায়ক্রমিক থাম্বনেল তৈরি করতে আমি এখানে যা করছি। আমি থাম্বনেইলগুলি উত্পন্ন করার জন্য একটি অবিচ্ছিন্ন ffmpeg কাজ চালিয়েছি যা আমার সমস্ত সিপিইউ খায়, তার পরিবর্তে আমি প্রতি 60 সেকেন্ডে একটি ক্রোনজব চালাই যা আমার স্ট্রিমের জন্য সমস্ত থাম্বনেইল তৈরি করে।

#!/usr/bin/env bash

## this is slow but gives better thumbnails (takes about 1+ minutes for 20 files)
#-vf thumbnail,scale=640:360 -frames:v 1 poster.png

## this is faster but thumbnails are random (takes about 8 seconds for 20 files)
#-vf scale=640:360 -frames:v 1 poster.png
cd ~/path/to/streams

find . -type f \
  -name "*.m3u8" \
  -execdir sh -c 'ffmpeg -y -i "$0" -vf scale=640:360 -frames:v 1 "poster.png"' \
  {} \;

আপনার যদি 60 সেকেন্ডেরও বেশি ঘন ঘন কাজ করার প্রয়োজন হয় (ক্রোনজব সীমাবদ্ধতা), তবে আপনি whileআপনার স্ক্রিপ্টে একটি লুপ করতে পারেন এবং এটি চিরতরে কার্যকর হবে। sleep 30ফ্রিকোয়েন্সিটি 30 সেকেন্ডে পরিবর্তন করতে কেবল একটি যুক্ত করুন । যদিও আমি আগের সংখ্যক ভিডিওর সাথে প্রচুর পরিমাণে এটি করার পরামর্শ দিচ্ছি না, কারণ পরবর্তী রানটি শুরু হওয়ার আগে পূর্বের রানটি সম্পূর্ণ নাও হতে পারে।

আদর্শভাবে ক্রোনজব সহ আমি প্রতি 5 মিনিটে এটি চালাই।

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