Вопрос или проблема
Я вижу длительность в проводнике Windows, но у меня есть 124 файла. Я предпочел бы не суммировать их вручную. У меня есть ffmpeg
и VLC, если это поможет.
Я пытался выбрать все и нажать Свойства > Подробности, но общая длительность не отображалась. Хорошо, я вижу, что выбрал два файла субтитров VTT. Я снял выбор с файлов VTT и снова перешел в Свойства > Подробности, и теперь вижу общую длительность 71 час. (Не знаю, что такое панель Windows.)
Я думаю, что этот вопрос очень похож на заданный ранее Как получить длительность видео в секундах?
С помощью следующей команды вы можете получить длительность заданного видеофайла (например, file1.mp4):
ffmpeg -i file1.mp4 2>&1 | grep "Duration" | cut -f4 -d' ' | cut -f1 -d','
С помощью цикла for
легко получить длительность каждого файла:
for f in *.mp4; do
ffmpeg -i $f 2>&1 | grep "Duration" | cut -f4 -d' ' | cut -f1 -d','
done
Затем их можно суммировать с помощью любого внешнего инструмента для работы с таблицами (например, Excel). Если вы настаиваете на использовании командной строки для получения общей длительности, вы все равно можете обратиться к методу, указанному в Как получить длительность видео в секундах?, чтобы преобразовать каждую длительность в секунды, а затем сложить все секунды.
ИЗМЕНЕНИЕ:
Так как вы упомянули проводник Windows, предполагаю, что вы используете только Windows, и вот ниже приведены чисто основанные на Windows (и ffmpeg, как вы уже упомянули) решения (возможно, вам нужно будет указать путь к ffmpeg):
for %f in (*.mp4) do @ffmpeg -i %f 2>&1 | findstr Duration > result.txt
Результат будет выглядеть так:
Duration: 00:00:18.20, start: 0.000000, bitrate: 17085 kb/s Duration: 00:00:45.12, start: 0.000000, bitrate: 16913 kb/s Duration: 00:00:41.93, start: 0.000000, bitrate: 17083 kb/s
Снова, с помощью Excel вы можете легко разделить часть длительности и сложить их. Или вы можете обратиться к https://stackoverflow.com/questions/4441827/windows-command-for-cutting-columns-from-a-text, чтобы использовать командную строку Windows только для получения длительности.
В зависимости от типа видеофайла, если это, скажем, видеофайл mp4, то выбирайте видео, щелкая одно, +CTRL, затем другое, затем еще одно, пока не закончите, все время удерживая кнопку CTRL. Или CTRL+A, чтобы выбрать все видео в папке. Затем общая длительность будет отображена в панели сведений окна, как у одного видеофайла.
Я не понимаю, почему вы все сказали ему это 8 лет назад.
Чтобы получить свою длительность.
Просто откройте проводник Windows, выберите директорию, в которой находится ваше видео.
Переместите мышь к заголовку окна проводника файлов.
Щелкните правой кнопкой мыши, вы получите меню заголовка с опциями размера и частичным списком опций заголовка.
Переместите мышь к “Дополнительно” и щелкните. Это приведет вас к дополнительным вариантам маркировки. Найдите “длительность“. Это то, что вам нужно, щелкните это. Это скажет вам длительность вашего видео, к сожалению, это не работает для gif-видео.
Вы можете переместить метку длительности в любое место вдоль заголовка.
Надеюсь, это поможет спустя восемь лет.
Если вы хотите программно рассчитать длину, вы можете использовать это, чтобы получить длительность каждого файла и затем сложить.
function Get-VideoDuration {
param (
[string]$Path
)
$columnNumber = 27 # Отрегулируйте это число в зависимости от вашей системы, если необходимо
$shell = New-Object -COMObject Shell.Application
$folder = Split-Path $Path
$file = Split-Path $Path -Leaf
$shellfolder = $shell.Namespace($folder)
$shellfile = $shellfolder.ParseName($file)
$duration = $shellfolder.GetDetailsOf($shellfile, $columnNumber) # Длительность в формате чч:мм:сс
[timespan]::Parse($duration)
}
function Get-TotalVideoDuration {
param (
[string[]]$Paths
)
[timespan]$totalDuration = 0
foreach ($path in $Paths) {
$totalDuration += Get-VideoDuration -Path $path
}
$totalDuration
}
Конечно, вы можете повторно использовать объекты $shellfolder
и $shellfolder
, чтобы оптимизировать случай получения файлов в одной папке. Я опущу это здесь для простоты.
Чтобы использовать это, вы можете вызвать так:
$videoFiles = @("C:\path\to\video1.mp4", "C:\path\to\video2.mp4", "C:\path\to\video3.mp4")
$totalSeconds = Get-TotalVideoDuration -Paths $videoFiles
Write-Output "Общая длительность для $videoFiles: $($totalSeconds.TotalSeconds))"
$videoFiles = Get-ChildItem C:\path\*.mp4
$totalSeconds = Get-TotalVideoDuration -Paths $videoFiles
Write-Output "Общая длительность для $videoFiles: $($totalSeconds.TotalSeconds))"
Ответ или решение
Чтобы определить общее время воспроизведения видеофайлов в директории, существует несколько методов, каждый из которых имеет свои особенности и может использовать различные инструменты. Рассмотрим несколько наиболее эффективных подходов:
1. Использование FFmpeg в командной строке
FFmpeg — мощный инструмент для работы с мультимедийными файлами, который позволяет извлекать информацию о видеофайлах, включая их продолжительность.
Шаги:
- Откройте командную строку (cmd).
- Перейдите в директорию с видеофайлами. Для этого используйте команду:
cd C:\path\to\your\videos
- Выполните следующую команду для получения длительности каждого видеофайла:
for %f in (*.mp4) do @ffmpeg -i "%f" 2>&1 | findstr "Duration" >> result.txt
В результате в файл result.txt
будут записаны продолжительности каждого видео.
Примечание: Не забудьте заменить *.mp4
на нужный формат, если у вас есть другие типы видеофайлов.
2. Суммирование длительностей через PowerShell
Если вы предпочитаете использовать PowerShell, вы можете создать скрипт для получения общей длительности:
Шаги:
- Запустите PowerShell.
- Введите следующий код:
function Get-VideoDuration {
param (
[string]$Path
)
$columnNumber = 27 # Этот номер может потребоваться изменить в зависимости от вашей системы
$shell = New-Object -COMObject Shell.Application
$folder = Split-Path $Path
$file = Split-Path $Path -Leaf
$shellfolder = $shell.Namespace($folder)
$shellfile = $shellfolder.ParseName($file)
$duration = $shellfolder.GetDetailsOf($shellfile, $columnNumber) # Длительность в формате hh:mm:ss
return [timespan]::Parse($duration)
}
function Get-TotalVideoDuration {
param (
[string[]]$Paths
)
[timespan]$totalDuration = 0
foreach ($path in $Paths) {
$totalDuration += Get-VideoDuration -Path $path
}
return $totalDuration
}
# Получаем список всех видеофайлов
$videoFiles = Get-ChildItem -Path "C:\path\to\your\videos\*.mp4"
$totalDuration = Get-TotalVideoDuration -Paths $videoFiles
Write-Output "Общее время воспроизведения: $($totalDuration)"
Этот скрипт автоматически получает длительности всех видео в указанной директории и выводит общее время воспроизведения.
3. Использование Windows Explorer
Для более простого метода, если вы не хотите использовать командную строку или PowerShell:
- Откройте проводник Windows и перейдите в директорию с видеофайлами.
- Выделите все нужные файлы (с помощью
Ctrl+A
или удержаниемCtrl
и кликая мышью по каждому файлу). - Правый клик и выберите "Свойства". В панели "Сведения" введите "Длительность". Если элемент не отображается, его можно добавить через "Дополнительно".
Заключение
Каждый из рассмотренных методов позволяет эффективно подсчитать общее время воспроизведения видеофайлов в директории. Используйте тот способ, который наиболее удобен для ваших нужд — будь то командная строка, PowerShell или графический интерфейс Windows. При использовании FFmpeg и PowerShell вы получите более гибкие инструменты для работы с данными, позволяющие не только подсчитать длительность, но и обрабатывать данные более глубоко.