Как мне узнать общее время воспроизведения видео в директории?

Вопрос или проблема

Я вижу длительность в проводнике 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 вы получите более гибкие инструменты для работы с данными, позволяющие не только подсчитать длительность, но и обрабатывать данные более глубоко.

Оцените материал
Добавить комментарий

Капча загружается...