Существует ли сценарий (bash, python и т. Д.), Который выводит общее время продолжительности всех видеофайлов в каталоге (рекурсивно)?
Например, при выполнении следующего:
script mypath
он дает x minutes/hours
.
Первая установка 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)}'
Можно использовать следующий сценарий для знания Общей Продолжительности всех видеофайлов в Каталоге рекурсивно. Я использовал 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
Снимок экрана выполнения сценария
Примечание: Поскольку у меня нет никого .mkv
или .avi
файл в моем корневом каталоге длится, две строки в снимке экрана появились с продолжительностью 0Hr 0Min 0Sec