LINUX.ORG.RU

Скрипт для подсчета общего времени всех видео файлов в папке

 , ,


0

1

Есть скрипт, который подсчитывает общее время всех видео файлов в папке, используя mplayer

find . -type f \( -iname "*.avi" -o -iname "*.mp4" -o -iname "*.flv" -o -iname "*.mov" -o -iname "*.mkv" -o -iname "*.m4v" -o -iname "*.wmv" \) -print0 | \
xargs -0 mplayer -vo dummy -ao dummy -identify 2>/dev/null | \
perl -nle '/ID_LENGTH=([0-9\.]+)/ && ($t +=$1) && printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60' | \
tail -n 1

Скрипт выводит часы:минуты:секунды

Может у кого-нибудь есть скрипт для подсчета общего времени всех видео файлов в папке, без используя mplayer и без X11?

Заранее спасибо.

без используя mplayer?

а используя что и чем это будет лучше имеющегося?

можно заменить mplayer на mpv, в нём вроде даже есть свойство duration. задача решена.

mos ★★★★★ ()
% ffprobe videofile.mp4

  Duration: 00:41:07.38, start: 0.000000, bitrate: 1269 kb/s

% ffprobe videofile.mp4 2>&1 | awk -F'[:,]' '/Duration/ {printf("h=%d m=%d s=%g\n", $2,$3,$4)}'

h=0 m=41 s=7.38
futurama ★★ ()

Довольно-таки странное желание использовать для этой цели mplayer.

ritsufag ★★★★★ ()
Ответ на: комментарий от futurama

Что-то не хочет.. Вот скрипт


find -type f \( -iname "*.avi" -o -iname "*.mp4" -o -iname "*.flv" -o -iname "*.mov" -o -iname "*.mkv" -o -iname "*.m4v" -o -iname "*.wmv" -o -iname "*.ts" \) -print0 | \
xargs -0 ffmpeg -i 2>&1 | grep Duration | awk '{print $2}' | tr -d , | \
perl -nle '/ID_LENGTH=([0-9\.]+)/ && ($t +=$1) && printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60' | \
tail -n 1

[/bash]
chemtech ()
Ответ на: комментарий от anonymous

сам курнуть пробовал? Один хрен какой Writer, все-равно парсить строку Duration:

futurama ★★ ()
Ответ на: комментарий от futurama

Когда-то давно да, так что ещё курни -show_streams.

anonymous ()
$ mediainfo --Inform="Video;%Duration/String3%\n" /mnt/data/Media/Video/Clips/* | awk '{ split($1, tm, ":"); secs += tm[3]; mins += tm[2] + int(secs / 60); hrs += tm[1] + int(mins / 60); secs %= 60; mins %= 60; } END { printf "%d:%d:%d\n", hrs, mins, secs; }'
14:18:45
Lavos ★★★★★ ()
Ответ на: комментарий от futurama

Переделал скрипт:

find -type f \( -iname "*.avi" -o -iname "*.mp4" -o -iname "*.flv" -o -iname "*.mov" -o -iname "*.mkv" -o -iname "*.m4v" -o -iname "*.wmv" -o -iname "*.ts" \) \
-exec ffprobe -i "{}" -show_entries format=duration -v quiet -of csv="p=0" \; | paste -sd+ | bc

На выходе сумма в секундах. Осталось перевести ее в часы:минуты:секунды

chemtech ()
Ответ на: комментарий от chemtech
find -type f \( -iname "*.avi" -o -iname "*.mp4" -o -iname "*.flv" -o -iname "*.mov" -o -iname "*.mkv" -o -iname "*.m4v" -o -iname "*.wmv" -o -iname "*.ts" \) \
-exec ffprobe -i "{}" -show_entries format=duration -v quiet -of csv="p=0" \; | paste -sd+ | bc | awk -v "S=456" '{printf "%dh:%dm:%ds",S/(60*60),S%(60*60)/60,S%60}'
chemtech ()
Последнее исправление: chemtech (всего исправлений: 1)
Ответ на: комментарий от anonymous

Раз уж ты курил уже, то напрягись и выдохни готовый пример.

futurama ★★ ()

Вот, специально для тебя написал, ну и самому было интересно:

#!/usr/bin/zsh

total_duration=0
total_count=0

echo "Video files:"

for f in *; do
    if { file -b --mime-type $f | grep '^video' >/dev/null; } then
        duration=$(ffprobe -show_format $f 2>/dev/null | grep '^duration=' | sed 's/duration=//')
        total_duration=$[total_duration + duration]
        total_count=$[total_count + 1]
        hms=$(date -u -d @$duration +%T.%N)
        echo -e "    $f\t- $duration seconds  or $hms h:m:s"
    fi
done

echo
echo "Video files count: $total_count"
hms=$(date -u -d @$total_duration +%T.%N)
echo "Joint duration: $total_duration seconds  or $hms h:m:s"

Нужен zsh для арифметики с плавающей точкой. Если у тебя не zsh, то либо используй bc, либо округляй до секунд.

Вроде работает. Если нет, то мне насрать )

anonymous ()
Ответ на: комментарий от Lavos
$ find . -type f -exec mediainfo --Inform="General;%Duration%" {} \; | paste -sd+ | bc

результат в миллисекундах. Мне кажется им проще оперировать.

conformist ★★★ ()
Ответ на: комментарий от conformist

Понять не могу почему не правильно считает Ниже скрипт считает правильно

find -type f \( -iname "*.avi" -o -iname "*.mp4" -o -iname "*.flv" -o -iname "*.mov" -o -iname "*.mkv" -o -iname "*.m4v" -o -iname "*.wmv" -o -iname "*.ts" \) -print0 | \
xargs -0 mplayer -vo dummy -ao dummy -identify 2>/dev/null | \
perl -nle '/ID_LENGTH=([0-9\.]+)/ && ($t +=$1) && printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60' | \
tail -n 1
А вот этот скрипт считает неправильно
find -type f \( -iname "*.avi" -o -iname "*.mp4" -o -iname "*.flv" -o -iname "*.mov" -o -iname "*.mkv" -o -iname "*.m4v" -o -iname "*.wmv" -o -iname "*.ts" \) \
-exec mediainfo --Inform="General;%Duration%" "{}" \; | paste -sd+ | bc -l | awk 'S=$1; {printf "%dh:%dm:%ds\n",S/(3600),(S/60)%60,S%60}'

chemtech ()
Ответ на: комментарий от chemtech

Ну вот, на скорую руку:

#!/bin/bash
convertsecs() {
        ((h=${1}/3600))
        ((m=(${1}%3600)/60))
        ((s=${1}%60))
        printf "%02d:%02d:%02d\n" $h $m $s
}
len=$(find "$1" -type f -exec mediainfo --Inform="General;%Duration%" {} \; | paste -sd+ | bc)
echo $(convertsecs $(($len/1000)))
Понятно, что можно изящнее, но считает правильно.

conformist ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.