# DVInfo

## Общая информация

Автор: WarpEnterprises
Версия:
Загрузка: http://www.avisynth.org/warpenterprises/
Категория: Разнообразные плагины
Требования:

- входной файл DV-AVI

## Описание

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 Turyst04@nextmail.ru`