1 (изменено: griha09, 2014-12-02 23:27:04)

Тема: VBScript & JScript надо связать ширину видеокадра и перенос файла

В видеоредакторе Avidemux 2.5 командная строка основана на ECMAScript 5. Для обработки видеофайлов я давно пользуюсь такой конструкцией из 2х файлов.

Avidemux.vbs


input = "f:\00\"
output= input&"output_xvid\"        
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set WSHShell = WScript.CreateObject("WScript.Shell")
If not objFSO.FolderExists(output) Then objFSO.CreateFolder output         

RecursiveFolderScan input

'Создаём процедуру рекурсивного обхода каталога
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  --force-unpack --load """ & File & """ --run xvid.js --save """ & output & File.Name & """ --quit",2,True
    Next
End Sub

Set WSHShell = Nothing

xvid.js


var app = new Avidemux();
var width, height;
        width = app.video.width;   // ширина видеокадра
        height = app.video.height; // высота видеокадра

    if (width > 700)    // если ширина видеокадра больше 700px
    {
       различные видеофильтры итд
    }
         app.setContainer("AVI");


Сейчас захотелось отсортировать видеофайлы по ширине видеокадра т.е. если ширина видеокадра больше 700px то файл переносим в др.папку. Вот с переносом возникли проблемы. Попробовал так
xvid.js


var app = new Avidemux();
var width, height;
  var sSrcFolderName = ".";
    var sDstFolderName = "f:\\000";
 var FSO = new ActiveXObject("Scripting.FileSystemObject"); 
    var file2  = FSO.GetFile(app); 
        width = app.video.width;   // ширина видеокадра
        height = app.video.height; // высота видеокадра
    if (width > 700)    // если ширина видеокадра больше 700px
    {
  file2.Copy(sDstFolderName);
 file2.Delete();
    }
        app.setContainer("AVI");

не работает. Пробовал так

 app.Copy(sDstFolderName);
 app.Delete();

тоже не работает.
Я вижу три возможных варианта решения
1.в js-файле перенести файлы. Как?
2.в vbs определить ширину видеокадра. Как?
3. в js-файле создать флаговую переменную, а потом в vbs ее прочитать и на основании ее значения переносить файл. Как? (но, по-моему, это извращение)

2

Re: VBScript & JScript надо связать ширину видеокадра и перенос файла

griha09,
1) А вариант с GetDetailsOf не подходит ? В Win 7 ширина и высота кадра - 285-й и 283-й элемент коллекции.
2) Не понял, что мешает собрать всё на JS или VBS ?

В качестве пояснения о чём я говорю:


Option Explicit
Dim oFileDetailsReader, sTmpStr, sValue, i
if WScript.Arguments.Count = 0 Then
    MsgBox "Файл не выбран ! Для получения информации о файле, перетащите его на скрипт.", vbExclamation, "VBScript"
    WScript.Quit
End if
Set oFileDetailsReader = New cFileDetailsReader
With oFileDetailsReader
    .OpenFile WScript.Arguments(0)
    For i=1 to 288
        sValue = .GetDetail(i)
        if sValue <> "" Then
            sTmpStr = sTmpStr & i & ") " & .GetDetailName(i) & " - " & sValue & vbCrlf
        End if
    Next
    MsgBox sTmpStr
End With

Class cFileDetailsReader
    Private oFSO, oShellApp, oFolder3, oFolderItem
    
    Private Sub Class_Initialize()
        Set oFSO = CreateObject("Scripting.FileSystemObject")
        Set oShellApp = CreateObject("Shell.Application")
    End Sub
    
    Sub OpenFile(FilePath)
        With oFSO.GetFile(FilePath)
            Set oFolder3 = oShellApp.NameSpace(.ParentFolder.Path)
            Set oFolderItem = oFolder3.ParseName(.Name)
        End With
    End Sub
    
    Function GetDetail(Index)
        GetDetail = oFolder3.GetDetailsOf(oFolderItem,Index)
    End Function

    Function GetDetailName(Index)
        GetDetailName = oFolder3.GetDetailsOf(0,Index)
    End Function
End Class
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

3

Re: VBScript & JScript надо связать ширину видеокадра и перенос файла

В Win 7 ширина и высота кадра в 235-ом и 238-ом элементах коллекции.

283/285.
For i=1 to 1000 - тут до 288 достаточно.
Вместо MsgBox лучше WScript.Echo, а то обрежет.

4 (изменено: griha09, 2014-12-03 20:58:19)

Re: VBScript & JScript надо связать ширину видеокадра и перенос файла

Xameleon пишет:

griha09,
1) А вариант с GetDetailsOf не подходит ? В Win 7 ширина и высота кадра - 285-й и 283-й элемент коллекции.
2) Не понял, что мешает собрать всё на JS или VBS ?

Оба варианта подходят, но мешает отсутствие знаний

СПАСИБО ЗА ПРИМЕР!!!
Буду разбираться.

5

Re: VBScript & JScript надо связать ширину видеокадра и перенос файла

Решил сделать вывод информации в файл из предыдущего скрипта


Option Explicit
Dim oFileDetailsReader, sTmpStr, sValue, i, input, output, objFSO, TextStream
input = "C:\test.avi"        
output= "otchet.txt"    'файл отчета


Set objFSO = CreateObject("Scripting.FileSystemObject")
Set TextStream = objFSO.OpenTextFile(output, 2, True)

TextStream.WriteLine "----- " & Now & " -----"

Set oFileDetailsReader = New cFileDetailsReader
With oFileDetailsReader
    .OpenFile input
    For i=1 to 288
        sValue = .GetDetail(i)
        if sValue <> "" Then
            sTmpStr = sTmpStr & i & ") " & .GetDetailName(i) & " - " & sValue & vbCrlf
        End if
    Next
    TextStream.Write(sTmpStr)
End With

TextStream.close

Class cFileDetailsReader
    Private oFSO, oShellApp, oFolder3, oFolderItem
    
    Private Sub Class_Initialize()
        Set oFSO = CreateObject("Scripting.FileSystemObject")
        Set oShellApp = CreateObject("Shell.Application")
    End Sub
    
    Sub OpenFile(FilePath)
        With oFSO.GetFile(FilePath)
            Set oFolder3 = oShellApp.NameSpace(.ParentFolder.Path)
            Set oFolderItem = oFolder3.ParseName(.Name)
        End With
    End Sub
    
    Function GetDetail(Index)
        GetDetail = oFolder3.GetDetailsOf(oFolderItem,Index)
    End Function

    Function GetDetailName(Index)
        GetDetailName = oFolder3.GetDetailsOf(0,Index)
    End Function
End Class

но почему-то матерится "Недопустимый вызов или аргумент процедуры" код 800A0005
на строку    TextStream.Write(sTmpStr)
Почему?

6 (изменено: Flasher, 2014-12-04 00:30:16)

Re: VBScript & JScript надо связать ширину видеокадра и перенос файла

griha09 пишет:

Почему?

В 18-м элементе присутствует юникодный символ. Добавляем: ... True, -1).

7

Re: VBScript & JScript надо связать ширину видеокадра и перенос файла

Flasher пишет:
griha09 пишет:

Почему?

В 18-м элементе присутствует юникодный символ. Добавляем: ... True, -1).

Ой, спасибо, никогда б не догадался.

Еще вопрос:
при сравнении по видеобитрейту     


 bit = .GetDetail(282)
         if CInt(bit) < 400   Then

ругается "Несоответствие типа: 'CInt' код 800A000D
перебрал уже все функции преобразования типов данных.

8 (изменено: Flasher, 2014-12-04 01:14:26)

Re: VBScript & JScript надо связать ширину видеокадра и перенос файла

Логично, он же возвращает текст <№> кбит в сек.   >>>

         If Mid(Split(bit)(0), 2) < 400   Then

9

Re: VBScript & JScript надо связать ширину видеокадра и перенос файла

СПАСИБО!!! А я два часа промучался. И нафига эти му..ки добавили "кбит в сек." ????