Saniye cinsinden video süresi nasıl elde edilir?


69

Video süresini saniyeler içinde nasıl alabilirim?

Ne denedim:

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

Bu ne yakın, ama o kadar doğru değil, 2383 39.71 dakika

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

Yanıtlar:


36

Dakikaları almak için 2383 saniyeyi 60'a bölmek zorundasınız.

39.7167

ve sonra kalan saniyeleri elde etmek için fraksiyonel kısmı olan 1716'yı 60 ile çarpın.

43.002

Yani 39 dakika, 43 saniye. Uygulama size doğru bir değer veriyor gibi görünüyor.


96

Sadece ffprobedoğrudan kullanın . Gerek yok sed, grepvb birçok "süreler" Eğer (girişinizi bağlı olarak) elde edebilirsiniz vardır.

Biçim (konteyner) süresi

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

30.024000

Bu -sexagesimalseçeneği eklemek HOURS: MM: SS.MICROSECONDS zaman birimi biçimini kullanır:

0:00:30.024000

Video akışı süresi

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

Yukarıdaki komutlar FFmpeg Wiki'den alınmıştır: FFprobe Tips .

İle ffmpeg

Kap veya akış süresinin eksik veya yanlış olduğunu (muhtemelen zarar görmüş veya kesilmiş bir dosya nedeniyle) bulursanız, girişi tamamen çözmeniz gerekebilir.

$ 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

Bu örnekte time=00:01:03.48süre:

Bunun ne kadar süreceği elbette, girişinizin kod çözme karmaşıklığına ve süresine ve bilgisayarınızın özelliklerine bağlı olacaktır.


Bunlar işe yaramaz .m2v dosyaları için onlar için de bir çözüm var
utdev

@utdev "With ffmpeg" bölümüne bakın.
lgagan

Üçüncü çözümünüz bana yanlış zaman veriyor, videomun uzunluğu 01:19:00, ancak komut bana zaman veriyor = 01: 09: 15.32, bunun neden olduğunu tahmin ediyor
musunuz

Medya akışı süresi çok yararlı. Teşekkür ederim.
Biz

Avprobe kullanan herkes için parametreler biraz farklıdır: avprobe -v error -show_format_entry süresi. \ Sample.mp4
Brad

32

Eğer varsa ffmpeg, şunları da yapmalısınız ffprobe:

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

Bu aynı zamanda saniye kesirleri verir, eğer bir problemse onu sed ile daha da işleyebilirsiniz.


saniyenin kesir kısmını nasıl kaldırabilirim?
Tina J

@TinaJ Sadece printf, gibi | xargs printf %.0f- bu boru bir tamsayı değeri döndürür.
Ilia Rostovtsev

3

Benim ffmpeg-0.6.5-1.el6.rf.x86_64 için sadece ikinci olan ffprobe komut formatı şudur:

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

saniyenin kesir kısmını nasıl kaldırabilirim?
Tina J

3

Doğrudan saniye veren mplayer ile çözüm:

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

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

Bu, süreyi milisaniye cinsinden tek bir tam sayı değeri olarak verir. Grep / cut / sed / ... uygulamasına gerek yok


Teşekkürler - bu tam aradığım şeydi. brew install mediainfo
Alex K

0

Çalıştığım bazı video dosyalarından bazı garip ve yanlış meta veriler alma sorunuyla karşılaştım ve ffmpeg, mp4box, ffprobe, mediainfo, mplayer, gibi kodları ve araçları kullanarak bir kalıp veya herhangi bir işlem türü bulabildim. videonun gerçek süresini elde etmek için.

Videonun gerçek süresinin belirlenmesi, çalıştığım bir proje için bir gereklilikti ve bunu her zaman doğru bulmanın tek yolu ffmpeg kullanarak ve orijinal dosyanın meta verilerini yok saymak için kodlanmış dosyaları zorlamaktı.

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

(Bu beklediğinizden daha hızlı olabilir. İçeriğin türü ve kullandığım ortam için ortalama süre 2 saniye idi.

... ve daha sonra istediğiniz bir aracı kullanarak zaman kazanın. Mediainfo'yu seviyorum, btw: - "mediainfo FILE --Inform =" Video;% Duration% ", milisaniye cinsinden size zaman kazandırır.


Diğer cevaplardan daha fazla bilgi ya da daha iyi bir çözüm
Sam

0

Yalnızca meta verileri sorgulamanız gerekiyorsa:

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

[...]

streams.stream.0.duration="5221.146009"

[...]

Böylece ayrıştırabilirsiniz:

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)

Ancak, etkili kapsayıcıların süresini almak istiyorsanız kodunu çözmeniz gerekir:

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

Kodunu çözmek biraz zaman alabilir:

[...]

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

Ardından, onu çözümleyebilirsiniz:

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 süresi istiyorsanız, FFmpeg'i unutma. Yalnızca dosya boyutuna ve ortalama bit hızına göre bir tahmin verir. Bazı durumlarda, tahmini sürenin 2 kat azaldığını buldum!

Linux'ta, yalnızca söz konusu video kaydı sırasında dosya oluşturulur ve değiştirilirse, alternatif bir çözüm, süreyi hesaplamak için oluşturma ve son değiştirme zamanını aşağıdaki gibi kullanmaktır:

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

5
Bu ffmpeg'in yanlış olduğunu nereden buldun?
aleb

4
% X, son erişim zamanı. % Y, son değiştirilme tarihinden bu yana geçen zamandır. Bu video uzunluğu hakkında hiçbir şey söylemez.
Joe Hillenbrand,

1
Bu bir trol gibi görünüyor
George Chalhoub
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.