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

Вы можете изменить настройки, не выключая аппарат. Просто перейдите к настройкам машины>

Для того, чтобы настройки панели меню вступили в силу, вам нужно выйти из полноэкранного режима, а затем повторно ввести его

1
задан 23 March 2015 в 20:57

1 ответ

Вы можете использовать следующий скрипт, чтобы узнать Total Duration всех видеофайлов в каталоге рекурсивно. Я использовал avprobe в следующем скрипте, который поставляется с libav-tools

Install libav-tools as,

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 .

Как запустить скрипт append -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

Сценарий выглядит следующим образом:

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

6
ответ дан 23 May 2018 в 22:08
  • 1
    будет ли это работать, если файлы не имеют расширений (но все еще являются видеофайлами)? – atulgangwar 23 March 2015 в 22:32
  • 2
    просто используйте for i in $mypath/* вместо for i in $mypath/{*.mp4,*.mkv,*.avi} – souravc 23 March 2015 в 22:36
  • 3
    Хороший сценарий. Он перечисляет все файлы с продолжительностью и общей продолжительностью только в текущем каталоге, но не идет рекурсивным. Кроме того, когда я использую for i in $mypath/*, он перечисляет другие файлы с длительностью 0. Таким образом, приложение отличается от ответа SylvainPineau, но тем не менее полезно :) – atulgangwar 24 March 2015 в 10:08
  • 4
    Может быть добавлен такой вариант, как «-R» для обработки обоих случаев, поскольку может быть полезным только поиск текущего каталога. – atulgangwar 24 March 2015 в 13:56
  • 5
    @AtulGangwar просто просматривает пересмотренный код. надеюсь, это послужит вашей цели. :) – souravc 24 March 2015 в 19:14

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

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