सेकंड में वीडियो अवधि कैसे प्राप्त करें?


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: MM: SS.MICROSECONDS समय इकाई प्रारूप का उपयोग होगा:

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 Wiki: FFprobe Tips से हैं

साथ में 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 "With ffmpeg" सेक्शन को देखें ।
ल्लगन

आपका तीसरा समाधान मुझे एक गलत समय देता है, मेरे वीडियो की लंबाई 01:19:00 है लेकिन कमांड ने मुझे समय दिया = 01: 09: 15.32, क्या आपको लगता है कि ऐसा क्यों हो रहा है
utdev

मीडिया स्ट्रीम अवधि के लिए बहुत उपयोगी है। धन्यवाद।
हम Borg

एप्रोबे का उपयोग करने वाले किसी भी व्यक्ति के लिए, पैरामीटर थोड़ा अलग हैं: एप्रोबे -वी त्रुटि -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'

यह सेकंड के अंश भी देगा, यदि यह एक समस्या है तो आप आगे उस प्रक्रिया को कर सकते हैं जो दूर सेड के साथ होती है।


मैं सेकंड का अंश भाग कैसे निकाल सकता / सकती हूं?
टीना जे

@ टीनाज बस इसके साथ पाइप करें 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 के साथ समाधान जो सीधे सेकंड देता है:

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

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

यह एक पूर्णांक मान के रूप में मिलीसेकंड में अवधि को आउटपुट करता है। Grep / cut / sed / ... की कोई आवश्यकता नहीं


धन्यवाद - यह वही था जिसकी मुझे तलाश थी। MacOS के साथ स्थापित किया जा सकता हैbrew install mediainfo
एलेक्स K

0

मुझे कुछ वीडियो फ़ाइलों के साथ कुछ अजीब और गलत मेटाडेटा प्राप्त करने के मुद्दे पर आया था, जिनके साथ मैं काम कर रहा था और मैं ffmpeg, mp4box, ffprobe, mediainfo, mplayer, जैसे कोड और टूल्स का उपयोग करके एक पैटर्न या किसी भी प्रकार के हैंडलिंग को प्राप्त करने में सफल नहीं हो सका। वीडियो की वास्तविक अवधि प्राप्त करने के लिए।

वीडियो की वास्तविक अवधि की पहचान करना एक ऐसी परियोजना के लिए एक आवश्यकता थी जिसे मैं काम कर रहा था और एकमात्र तरीका जो मुझे मिला वह हमेशा सही था कि वीडियो फाइल को ffmpeg का उपयोग करके फिर से लोड किया जाए और एन्कोडेड फ़ाइलों को मूल फ़ाइल के मेटाडेटा की अनदेखी करने के लिए मजबूर किया जाए, जैसे

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

(यह आपकी अपेक्षा से अधिक तेज़ी से चल सकता है। मुझे आश्चर्य हुआ, सामग्री के प्रकार और मेरे द्वारा उपयोग किए जा रहे पर्यावरण पर, औसत समय 2 वर्ष था)

... और फिर अपनी पसंद पर एक उपकरण का उपयोग करके अवधि प्राप्त करें। मुझे mediainfo पसंद है, btw: - "mediainfo FILE --Inform =" वीडियो;% अवधि% "आपको मिलिशों में अवधि प्रदान करता है।


आपने अन्य उत्तरों की तुलना में अधिक जानकारी या बेहतर समाधान नहीं दिया
सैम

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

इसे डिकोड करने में कुछ CPU समय लगेगा, जब तक कि:

[...]

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

अगर आप ACCURATE अवधि चाहते हैं, तो FFmpeg को भूल जाइए। यह केवल filesize और औसत बिटरेट के आधार पर एक अनुमान देता है। मैंने पाया है, किसी मामले में, 2x द्वारा अनुमानित अवधि का समय बंद है!

लिनक्स पर, यदि फ़ाइल केवल उक्त वीडियो रिकॉर्डिंग के दौरान बनाई और संशोधित की जाती है, तो एक वैकल्पिक समाधान यह होगा कि निर्माण और अंतिम संशोधन समय का उपयोग अवधि की गणना के लिए किया जाए, जैसे:

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

5
आपने कहाँ पाया कि ffmpeg गलत है?
अलेब

4
% X अंतिम पहुंच का समय है। % Y अंतिम संशोधन के बाद का समय है। यह वीडियो की लंबाई के बारे में कुछ नहीं कहता है।
जो हिलेंब्रांड

1
यह एक ट्रोल लगता है
जॉर्ज चलबौ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.