Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 17.06.2015
Сообщений: 2

Изменение существующего скрипта по сдвигу времени в Субтитрах

31.03.2018, 14:14. Показов 1332. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прошу прощения у тех кто в теме, я ВООБЩЕ ничего не понимаю в программировании

Вот скрипт, для смещения временного кода в Субтитрах формат (srt), что не очень важно
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
function moveit
{
    [CmdletBinding(DefaultParameterSetName="Increase")]
 
    Param(
    [parameter(Mandatory=$true)]
    [string]
    $path_original,
 
    [parameter(Mandatory=$true)]
    [string]
    $path_result,
 
    [int]
    $minutes = 0,
 
    [ValidateRange(0,59)]
    [int]
    $seconds = 0,
 
    [parameter(Mandatory=$false, ParameterSetName="Increase")]
    [switch]
    $Increase = $true,
 
    [parameter(Mandatory=$true, ParameterSetName="Decrease")]
    [switch]
    $Decrease
    )
 
    if($Decrease) {$Increase = $false}
 
    $PSCmdlet.ParameterSetName
 
    $offset = New-TimeSpan -Minutes $minutes -Seconds $seconds
 
    $content = Get-Content $path_original
    #[datetime]$refstart = 0
    #[datetime]$refend = 0
 
    Set-Content -Value $null -Path $path_result
 
    foreach($line in $content)
    {
        if($line -match '(?\d\d:\d\d:\d\d,\d\d\d) --> (?\d\d:\d\d:\d\d,\d\d\d)')
        {
            $refstart = [datetime]::Parse($($matches.start -replace ',','.'))
            $refend = [datetime]::Parse($($matches.end -replace ',','.'))
 
            if($Increase)
            {
                $offstart = $refstart+$offset
                $offend = $refend+$offset
            }
            else
            {
                if($refstart.TimeOfDay -lt $offset)
                {
                    $offstart = [datetime]0
                }
                else
                {
                    $offstart = $refstart-$offset
                }
 
                if($refend.TimeOfDay -lt $offset)
                {
                    $offend = [datetime]0
                }
                else
                {
                    $offend = $refend-$offset
                }
            }
 
            Add-Content -Value $("{0:HH:mm:ss,fff} --> {1:HH:mm:ss,fff}" -f $offstart,$offend) -Path $path_result
        }
 
        else
        {
            Add-Content -Value $line -Path $path_result
        }
    }
}
Вот что пишет автор:
Субтитры — замечательная вещь, особенно когда не удается с первых десяти попыток разобрать что же сказал персонаж фильма или сериала сквозь грохот взрывов и скрежет рушащихся зданий. Однако случается так, что субтитры (в частности, те, что находятся в отдельном файле) не совпадают с видеорядом. Если отставание (или наоборот) составляет несколько секунд, то в этом нет ничего ужасного. В большинстве плееров это выправляется нажатием нескольких кнопок. Однако когда отставание составляет уже минуты и для того, чтобы нагнать видеоряд приходится совершить пару сотен нажатий — это несколько другое дело.

Здесь может помочь следующий скрипт.

В нем используются такие вещи как регулярные выражения, функция -f для форматирования данных нужным нам образом, а также статическая функция [datetime]::Parse(). Можно довольно долго рассказывать о каждой из них по-отдельности, поэтому я не буду вдаваться в детали в этом посте, а просто выложу скрипт, а точнее функцию.

Для ее использования нужно указать путь к исходному файлу (параметр path_original), путь к результирующему файлу (path_result), временной промежуток, на который нужно сдвинуть (параметры minutes и seconds), а также в каком направлении нужно сдвинуть субтитры — в сторону увеличения временных меток (Increase — значение по-умолчанию, поэтому явно параметр указывать не обязательно) или в сторону их уменьшения (Decrease).

Вопрос простейший, куда именно надо вписать пути и как ТОЧНО какие символ надо вставить:
Путь оригинала для примера:
J:\!!!4K Vedeo!!!\01.srt
Путь выходного для примера:
J:\!!!4K Vedeo!!!\02.srt

Сдвиг по времени, 1 минута, 20 секунд

Сдвиг не интересен он всегда будет вперед но если напишите как вставить назад будет не плохо.

Просто на примере скрипта этого вставьте мои параметры так чтобы РАБОТАЛО.
Пожалста!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.03.2018, 14:14
Ответы с готовыми решениями:

Изменение Пользователя у существующего Id
Здравствуйте, у меня есть вопрос может кто сталкивался. Имеется ID файл для пользователя ФИО1 как изменить на ФИО2 например это женщина...

Изменение существующего приложения
Не мой был создано простенькое обучающее приложение на c++ builder 6, но сейчас мне нужно изменить его, заменить некоторые фотографии и...

Изменение существующего файла
Может я не верно обозвал тему, но распишу, что мне нужно. Вообщем из личного кабинета, хочу менять к примеру настройки подключения к БД...

2
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
31.03.2018, 20:11
Лучший ответ Сообщение было отмечено Velius как решение

Решение

Цитата Сообщение от Velius Посмотреть сообщение
Просто на примере скрипта этого вставьте мои параметры так чтобы РАБОТАЛО.
Воспользуемся вами же процитированной инструкцией :

Для ее использования нужно указать путь к исходному файлу (параметр path_original), путь к результирующему файлу (path_result), временной промежуток, на который нужно сдвинуть (параметры minutes и seconds), а также в каком направлении нужно сдвинуть субтитры — в сторону увеличения временных меток (Increase — значение по-умолчанию, поэтому явно параметр указывать не обязательно) или в сторону их уменьшения (Decrease)
Для сдвига вперёд, просто добавьте в конце этого скрипта:

PowerShell
1
moveit -path_original 'J:\!!!4K Vedeo!!!\01.srt' -path_result 'J:\!!!4K Vedeo!!!\02.srt' -minutes 1 -seconds 20
А для сдвига назад:

PowerShell
1
moveit -path_original 'J:\!!!4K Vedeo!!!\01.srt' -path_result 'J:\!!!4K Vedeo!!!\02.srt' -minutes 1 -seconds 20 -Decrease
Однако, у меня (PS v5.1) эта функция не работает из-за ошибки - "Нераспознанная конструкция группирования."

А вот если её немного изменить, тогда субтитры действительно сдвигаются:

Кликните здесь для просмотра всего текста
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
function moveit
{
    [CmdletBinding(DefaultParameterSetName="Increase")]
 
    Param(
    [parameter(Mandatory=$true)]
    [string]
    $path_original,
 
    [parameter(Mandatory=$true)]
    [string]
    $path_result,
 
    [int]
    $minutes = 0,
 
    [ValidateRange(0,59)]
    [int]
    $seconds = 0,
 
    [parameter(Mandatory=$false, ParameterSetName="Increase")]
    [switch]
    $Increase = $true,
 
    [parameter(Mandatory=$true, ParameterSetName="Decrease")]
    [switch]
    $Decrease
    )
 
    if($Decrease) {$Increase = $false}
 
    $PSCmdlet.ParameterSetName
 
    $offset = New-TimeSpan -Minutes $minutes -Seconds $seconds
 
    $content = Get-Content $path_original
    #[datetime]$refstart = 0
    #[datetime]$refend = 0
 
    Set-Content -Value $null -Path $path_result
 
    foreach($line in $content)
    {
        if($line -match '(\d\d:\d\d:\d\d,\d\d\d) --> (\d\d:\d\d:\d\d,\d\d\d)')
        {
            $refstart = [datetime]::Parse($($matches[1] -replace ',','.'))
            $refend = [datetime]::Parse($($matches[2] -replace ',','.'))
 
            if($Increase)
            {
                $offstart = $refstart+$offset
                $offend = $refend+$offset
            }
            else
            {
                if($refstart.TimeOfDay -lt $offset)
                {
                    $offstart = [datetime]0
                }
                else
                {
                    $offstart = $refstart-$offset
                }
 
                if($refend.TimeOfDay -lt $offset)
                {
                    $offend = [datetime]0
                }
                else
                {
                    $offend = $refend-$offset
                }
            }
 
            Add-Content -Value $("{0:HH:mm:ss,fff} --> {1:HH:mm:ss,fff}" -f $offstart,$offend) -Path $path_result
        }
 
        else
        {
            Add-Content -Value $line -Path $path_result
        }
    }
            
}
0
0 / 0 / 0
Регистрация: 17.06.2015
Сообщений: 2
31.03.2018, 20:31  [ТС]
Огромное спасибо.
Проверил все работает!!!!!!!!!!!!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.03.2018, 20:31
Помогаю со студенческими работами здесь

Изменение DbGrid и добавление существующего товара
Всем привет. Вообщем есть база товаров магазина на хостинге (Mysql) есть сервер клиент (Delphi, ZEOS) подключение итд все...

Создание безразмерного массива. Изменение границ уже существующего
Всем привет. Такая задачка. Есть текстовый файл. Считываю все его в массив string. string str = File.ReadAllLines(path); Затем мне...

Автосчет по сдвигу вправо
Всем доброго времени суток. Есть первая таблица - вертикальная. Нужно посчитать вторую - горизонтальную, но по вертикальным значениям. ...

Запуск скрипта по времени
Здравствуйте! Подскажите пожалуйста: необходимо каждый день делать запрос к другому сайту, парсить XML и заполнять БД, как автоматически...

Применении скрипта по времени
Может кто подкинуть скрипт такой что бы другой скрипт заработал тогда когда ты укажешь ?? ну допусти я надыбал вот это <script...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru