কিভাবে সেকেন্ডে ভিডিও সময়কাল পেতে?


69

আমি কীভাবে সেকেন্ডের মধ্যে ভিডিও সময়কাল পেতে পারি?

আমি যা চেষ্টা করেছি:

ffmpeg -i file.flv 2>&1 | grep "Duration"
  Duration: 00:39:43.08, start: 0.040000, bitrate: 386 kb/s


mediainfo file.flv | grep Duration
Duration : 39mn 43s

এটি কী কাছে, তবে এটি এতটা সঠিক নয়, 2383 39.71 মিনিটের

ffmpeg -i file.flv 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,// | sed 's@\..*@@g' | awk '{ split($1, A, ":"); split(A[3], B, "."); print 3600*A[1] + 60*A[2] + B[1] }'
2383

উত্তর:


36

মিনিট পেতে, আপনাকে 2383 সেকেন্ড 60 দ্বারা বিভক্ত করতে হবে।

39.7167

এবং তারপরে বাকি সেকেন্ডগুলি পেতে ভগ্নাংশের অংশ .7167 কে 60 দিয়ে গুণ করুন।

43.002

সুতরাং এটি 39 মিনিট, 43 সেকেন্ড। অ্যাপ্লিকেশনটি আপনাকে একটি সঠিক মান দিচ্ছে বলে মনে হচ্ছে।


95

শুধু ffprobeসরাসরি ব্যবহার করুন । ইত্যাদি প্রয়োজন নেই sed, grepআপনি অর্জন করতে পারেন এমন কয়েকটি "সময়সীমা" রয়েছে (আপনার ইনপুটের উপর নির্ভর করে)।

ফর্ম্যাট (ধারক) সময়কাল

$ ffprobe -v error -show_entries format=duration \
  -of default=noprint_wrappers=1:nokey=1 input.mp4

30.024000

-sexagesimalবিকল্পটি যুক্ত করা HOURS ব্যবহার করবে: এমএম: এসএস। মাইক্রোসেকেন্ডস ইউনিট ফর্ম্যাট:

0:00:30.024000

ভিডিও স্ট্রিম সময়কাল

$ ffprobe -v error -select_streams v:0 -show_entries stream=duration \
  -of default=noprint_wrappers=1:nokey=1 input.mp4
30.000000

উপরের কমান্ডগুলি এফএফম্পেগ উইকি: এফএফপ্রোব টিপস

সঙ্গে ffmpeg

আপনার যদি ধারক বা স্ট্রিমের সময়কাল অনুপস্থিত বা ভুল হতে পারে (সম্ভবত কোনও ক্ষতিগ্রস্থ বা কাটা ফাইলের কারণে) পান তবে আপনার সম্পূর্ণ ইনপুট ডিকোড করার দরকার হতে পারে।

$ ffmpeg -i input.mp4 -f null -
  …
  frame= 1587 fps=0.0 q=0.0 Lsize=N/A time=00:01:03.48 bitrate=N/A

এই উদাহরণে time=00:01:03.48সময়কাল:

এটি কতক্ষণ সময় নিবে তা অবশ্যই আপনার ইনপুটটির ডিকোডিং জটিলতা এবং সময়কাল এবং আপনার কম্পিউটারের ক্ষমতাগুলির উপর নির্ভর করে।


এগুলি .m2v ফাইলে কাজ করে না পাশাপাশি তাদের জন্য আপনার কী সমাধান আছে
উতদেব

@utdev "সহ ffmpeg" বিভাগটি দেখুন।
লগইন

আপনার তৃতীয় সমাধানটি আমাকে একটি ভুল সময় দেয়, আমার ভিডিওটির দৈর্ঘ্য রয়েছে 01:19:00 তবে কমান্ডটি আমাকে সময় দেয় = 01: 09: 15.32, কেন এমন হচ্ছে তা অনুমান করার জন্য
utdev

মিডিয়া স্ট্রিম সময়কাল খুব দরকারী। ধন্যবাদ.
আমরা

যে কেউ avprobe ব্যবহার জন্য, পরামিতি কিছুটা ভিন্ন আছেন: avprobe -v ত্রুটি -show_format_entry সময়কাল \ Sample.mp4।
ব্র্যাড

32

আপনার কাছে থাকলে ffmpegআপনারও হওয়া উচিত ffprobe:

ffprobe -i input.file -show_format | grep duration
ffprobe -i input.file -show_format -v quiet | sed -n 's/duration=//p'

এটি সেকেন্ডের ভগ্নাংশও দেবে, যদি সমস্যা হয় তবে আপনি আরও সেড দিয়ে প্রক্রিয়া করতে পারেন।


আমি কীভাবে সেকেন্ডের ভগ্নাংশটি সরাতে পারি?
টিনা জে

@TinaJ শুধু পাইপ এটা দিয়ে printf, মত | xargs printf %.0f- এই একটি পূর্ণসংখ্যা মান ফিরে আসবে।
ইলিয়া রোস্টভটসেভ

3

আমার ffmpeg-0.6.5-1.el6.rf.x86_64 এর জন্য, কেবল দ্বিতীয়টি পেতে, ffprobe কমান্ড ফর্ম্যাটটি হ'ল:

ffprobe <file> -show_format 2>&1 | sed -n 's/duration=//p' 

আমি কীভাবে সেকেন্ডের ভগ্নাংশটি সরাতে পারি?
টিনা জে

3

এমপ্লেয়ার সহ সমাধান যা সরাসরি সেকেন্ড দেয়:

mplayer -identify -frames 0 -vo null -nosound file.flv 2>&1 | awk -F= '/LENGTH/{print $2}'

2
mediainfo --Output='General;%Duration%' file.flv

এটি একক পূর্ণসংখ্যার মান হিসাবে সময়কালকে মিলিসেকেন্ডে আউটপুট করে। গ্রেপ / কাট / সেড / প্রয়োজন নেই ...


ধন্যবাদ - আমি যা খুঁজছিলাম ঠিক এটি ছিল। ম্যাকোসে এর সাথে ইনস্টল করা যেতে পারেbrew install mediainfo
অ্যালেক্স কে

0

আমি যে ভিডিওর সাথে কাজ করেছিলাম তার থেকে কিছু অদ্ভুত এবং ভুল মেটাডেটা পাওয়ার বিষয়টি আমি সামনে এসে পৌঁছেছি এবং এফএফএমপিগ, এমপিপুটবক্স, এফএফপ্রোবে, মেডিয়েনফো, এমপ্লেয়ার, এবং এমপিএল কোড এবং সরঞ্জামগুলি ব্যবহার করে কোনও প্যাটার্ন বা কোনও ধরণের হ্যান্ডলিং সন্ধান করতে আমি সফল হতে পারিনি, ভিডিওর আসল সময়কাল পেতে।

আমি যে প্রকল্পে কাজ করছিলাম তার জন্য ভিডিওর আসল সময়কাল সনাক্তকরণের প্রয়োজন ছিল এবং এটি সর্বদা সঠিকভাবে পাওয়া আমার একমাত্র উপায় ছিল ffmpeg ব্যবহার করে ভিডিও ফাইলটি পুনরায় কোড করা এবং মূল ফাইলের মেটাডেটা উপেক্ষা করার জন্য এনকোডযুক্ত ফাইলগুলি বাধ্য করা যেমন:

ffmpeg -i INPUT_FILENAME -acodec copy -vcodec copy -map_metadata -1 OUTPUT_FILENAME"

(এটি আপনার প্রত্যাশার চেয়ে দ্রুত চলতে পারে I

... এবং তারপরে আপনার পছন্দের কোনও সরঞ্জাম ব্যবহার করে সময়কাল পান। আমি মিডিয়েনফো, বিটিডব্লু পছন্দ করি: - "মিডিয়েনফো ফাইল - ইনফর্ম =" ভিডিও;% সময়কাল% "আপনাকে মিলিসেকেন্ডে সময় দেয়।


আপনি অন্যান্য উত্তরের চেয়ে বেশি তথ্য বা আরও ভাল সমাধান সরবরাহ করেন নি
স্যাম

0

আপনার যদি কেবল মেটাডেটা অনুসন্ধান করার প্রয়োজন হয়:

ffprobe -hide_banner -v quiet -show_streams -print_format flat video.mp4

[...]

streams.stream.0.duration="5221.146009"

[...]

সুতরাং আপনি এটি বিশ্লেষণ করতে পারেন:

while read -r; do
  if [[ "$REPLY" =~ ^streams\.stream\.([0-9])+\.duration=\"([^"]+)\"$ ]]; then
    echo -E Duration of stream "${BASH_REMATCH[1]}": "${BASH_REMATCH[2]}"
  fi
done < <(ffprobe -hide_banner -v quiet -show_streams -print_format flat video.mp4)

তবে আপনি যদি কার্যকর ধারকটির সময়কাল পেতে চান তবে আপনাকে এটি ডিকোড করতে হবে:

AV_LOG_FORCE_NOCOLOR=y ffmpeg -nostdin -hide_banner -nostats -loglevel info -i video.mp4 -f null -c copy - 2>&1 | tail -n 2

এটি ডিকোড করতে কিছু সিপিইউ সময় লাগবে, অবধি:

[...]

frame=130527 fps=53271 q=-1.0 Lsize=N/A time=01:27:01.12 bitrate=N/A speed=2.13e+03x
video:152014kB audio:40790kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown

তারপরে, আপনি এটি বিশ্লেষণ করতে পারেন:

if [[ "$(AV_LOG_FORCE_NOCOLOR=y ffmpeg -nostdin -hide_banner -nostats -loglevel info -i video.mp4 -f null -c copy - 2>&1 | tail -n 2 | head -n 1)" =~ \ time=([0-9]+):([0-9]{2}):([0-9]{2})\.([0-9]+) ]]; then
  declare duration=0 us="${BASH_REMATCH[4]}" t
  for t in "${BASH_REMATCH[@]:1:3}"; do
    ((duration *= 60))
    ((duration += ${t#0} ))
  done
  while [ ${#us} -lt 6 ]; do us+=0; done
  ((us >= 500000)) && ((duration++))
  ((duration)) || ((duration++))
fi
echo -E Duration: "$duration"

-6

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

লিনাক্সে, যদি ফাইলটি কেবলমাত্র ভিডিও রেকর্ডিংয়ের সময় তৈরি এবং সংশোধিত হয়, তবে বিকল্প বিকল্প হ'ল সময়কাল গণনা করার জন্য সৃষ্টি এবং শেষ পরিবর্তন সময়টি ব্যবহার করা হবে, যেমন:

stat -c "%X %Y" video.mpg | awk '{print $2 - $1}'

5
আপনি কোথায় খুঁজে পেয়েছেন যে ffmpeg সঠিক নয়?
আলেব

4
% এক্স সর্বশেষ অ্যাক্সেসের সময়। সর্বশেষ পরিবর্তিত হওয়ার পরে% Y সময় এসেছে। এটি ভিডিও দৈর্ঘ্য সম্পর্কে কিছুই বলে না।
জো হিলেনব্র্যান্ড

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