Общее время видео в каталоге

Существует ли сценарий (bash, python и т. Д.), Который выводит общее время продолжительности всех видеофайлов в каталоге (рекурсивно)?

Например, при выполнении следующего:

script mypath

он дает x minutes/hours.

7
задан 23 March 2015 в 19:57

2 ответа

Первая установка mediainfo с:

sudo apt-get install mediainfo

Можно теперь использовать следующую остроту для получения общего видео времени каталога:

find . -type f -exec mediainfo --Inform="General;%Duration%" "{}" \; 2>/dev/null | awk '{s+=$1/1000} END {h=s/3600; s=s%3600; printf "%.2d:%.2d\n", int(h), int(s/60)}'

find команда будет звонить mediainfo для каждого файлы рекурсивно и получают видео продолжительность в мс.

Затем awk часть суммирует те значения и возвратит общее время в HH:MM формат.


Обновление: avprobe действительно быстрее, чем mediainfo (спасибо @souravc)

Поскольку лучшие результаты используйте команду ниже вместо этого (Вы должны будете sudo apt-get install libav-tools сначала)

find . -type f -exec avprobe -v quiet -show_format_entry duration "{}" \; | awk '{s+=$1} END {h=s/3600; s=s%3600; printf "%.2d:%.2d\n", int(h), int(s/60)}'
9
ответ дан 23 March 2015 в 19:57

Можно использовать следующий сценарий для знания Общей Продолжительности всех видеофайлов в Каталоге рекурсивно. Я использовал avprobe в следующем сценарии, который идет libav-tools

Установка libav-tools как,

sudo apt-get install libav-tools

Сохраните сценарий как get_video_duration.sh(сказать). Дайте ему разрешение выполнения от терминала как

chmod u+x get_video_duration.sh

Как запустить скрипт

Знать общую видео продолжительность каталога /full/path/to/videodir, выполненный с аргументом как

./get_video_duration.sh /full/path/to/videodir

Или знать общую видео продолжительность текущего каталога, выполненного без любого аргумента как

./get_video_duration.sh .

Поскольку Рекурсия добавляет -R или -r или -recursive или --recursive после пути к каталогу. Например, знать общую видео продолжительность каталога /full/path/to/videodir рекурсивно (также ищут все папки внутри /full/path/to/videodir)

./get_video_duration.sh /full/path/to/videodir -R

Сценарий как следует:

#!/bin/bash
mysep="======================================================================================"
mysmallsep="--------------------------------------------------------------------------------------"
if [ -n "$1" ];then
    mypath="$1"
else
    mypath="$(pwd)"
fi
declare -a my_path_array
get_duration(){
    /usr/bin/avprobe "$1" 2>&1 | grep Duration | awk -F[:,] '{print int($2*3600+$3*60+$4)}'
}
print_duration(){
    awk -v var="$1" 'BEGIN {print int(var/3600)"Hr "int((var%3600)/60)"Min "int(var%60)"Sec "}'
}
execute_it_now(){
    echo -e "Video File\t\tVideo Duration"
    echo $mysep
    echo "$1"
    echo $mysmallsep
    j=0
    for i in "$1"/{*.mp4,*.mkv,*.avi,*.flv} ## Put the existing video file extension you have
    do
        if [[ "$(get_duration "$i")" -ne "0" ]];then
            echo -e "$(basename "$i")\t$(tput setaf 2)$(print_duration $(get_duration "$i"))$(tput sgr0)"
        fi
        let j=j+$(get_duration "$i") 2>/dev/null
    done
    echo $mysep
    echo "Total Duration $(tput setaf 1)$(print_duration $j)$(tput sgr0)"
}
execute_these_now(){
    for i in "$1"/{*.mp4,*.mkv,*.avi,*.flv} ## Put the existing video file extension you have
    do
        if [[ "$(get_duration "$i")" -ne "0" ]];then
            echo -e "$(basename "$i")\t$(tput setaf 2)$(print_duration $(get_duration "$i"))$(tput sgr0)"
        fi
    done
}
add_these_now(){
    j=0;
    for i in "$1"/{*.mp4,*.mkv,*.avi,*.flv} ## Put the existing video file extension you have
    do
        let j=j+$(get_duration "$i") 2>/dev/null
    done
    echo $j
}
case "$2" in
        -R|-r|-recursive|--recursive) 
        tmp=$(find $mypath -type d | xargs)
        my_path_array=( $tmp )
        echo -e "Video File\t\tVideo Duration"
        echo $mysep
        k=0;
        for indx in $(seq ${#my_path_array[@]})
    do
            echo ${my_path_array[$(($indx-1))]}
            echo $mysmallsep
            execute_these_now ${my_path_array[$(($indx-1))]}
            let k=k+$(add_these_now ${my_path_array[$(($indx-1))]})
    done
        echo $mysep
        echo "Total Duration $(tput setaf 1)$(print_duration $k)$(tput sgr0)"
           ;;
        *) 
            execute_it_now $mypath
           ;;
esac

Снимок экрана выполнения сценария

enter image description here

Примечание: Поскольку у меня нет никого .mkv или .avi файл в моем корневом каталоге длится, две строки в снимке экрана появились с продолжительностью 0Hr 0Min 0Sec

6
ответ дан 23 March 2015 в 19:57

Другие вопросы по тегам:

Похожие вопросы: