DVInfo считывает код времени (Timecode) и другую информацию о дате из DV-AVI файла.
DVInfo
(clip, string "filename", string "output", int "x", int "y", string "font", int "size", int "text_color", int "halo_color", string "rec_format", string "tc_format", bool "show_error", float "threshold", int "autoframes")
DVInfo открывает файл DV-AVI (Тип-1 или Тип-2, функции открытия openDML > 4ГБ поддерживаются) и читает код времени (timecode) и записанную в каждый считываемый кадр информацию о времени (timestamp of the frame). Обратите внимание: функция НЕ загружает видео или звуковое содержание AVI-файла, это необходимо сделать непосредственно до DVInfo с помощью AviSource
!
Код времени и служебная информация о записи затем впечатывается в кадр как-будто вы используется функция субтитров Subtitle()
и параметры x, y, font(шрифт), size (размер), text_color (цвет шрифта) и halo_color (цвет гало-обрамления) подаются непосредственно в субтитры.
Переменные "времени исполнения" ("run-time"): "current_frame", "tc_time", "rec_time" устанавливаются таким образом, что Вы можете использовать их в выражениях для вывода "output" (это работает как со скрипт-клипом (ScriptClip
), загляните в документацию за подробностями).
Можно установить генерируемый формат информации о времени с помощью параметров rec_format и tc_format.
С параметром "threshold">0 включается вывод информации, если разница данных о времени записи текущего и предыдущего кадра оказывается больше значения порога "threshold" в секундах. По истечении количества кадров "autoframes" вывод отключается. Таким образом вы получаете информацию о записи только в моменты смены сцен.
Внимание: используется последний обработанный (processed) кадр, а не просто предыдущий при передвижениях (seek) по клипу (работает только при линейном воспроизведении).
Таким образом при threshold=0.5 и autoframes=2 Вы сможете выводить данные каждую секунду длительностью в 2 кадра.
Лучше всего объяснить на примерах:
LoadPlugin("c:\myprojects\dvinfo\release\dvinfo.dll") file = "c:\myprojects\type2.avi" # чтобы не вводить имя файла дважды Avisource(file) # открыть видео файл DVInfo(file, "rec_time") # считать данные о времени и # вывести их в формате по умолчанию в переменную "rec_time", # выполнение этого выражения (содержащего единственную переменную) # отображает результат, используя параметры Subtitle по умолчанию |
Можно пропустить даже "rec_time", т.к. это тоже параметр по умолчанию для вывода в "output".
DVInfo(file) # выполнит то же, что и ранее приведенная строка |
Следующий скрипт не должен корректно работать (с более чем одним файлом):
LoadPlugin("c:\myprojects\dvinfo\release\dvinfo.dll") file1 = "c:\myprojects\type2a.avi" file2 = "c:\myprojects\type2b.avi" Avisource(file1)+Avisource(file2) #до этого места все в порядке DVInfo(file1, "rec_time") # но здесь DVInfo пытается прочесть в file1 номера кадров файла file2! DVInfo(file2, "rec_time") # и наоборот |
Вместо этого следует написать:
LoadPlugin("c:\myprojects\dvinfo\release\dvinfo.dll") file1 = "c:\myprojects\type2a.avi" file2 = "c:\myprojects\type2b.avi" Avisource(file1).DVInfo(file1, "rec_time") + Avisource(file2).DVInfo(file2, "rec_time") # теперь каждый вызов DVInfo считывает информацию из своего файла |
И этот скрипт не должен корректно работать (с использованием Trim
):
LoadPlugin("c:\myprojects\dvinfo\release\dvinfo.dll") file1 = "c:\myprojects\type2a.avi" Avisource(file1) Trim(1000,2000) DVInfo(file1, "rec_time") # здесь DVInfo берет неверные номера кадров |
Вместо этого следует написать:
LoadPlugin("c:\myprojects\dvinfo\release\dvinfo.dll") file1 = "c:\myprojects\type2a.avi" file2 = "c:\myprojects\type2b.avi" Avisource(file1).DVInfo(file1, "rec_time") + Avisource(file2).DVInfo(file2, "rec_time") # теперь каждый вызов DVInfo считывает информацию из своего файла |
Вы можете изменить формат отображения времени (подробнее смотрите документацию AviSynth >> Синтаксис (Syntax) >> функция Time
):
DVInfo(file, "rec_time", rec_format="%H:%M:%S") # выводит только время без даты или DVInfo(file, "rec_time", rec_format="%A, %H:%M:%S") # выводит полное название дня недели и время |
Параметр tc_time содержит позицию на ленте в часах, минутах, секундах и кадрах.
Я вывожу счетчик кадров в позицию, предназначенную для номера дня в месяце, это несколько грубо, но Вы можете легко отобразить номер кадра используя форматный символ "month":
DVInfo(file, "tc_time", tc_format="%d") # вывести только номер кадра |
Можно использовать и более сложные выражения в поле "output":
DVInfo(file, "tc_time + chr(32) + rec_time + chr(32) + current_frame") # отобразить код времени (timecode), время записи и номер кадра, разделенные пробелами |
Возможно добавить и другой текст:
text = "Здравствуй, Мир!" DVInfo(file, "text + rec_time") # отобразить "Здравствуй, Мир!" и время записи. |
Необходимо делать это именно таким образом (присвоив значение переменной text), так как нельзя использовать кавычки в этом месте строки.
Как Вы заметили, можно использовать любую переменную скрипта в поле "output".
А в этом примере выводится данные о записи только в момент смены сцен:
DVInfo(file, threshold=1) # данные будут отображаться в течении 25 кадров при разнице >1 секунды |
Если запрашиваемый номер кадра больше общего количества кадров (такого не должно случаться) сообщение об ошибке выдается в переменные rec_time и tc_time.
Если не найден код времени или информация о записи, или произошла иная ошибка чтения, сообщение об ошибке выдается в переменные rec_time и tc_time.
Эти сообщения об ошибке подавляются при использовании show_error = false.
Если AVI-файл не удается открыть, или результат в "output" не строка, AviSynth выдаст ошибку.
Для чтения AVI-данных я использовал код из продукта kino от Arne Schirmacher.
Я изменил его, чтобы он работал с openDML - файлами > 2ГБ, скомпилировал под Win32 и убрал все не относящееся к функциям чтения.
Ernst Peché, 2003-12-16
$English Date: 2004/08/13 21:57:25 $
Русский перевод 12.06.2005 Turyst04