1

Тема: VBS: скрипт пакетной обработки видеофайлов в Avidemux

Нашел батничек пакетной обработки видео из командной строки в Avidemux:

FOR /L %%a IN (1,1,7) DO "C:\Program Files\Avidemux 2.5\avidemux2_cli.exe"  --force-alt-h264 --load "d:\kino\Arere - 0%%a.avi" --audio-codec MP3 --audio-bitrate 96  --save "g:\Arere - 0%%a.avi" --quit

ну и решил сделать vbs-скрипт пакетной обработки видеофайлов в папке.
Первая проба простой обработки работает нормально:

Dim WSHShell
Set WSHShell = WScript.CreateObject("WScript.Shell")
WSHShell.Run("""C:\Program Files\Avidemux 2.5\avidemux2_cli.exe""  --force-alt-h264 --load ""d:\kino\Arere - 22.avi"" --audio-codec MP3 --audio-bitrate 96  --save ""g:\Arere - 22.avi"" --quit")

А вот в пакетном режиме, запускается сразу столько окон сколько файлов в папке. Т.е надо дождаться окончания одного цикла, а потом уж запускать следущий. Как? И файлы с пробелами в названии не обрабатывает

input = "g:\222\"            'папка input
output= "g:\"            'папка output
i=0

Dim WSHShell

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set WSHShell = WScript.CreateObject("WScript.Shell")

RecursiveFolderScan input

Msgbox "ВСЕ! Обработано "& i &" файлов"



'Создаём процедуру рекурсивного обхода каталога
Sub RecursiveFolderScan(FolderPath)
    'Получаем объектную модель текущего каталога
    Set Folder = objFSO.GetFolder(FolderPath)
 
    'Перебираем все файлы в текущем каталоге
    For Each File in Folder.Files

WSHShell.Run("""C:\Program Files\Avidemux 2.5\avidemux2_cli.exe""  --force-alt-h264 --load "+File+" --audio-codec MP3 --audio-bitrate 96  --save "+output+File.Name+" --quit")

i=i+1        'счетчик файлов
    Next
 
    'Перебираем все подкаталоги в каталоге
    For Each SubFolder in Folder.SubFolders
        RecursiveFolderScan(SubFolder.Path)
    Next

Set WSHShell = Nothing

End Sub

Спецы, посмотрите, пожалуйста, какие есть ошибки со стороны моего vbs-кода? Или это уже глюки Avidemux?
Может лучше сделать через Exec, а не через Run? Просто не вижу разницы между ними.

2 (изменено: Rom5, 2012-11-19 23:11:40)

Re: VBS: скрипт пакетной обработки видеофайлов в Avidemux


Синтаксис:
WshShell.Run (strCommand, [intWindowStyle], [blnWaitOnReturn])

Метод Run создает новый процесс и выполняет strCommand в окне, имеющем стиль intWindowStyle

Параметры:

strCommand - Переменные окружения в границах strCommand расширяются автоматически

intWindowStyle - Это значение, в которое устанавливается wShowWindow - элемент структуры STARTUPINFO для нового процесса. Может принимать следующие значения:
Название  Величина Значение
SW_HIDE  0  Прячет окно и активирует другое окно
SW_MINIMIZE   6 Минимизирует указанное окно и активирует следующее окно верхнего уровня в Z порядке
SW_RESTORE   9  Активирует и показывает окно. Если окно минимизировано или максимизировано, Windows восстанавливает его первоначальный размер и положение. Приложение должно задать этот флаг, если восстанавливается минимизированное окно.
SW_SHOW  5  Активизирует и показывает окно с его текущими положением и размерами
SW_SHOWMAXIMIZED  3  Активизирует окно и показывает его максимизированным
SW_SHOWMINIMIZED  2  Активизирует окно и показывает его минимизированным
SW_SHOWMINNOACTIVE  7  Показывает окно минимизированным. Активное окно остается активным
SW_SHOWNA  8  показывает окно в его текущем состоянии. Активное окно остается активным
SW_SHOWNOACTIVATE  4  Показывает окно с его последними размерами и положением. Активное окно остается активным
SW_SHOWNORMAL  1  Активизирует и показывает окно. Если оно было минимизировано или максимизировано, Windows восстанавливает его первоначальные размер и положение

blnWaitOnReturn  - Если blnWaitOnReturn не задан или равен FALSE, метод немедленно возвращается для продолжения выполнения скрипта, не ожидая завершения выполнения процесса.

Если blnWaitOnReturn установлен в TRUE, метод Run возвращает любой код ошибки, переданный приложением.
Если blnWaitOnReturn не задан или равен FALSE, метод Run возвращает код ошибки 0

----
Т.е. попробуйте дополнить строку

WSHShell.Run("""C:\Program Files\Avidemux 2.5\avidemux2_cli.exe""  --force-alt-h264 --load "+File+" --audio-codec MP3 --audio-bitrate 96  --save "+output+File.Name+" --quit")

еще парой параметров:

WSHShell.Run("""C:\Program Files\Avidemux 2.5\avidemux2_cli.exe""  --force-alt-h264 --load "+File+" --audio-codec MP3 --audio-bitrate 96  --save "+output+File.Name+" --quit", 1, True)
WBR. Roman

3

Re: VBS: скрипт пакетной обработки видеофайлов в Avidemux

griha09 пишет:

Может лучше сделать через Exec, а не через Run? Просто не вижу разницы между ними.

«.Exec()» позволяет точно контролировать ход исполнения процесса, даёт доступ к его stdin/stdout/stderr. «.Run()» — нет, только ждать/не ждать завершения запущенного процесса, зато позволяет управлять начальным состоянием окна.

4 (изменено: griha09, 2012-11-20 06:50:41)

Re: VBS: скрипт пакетной обработки видеофайлов в Avidemux

Сделал по вашему совету

WSHShell.Run("""C:\Program Files\Avidemux 2.5\avidemux2_cli.exe""  --force-alt-h264 --load "+File+" --audio-codec MP3 --audio-bitrate 96  --save "+output+File.Name+" --quit", 1, True)

вылезла
Ошибка: Недопустимо использование скобок при вызове процедуры Sub
Код: 800A0414

И даже когда добавил эти параметры в одиночную, без цикла, обработку тоже матерится. Убрал скобки, все работает

WSHShell.Run """C:\Program Files\Avidemux 2.5\avidemux2_cli.exe""  --force-alt-h264 --load "+File+" --audio-codec MP3 --audio-bitrate 96  --save "+output+File.Name+" --quit",1,True

но файлы с пробелом в пути по-прежнему не обрабатывает.

5

Re: VBS: скрипт пакетной обработки видеофайлов в Avidemux

Попробуйте так:

WSHShell.Run """C:\Program Files\Avidemux 2.5\avidemux2_cli.exe"" --force-alt-h264 --load """ & File & """ --audio-codec MP3 --audio-bitrate 96 --save """ & output & File.Name & """ --quit", 1, True

6

Re: VBS: скрипт пакетной обработки видеофайлов в Avidemux

УРАААААаа! Заработала! А можно спросить почему надо тройные кавычки

""" & File & """

а не одинарные?

"& File &"

7

Re: VBS: скрипт пакетной обработки видеофайлов в Avidemux

В первых тройных кавычках последние (третьи) кравычки - это завершающие кавычки предыдущего строкового выражения, а пара кавычек перед ними (первые и вторые) обозначают "замаскированный" символ кавычек, который войдет последним в качестве простого символа в ту строку. Дальше (вторая тройка) наоборот - первые кавычки открывают строку, а пара кавычек за ней обозначают замаскированный символ.
Т.о. в общую сформированную строку значение из переменной "File" попадает как бы в обрамленном кавычками виде - что и надо для длинных имен.

WBR. Roman

8

Re: VBS: скрипт пакетной обработки видеофайлов в Avidemux

Выделенное красным превращается в результате исполнения в одну кавычку:

WSHShell.Run """C:\Program Files\Avidemux 2.5\avidemux2_cli.exe"" --force-alt-h264 --load """ & File & """ --audio-codec MP3 --audio-bitrate 96 --save """ & output & File.Name & """ --quit", 1, True

Только это не маскировка символов, а удвоение. Маскировки в строках VBScript нет, в отличие от JScript.

Переменная «strVar»:

strVar = """"

будет состоять из одного символа — «"».

9

Re: VBS: скрипт пакетной обработки видеофайлов в Avidemux

Спасибо!

10 (изменено: Barus2010, 2016-02-19 19:42:50)

Re: VBS: скрипт пакетной обработки видеофайлов в Avidemux

Использовал Avidemux с кодом взятым в этой теме :

input = "d:\101\"            'папка input
output= "d:\102\"            'папка output
i=0
Dim WSHShell
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set WSHShell = WScript.CreateObject("WScript.Shell")
RecursiveFolderScan input
Msgbox "ВСЕ! Обработано "& i &" файлов"


'Создаём процедуру рекурсивного обхода каталога
Sub RecursiveFolderScan(FolderPath)
    'Получаем объектную модель текущего каталога
    Set Folder = objFSO.GetFolder(FolderPath)
    'Перебираем все файлы в текущем каталоге
    For Each File in Folder.Files
WSHShell.Run """C:\Program Files (x86)\Avidemux 2.6 - 32 bits\avidemux.exe"" --load """ & File & """ --video-Codec Copy --audio-codec Faac --audio-bitrate 224 --audio-SetMixer STEREO --audio-SetNormalize 1 --Container MP4 --save """ & output & File.Name & """ --quit", 1, True
i=i+1        'счетчик файлов
    Next
    'Перебираем все подкаталоги в каталоге
    For Each SubFolder in Folder.SubFolders
        RecursiveFolderScan(SubFolder.Path)
    Next
Set WSHShell = Nothing
End Sub

Уровень громкости входящих файлов разные, а на выходе должно быть одинаково

11 (изменено: DnsIs, 2016-01-29 13:11:05)

Re: VBS: скрипт пакетной обработки видеофайлов в Avidemux

Попробуйте использовать ffmpeg вот так вот:

for /f "tokens=*" %%a in ('dir *.mp4 /b /s') do ffmpeg.exe -i "%%a" -c:v copy -af "volume=0.9" "%%~fna_volumedown.mp4"
Нас невозможно сбить с пути, нам пофигу куда идти.

12

Re: VBS: скрипт пакетной обработки видеофайлов в Avidemux

DnsIs, код в принципе не верен. Так как перед тем как кидать фильтр -af "volume=" нужно узнать уровень громкости входящего файла -af "volumedetect" и уже потом нормализовывать под нужные Db . Ну и почему-то не указаны параметры кодирования аудио.

13 (изменено: Barus2010, 2016-03-09 17:10:48)

Re: VBS: скрипт пакетной обработки видеофайлов в Avidemux

teadrinker убрал все лишнее

Решил проблему, создал файл из проекта программы с расширением mp4.py:

#PY  <- Needed to identify #
#--automatically built--

adm = Avidemux()
adm.videoCodec("Copy")
adm.audioClearTracks()
adm.setSourceTrackLanguage(0,"unknown")
adm.audioAddTrack(0)
adm.audioCodec(0, "Faac", "bitrate=224");adm.audioSetMixer(0, "STEREO");
adm.audioSetDrc(0, 0);
adm.audioSetShift(0, 0,0);adm.audioSetNormalize(0, 2, -100);adm.setContainer("MP4", "muxerType=0", "useAlternateMp3Tag=True")

и переделал батник к нему:

set avidemux="C:\Program Files (x86)\Avidemux 2.6 - 32 bits\avidemux.exe"
for %%f in (*.mp4) do %avidemux%  --load "%%f" --run mp4.py --save "%%f.mp4" --quit

правда получается дублирование .mp4.mp4 , но это не страшно

14 (изменено: DnsIs, 2016-02-05 14:49:39)

Re: VBS: скрипт пакетной обработки видеофайлов в Avidemux

Malcev пишет:

DnsIs, код в принципе не верен. Так как перед тем как кидать фильтр -af "volume=" нужно узнать уровень громкости входящего файла -af "volumedetect" и уже потом нормализовывать под нужные Db . Ну и почему-то не указаны параметры кодирования аудио.

Вы правильно пишите. Просто мне кажется, что с ffmpeg проще договориться, чем с avudemux. Можно же развить с ним тему.

Нас невозможно сбить с пути, нам пофигу куда идти.

15

Re: VBS: скрипт пакетной обработки видеофайлов в Avidemux

Barus2010, ознакомьтесь с этой темой, отредактируйте свой пост. Заранее спасибо.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder