Не работает preview virtualdub
Итак, с работой программы VirtualDub практически разобрались. Теперь осталось разобраться с настройками программы, которые помогут нам сделать работу немного комфортнее.
"Show log" - показывает в отдельном окошке список работ производимых в VirtualDub. Кому-то может быть и пригодится, но только не мне.
"Show real-time profiler" - показывает по времени, к каким подсистемам производится обращение, и с какой активностью.
Сверху, отображается загрузка процессора. Ниже, обращение к устройству чтения-записи. В самом низу отображается работа подсистемы обмена данными.
Ниже, находятся функции настройки работы VirtualDub по обмену данными с операционной системой и внешними устройствами.
"Performance" - здесь находятся настройки буферов VirtualDub.
"AVI Output buffering" - производится настройка размера буфера при чтении AVI файла с винчестера. Его стоит увеличивать только в том случае, когда идут простои процессора по вине источника AVI файла. Ведь источником может быть не только винчестер, но и сеть, внешний винчестер, CD-ROM… Проследить, из-за чего происходят задержки обработки видео модно посредством функции "Show real-time profiler". Если мы видим, что процессор загружен не полностью, а в основном идёт работа с устройством чтения-записи, то можно попробовать увеличить размер буфера "AVI Output buffering". При этом надо учесть, что VirtualDub будет занимать больше места в памяти.
"Wave input buffering" - позволяет изменять размер буфера для WAV источника. Так как WAV источник у нас задаётся отдельным файлом, для него так же работает отдельная буферизация. Если мы работаем без звука или берём звук из источника видео, то этот буфер использоваться не будет. Резон изменения размера этого буфера точно такой же, как и изменение размера буфера входного видео.
"Stream data pipelining" - эта функция ограничивает количество потоков, которые будут использоваться при передаче данных. Для выбора этого режима подходит чисто экспериментальный метод. Мы не можем заранее знать, с каким количеством потоков лучшим образом справится ваша система, поэтому только экспериментально. Это зависит от многих факторов: используемого железа, драйверов и конкретных операций, которые производятся в данный момент. При изменении количества потоков, может изменяться полное быстродействие системы.
В целом, что касается изменения размера буферов, то при какой-то конкретной операции будет оптимален свой размер буфера. Изначально они стоят в каком-то среднем значении, оптимальном для всего сразу. Если же у вас стоит какая-то специфическая задача, то можно подогнать их под свои цели.
Посмотрим, какие функции есть после выбора размера буферов.
Что касается опции "Dynamic Compilation" у меня нет никакой информации. А вот на "Preferences" остановимся и рассмотрим все пункты.
Первая вкладка - "Main".
"Quick preview defaults" - это поле отвечает за установки, относящиеся к просмотру видео. В него входят 2 опции:
- Fasted (16-bit) - быстрый режим обсчёта картинки, использует 16 битный режим передачи сигнала.
- Use output settings - выставляет такой же формат цветности, как у выходящего материала.
- Match display depth - выставляет такой же формат цветности, как у вашего монитора.
- 16-bit (HiColor) - выставляет выходным форматом RGB16
- 24-bit (TrueColor) - выставляет выходным форматом RGB24
"Process priority" - устанавливает приоритет просчёта картинки выводимой на монитор. Здесь можно оставить значение "Default", что будет соответствовать "Normal".
- Default = Normal
- Idle - самый низкий приоритет VirtualDub. Я предпочитаю именно это значение и вот почему. Кодирование иногда длится сутки и более (в зависимости от кодека, количества и вида фильтров). В это время компьютер может понадобиться для любой другой цели. Если обе задачи будут идти с одинаковыми приоритетами, то работа обеих очень замедлится. Если же, у одной из них будет высокий приоритет, а у второй низкий, то программа с высоким приоритетом отработает и даст спокойно работать программе с низким приоритетом. Так что, пусть VirtualDub спокойно просчитывает видео, а я могу компьютер использовать для своих целей.
- Далее, по росту приоритетов: Lowest-> Even lower-> Lower-> Normal-> Higher-> Even higher-> Highest при выставлении высоких приоритетов, VirtualDub должен вытеснять другие задачи. По этой причине я не рекомендую применять эти режимы, ведь будет замедленны все реакции, даже при работе с мышью.
"Automatically add extension to filenames when saving" - при установке этой галочки, во время сохранения файла будет автоматически добавлено расширение. Расширение будет поставлено в соответствии с типом файла, который предполагается для работы.
Вторая вкладка - "Display". Здесь находятся опции, отвечающие за вывод рабочих окон VirtualDub. "Enable dithering for 16-bit desktops" - производит сглаживание рабочих элементов при работе с 16 битным рабочим столом. Это на любителя.
"Use DirectX for display panes" - использовать функции DirectX для прорисовки окон VirtualDub. Эту функцию можно держать постоянно включённой. Если у вас видеокарта не полнейший раритет, то всё будет работать нормально.
"Use DirectX even when Terminal Services is active (may cause display corruption)" - использование ускорения DirectX при выводе выпадающих меню. Эта опция может работать не правильно (выпадающие окна будут пропадать), поэтому сперва убедитесь, что у вас работает всё правильно, а потом оставляйте эту опцию включённой.
Третья вкладка - "Scene". Это весьма полезная функция. При помощи неё можно находить начала новых сцен или действий (так же, при помощи неё можно отлавливать кадры с сильными помехами). В принципе, она была бы полезна в монтажных программах, для выставления эффектов или подгонки кадров в стык.
Здесь она так же может пригодиться. На этой вкладке находятся две опции:
"Interframe (cut)" - уровень разницы между кадрами, при котором считается, что сцена или действие поменялись. Двигая слайдер в сторону "More sensitive" можно добавить чувствительности (в крайнем положении, даже самое небольшое движение в кадре, будет воспринято как смена действия). Движение слайдера в сторону "Less sensitive" уменьшает чувствительность детектора движения, вплоть до его полного отключения.
"Intraframe (fade)" - эта опция так же относится к детектору смены сцен. Но сцены не всегда сменяются моментально. Иногда, в месте смены сцен делают снижение, а потом нарастание яркости изображения. Эти эффект довольно сложно отследить обычным, пороговым детектором сцен. Для этого был введён этот детектор (Intraframe (fade)). Его чувствительность регулируется так же, как и у предыдущего.
Четвёртая вкладка - "CPU". Здесь можно выставить оптимизацию кода под конкретный процессор.
"Use default optimization for current CPU…" - при выборе этой опции включается стандартная оптимизация кода. Она подходит под все виды процессоров, начиная с 486. При выборе этой опции не производится подгонка кода под конкретную модель процессора.
- FPU - можно выбирать для любого процессора
- MMX - его нет только на первых процессорах Pentium и процессорах AMD до эры Athlon.
- Integer SSE - такого набора команд для процессоров нет, Поэтому остаётся загадкой, для каких именно процессоров предназначена эта опция.
- SSE - этот набор команд появился в процессорах PentiumIII и Celeron с ядром, сделанным на основе процессора PentiumIII
- SSE2 - этот набор команд появился в PentiumIV и, соответственно Celeron на ядре PentiumIV
- 3DNow! - этот набор команд появился в процессорах Athlon и Duron.
- 3DNow!2 - этот набор команд появился в последних моделях процессоров
Последняя вкладка - "AVI". Здесь находятся опции, отвечающие за работу с AVI файлами.
Что ж, продолжим дальше путешествие по меню "Options".
"Display input video" - при установке этой галочки будет производиться показ входящего видео в окне VirtualDub.
"Display output video" - при установке этой галочки будет производиться показ видео, уходящего на кодек.
"Display decompressed output" - это весьма полезная функция, но она очень замедляет работу системы. Смысл её таков, что во время сжатия мы сразу можем просмотреть качество сохранённого видео. То есть, во время сжатия, следом производится разжатие материала и вывод его на экран (в область вывода обработанного материала). Мы можем сразу визуально убедиться, на сколько качественная картинка сохраняется.
"Show status window" - включение этой опции позволяет появляться окну "VirtualDub Status" во время сжатия материала.
Это окно очень информативно. В нём выводится практически вся информация о ходе кодирования в VirtualDub.
"Swap input/output panes" - эта опция меняет между собой окна просмотра входящего и выходящего видео. Иногда, эта опция оказывается весьма полезна. Например, у вас на входе видео весьма большого формата, а вы хотите увидеть, что у вас получится на выходе в результате работы фильтров. Для этого меняем местами окна просмотра и видим всё, что хотели.
Ну и закончим с панелью "Options".
"Vertical display" - выставляет окна просмотра входящего и выходящего видео не горизонтально, а вертикально (друг под другом).
"Sync to audio" - производит синхронизацию видео и звука. Эту функцию не стоит выключать. Дело в том, что при вырезках и вставках, если не будет синхронизации со звуком, то он не будет смещаться и, как результат, полный бардак со звуком. Я бы назвал эту функцию - привязка звука к видео.
"Drop frames when behind" - включает режим пропуска кадров, если система не успевает показывать просчитываемый кадр. Это распространяется только на вывод изображения на экран и никак не затрагивает обработку изображения.
"Allow video overlays" - при включении этой опции видео будет выдаваться в оверлей. Оверлей - это область памяти на видеокарте. Все плеера выводят видео именно этим методом. Единственный его недостаток в том, что если при включённом оверлее сделать скриншот экрана или активного окна, то на месте видео будет пустое окно. Но оверлей позволяет быстрее обрабатывать вывод на монитор.
"Preview field mode" - позволяет определить, с каким видео мы будем работать. Для интерлейсного материала можно задать порядок полей, с которым нужно выводить на экран. Здесь я предпочитаю оставлять "Progressive".
1. ПАМАГИТЕ! После VirtualDub файл стал весить МНОГО ГИГАБАЙТ. Как же вы меня. RTFM
Выберите в Video->Compression кодек и укажите битрейт.
Если вы не использовали фильтры для обработки изображения, можете посмотреть след. вопрос.
(Звук тоже можно сжимать. PCM означает несжатый звук).
2. Как сохранить видео без пережатия?
Выберите в меню Video->Direct stream copy и сохраняйте как обычно.
(аналогичная опция есть и для звука)
Сохранить кусок видео без пережатия можно только с ключевого кадра.
Если Вам нужно начать фрагмент с другого кадра, то
в меню выбираем 1)Video - fast recompres (Видео - быстрая перекомпрессия)
2) Video - Smart rendering (Видео - умный рендеринг)
3) Video - comression (Видео - компрессия), кодек, каким сжато исходное видео.
Настраиваем кодек с необходимыми параметрами для пережатия начала фрагмента.
Сохраняем АВИ, у нас пережмется от начала фрагмента до ключевого кадра.
Начиная с ключевого будет без пережатия
В MPEG-2 plugin есть такая же фича, индексные файлы там имеют расширение midx.
2. есть ли разновидности на полный экран или часть экрана?
например если нужно сдвинуть не всё видео, а прямоугольник перенести в другое место
Альтернативные программы для резки/склейки видеофайлов без пережатия [?]
сюда еще можно добавить AVS Video Remaker
сохраняет без пережатия видеопотока
много раз был mp4, который не съедал Virtualdub
сохранял в avi без пережатия через AVS Video Remaker
потом открывал avi в Virtualdub для дальнейшей обработки
получается сверху в resize оставляем исходное разрешение + bicubic, снизу по y также, по x добавляем больше пикселей, тем самым добавляем справа слева полосы
далее через crop вторым фильтром режем правый край?
мда, удобностей маловато, жалко нет плагина move какого-нибудь
плюс такая связка не работает на выделенном участке с плагином Conditional по причине изменения разрешения наверное
Как сделать чтобы в режиме захвата Preview не пропадало при включенной гистограмме?
Win7 x64
CPU i5-650 RAM 16GB
VD 1.10.4 (x64)
Источник видео - тюнер Beholder A8.
Был установлен ffdshow и Lagarith - снес и то и то.
В логе VD - при включении режима захвата добавляются две записи:
Connected to capture device: Behold TV A8: A/V Capture [Slot 10] (DirectShow)
CapDShow: Unable to transition filter graph to run state: hr = 800700aa ()
На gif-ке видна последовательность действий. Видео - Фильтры - rotate - OK. Видео перевернулось. А дальше что делать? Выбираем Файл - Сохранить как AVI. Файл, который до "переворота" весил 100 МБ, стал весить почти 8 Гб.
Загрузил VirtualDub(версия 1.7.7. b28312) на свой ноутбук(Asus F3Jp-Core 2 Duo T7200,ATI Mobility Radeon X1700,Windows Vista).
При попытке открыть в этой программе файл AVI программа упорно выдает примерно следующее:
После чего я установил и кодек TTACodecs и когда она после этого снова отказалась воспринимать AVI я установил еще и Winnov Videum VFW драйвер.
И все равно она не работает
Подскажите пожалуйста,в чем там может быть дело?
Снеси все прежние дрова и ставь лучше K-Lite-mega-codec pack.
Снеси все прежние дрова и ставь лучше K-Lite-mega-codec pack.К моменту начала работы с программой у меня уже стоял K- Lite codec pack 3.8.0. Загрузил VirtualDub(версия 1.7.7. b28312). При попытке открыть в этой программе файл AVI программа упорно выдает примерно следующее:
Уточните чем конкретно сжат Ваш .avi ?
Глянуть можно прогой GSpot.
VirtualDub шутя открывает любой xVid формат (при наличии кодека и отсутствия повреждений в контейнере).
Жизнь мужчины подразделяется на 3 этапа: - когда он верит в Деда Мороза, - когда он в него не верит, - и когда он сам – Дед Мороз. Уточните чем конкретно сжат Ваш .avi ?Глянуть можно прогой GSpot.
В каком именно поле программы находится сия инфа?
Не в Container?
Если там,то там значится следующая информация:
File Length Correct
DivX Style "packed bitstream" AVI
OpenDML (AVI v2.0)
Interleave: 1 vid frame (40 ms)
Audio frames: Aligned on interleaves
Video: 23.1 MB (79.71%)
Audio: 2.76 MB (9.52%)
AVI Overhead: 3.13 MB (10.78)
В правом поле "Codec", "Name" и "Status".
Заодно и про аудио черкните, на всякий.
Заодно и про аудио черкните, на всякий.
Video:
Codec:XVID Name: XviD 1.1.0 Beta 2 mpg4
Status: Codec(s) are Installed
Audio
Codec: 0x0055 MPEG-1 Layer 3 CBR
Info: 32000Hz 96 kb/s tot,Joint Stereo
Status: Codec(s) Installed
На первый взгляд вроде система в порядке.
Попробуйте перебрать следующие варианты:
1. Переустановите klmcodec161 или новее если есть. Там в опциях при инсталляции ставьте все варианты XVID форматов. Перед этим старые кодеки удалите.
2. Загрузите последний VirtualDub. У мну стоит верс 1.8.0
3. Если не поможет, откройте фильм версией "VirtualDub MPEG-2".
Должен открыться. У меня с этим никогда проблем небыло. Но это в XP. Vistu я не знаю( и знать пока не хочу ).
Начал с последнего твоего совета,попробовал открыть авишку версией "VirtualDub MPEG-2".Но файл окрыть не получилось,т.к. он просто не виделся программой.
Пришлось снести старые кодеки и поставить K-lite последней(3.9.5)версии и там поставил чекбоксы напротив всех файлов DivX и XviD.
Переименуйте все фрагменты по порядку (лучше цифрами 01.avi, 02.avi, 03.avi . 20.avi). Потом открываете первый фрагмент. Дальше Append AVI segment. ДУБ сам догадается соединить все в один файл. Осталось только сохранить результат.
Жизнь мужчины подразделяется на 3 этапа: - когда он верит в Деда Мороза, - когда он в него не верит, - и когда он сам – Дед Мороз. Переименуйте все фрагменты по порядку (лучше цифрами 01.avi, 02.avi, 03.avi . 20.avi). Потом открываете первый фрагмент. Дальше Append AVI segment. ДУБ сам догадается соединить все в один файл. Осталось только сохранить результат.Исходный,самый первый файл он добавляет нормально,а если начинаешь добавлять второй он прибавляет ужасающее количество видеокадров(например если в первом фрагменте он определяет где-то 6000 кадров,после прибавления второго фрагмента,точь-точь такого же по весу,ему уже кажется что в объединенном файле будет эа 100000 кадров,а незадолго до этого он пишет в открывающеся окне,что "Некоторые предупреждения были выпущены в течении предыдущей операции",после прибавления 3 фрагмента,опять точь-точь такого же и по весу и по остальным параметрам он уже за 200000 кадров определяет и так дальше в прогрессии).Есессвенно,
если его попытаться сохранить,это займет уйму времени и пространства на диске.
Попытался переименовать файлы с формата 01,02 на 1,2.Стали нормально плюсоваться кадры.Но при переходе с 9.AVI на 10.AVI та же байда с многократным увеличением числа кадров.
Что теперь,компоновать кадры в один строго по девять,называя их однозначной цифрой?
Исходный,самый первый файл он добавляет нормально,а если начинаешь добавлять второй он прибавляет ужасающее количество видеокадров(например если в первом фрагменте он определяет где-то 6000 кадров,после прибавления второго фрагмента,точь-точь такого же по весу,ему уже кажется что в объединенном файле будет эа 100000 кадров,а незадолго до этого он пишет в открывающеся окне,что "Некоторые предупреждения были выпущены в течении предыдущей операции",после прибавления 3 фрагмента,опять точь-точь такого же и по весу и по остальным параметрам он уже за 200000 кадров определяет и так дальше в прогрессии).Есессвенно,
если его попытаться сохранить,это займет уйму времени и пространства на диске.
Попытался переименовать файлы с формата 01,02 на 1,2.Стали нормально плюсоваться кадры.Но при переходе с 9.AVI на 10.AVI та же байда с многократным увеличением числа кадров.
Что теперь,компоновать кадры в один строго по девять,называя их однозначной цифрой?
Несмотря на то что обработка видео не спеша переезжает на OpenCL / CUDA VirtualDub остается удобным средством для простых действий с видео. Обрезка кадра, добавление фильтров или наложение выполняется гораздо удобнее чем из консоли ffmpeg. Кроме того за годы существования была разработана масса фильтров позволяющие выполнять многие операции быстро и удобно. Несмотря на простоту SDK, при написании плагина возникают некоторые нюансы. Статья посвящена работе с ними.
В качестве примера напишем фильтр с нуля. Туториал рассчитан на начинающих или вспоминающих Win32 API. Создаём в студии пустой проект динамической библиотеки DLL.
Плагины для VirtualDub имеют расширение vdf, поэтому чтобы не переименовывать его каждый раз меняем расширение в свойства проекта Properties→General→Target extension на .vdf. Меняем для всех конфигураций, поэтому не забываем переключить их на вкладке настроек Configuration: на All Configurations и Platform на All platforms.
Копируем в проект папку include из распакованного SDK и добавляем файлы из него в проект через Atl-Shift-A или меню Add→Existing Item. Для работы нам понадобятся файлы заголовков из папки include и набор файлов хелпера VDXFrame. Не забываем добавить папку include в список папок где система будет их искать. Делается это из Properties→VC++ Directories→Include Directories, добавляем ссылку на корень проекта в виде $(ProjectDir)\include.
Добавляем в проект библиотеку VDXFrame, в примерах она используется в виде отдельного модуля, но так как лицензия позволяет, добавим её в виде исходного кода. Создадим в каталоге проекта папку src и скопируем в неё из SDK файлы VideoFilter.cpp,VideoFilterEntry.cpp,VideoFilterDialog.cpp и stdafx.cpp. Далее скопируем файл заголовка из include\stdafx.h в ранее созданную папку include. Не забываем добавить скопированные файлы в проект через Atl-Shift-A или из меню Add→Existing Item. На этом интеграция библиотеки хелпера заканчивается.
Переходим к написанию кода. Добавляем в проект новый файл main.cpp через Add→Existing Item или комбинацию клавиш Ctrl-Shift-A. Добавляем в main следующие строки
Плагин может содержать в себе произвольное количество фильтров описываемых макросом VDX_DECLARE_VIDEOFILTER с параметром в виде класса VDXFilterDefinition служащим оболочкой над классом фильтра. Сам фильтр описывается тремя текстовыми полями: Автор, Название и Описание. Создадим класс фильтра с именем BlackWhiteFilter, у автора VirtualDub классы именуются с использованием CamelCase поэтому создаем новый класс унаследованный от VDXVideoFilter в файле BlackWhiteFilter.h. Переменная g_VFVAPIVersion будет содержать версию API. Функции определенные с virtual являются частью SDK, а метод ToBlackAndWhite будет реализовывать преобразование картинки.
Реализацию пишем в файле BlackWhiteFilter.cpp, метод Start() выполняется первым, он предназначен для любых предварительных действий, например для определения совместимости с набором инструкций AVX или поддержки CUDA. Оставляем его пока пустым. Хелпер VDXFrame обеспечивает в пределах видимости этого класса указатель на экземпляр класса VDXFilterActivation с именем fa, содержащий информацию о кадре и буферах.
Метод GetParams() используется VirtualDub для определения совместимости фильтра, он должен вернуть битовую маску из перечисления FILTERPARAM
- FILTERPARAM_SWAP_BUFFERS создаётся два независимых буфера для входного и выходного кадров, рекомендуется использовать всегда чтобы не создавать такие буфера руками
- FILTERPARAM_NEEDS_LAST передаёт в фильтр не только текущий кадр но и идущий перед ним, используется для фильтров состояние которых зависит от предыдущего кадра
- FILTERPARAM_SUPPORTS_ALTFORMATS информирует VirtualDub что плагин поддерживает кодирование кадра отличное от RGB32, например YUV, что позволяет оптимизировать вычисления
- FILTERPARAM_ALIGN_SCANLINES фильтр требует выравнивания данных на 16 байт, а значит не поддерживает например длину строки 13 байт
- FILTERPARAM_PURE_TRANSFORM поведение фильтра зависит только от данных в буфере кадра, позволяет ускорить обработку и отображение фильтра
- FILTERPARAM_NOT_SUPPORTED фильтр не поддерживает входные данные в данном формате и работать не будет
Обработка кадра выполняется методом Run(). Данные о кадре и входном и выходном буферах хранятся в переменной fa являющаяся экземпляром класса VDXFilterActivation. VirtualDub поддерживает обрезку кадра, поэтому алгоритм обработки можно оптимизировать получив информацию о выбранном пользователем окне с координатами x1,y1,x2,y2. Данные кадра хранятся в объектах src и dst, соответственно входной и выходной буфер.
Если мы продолжаем писать код с поддержкой SDK меньше 12 версии то реализация метода Run() примет такой вид:
От версии которую поддерживает плагин зависит место хранения сырых данных в структуре. Итак, в функцию ToBlackAndWhite будет передано 6 параметров:
- void *dst0 – выходной буфер кадра
- ptrdiff_t dstpitch — полная длина строки в байтах выходного буфера
- const void *src0 — входной буфер кадра
- ptrdiff_t srcpitch — полная длина строки входного буфера
- uint32 w — ширина кадра в пикселях
- uint32 h — высота кадра в пикселях
GRAY = 0.299 * R + 0.587 * G + 0.114 * B
Организуем два цикла, один проходит по строкам а второй по точкам, граничный уровень для определения цвета точки примем равным 128.
Собираем плагин, копируем файл Windows-VirtualDub-Plugin-BlackWhite.vdf в папку plugins VirtualDub и делаем его активным. В списке он будет виден под названием, которое мы задали в классе VDXFilterDefinition — Black White filter. Плагин собранный для 64 битной версии не будет видно в 32 битной версии VirtualDub, поэтому не забываем проверить активную конфигурацию проекта.
Плагин без настроек довольно уныл, добавим возможность настройки и кнопку предварительного просмотра. Для этого нам бы следовало погрузиться в дебри Win32 API, но по этой теме написано достаточно книг, поэтому не будем вдаваться в детали.
Для визуального представления окна настройки нам понадобится диалоговое окно. Создаем новый файл ресурсов через меню Ctrl-Shift-A → Resource → Resource File с именем Resource.rc. Добавим в него диалоговое окно через меню Add Resource → Dialog и изменим ему имя на IDD_DIALOG_BLACKWHITE_SETTING. По умолчанию у нас уже есть две кнопки Ok и Cancel. Создавать ресурсы лучше в английской локали, иначе можно получить проблему с не читаемым русским шрифтом на кнопке Отмена. Добавим на экран кнопку Preview с именем IDC_SLIDER_THRESHOLD. Чтобы потом не возвращаться добавим остальные элементы управления для настроек, это будет слайдер для изменения порогового значения IDC_SLIDER_THRESHOLD и checkbox IDC_CHECK_INVERTED позволяющий инвертировать картинку. Сверстать это можно например так.
Создадим класс диалога BlackWhiteFilterDialog унаследованный от VDXVideoFilterDialog.
В конструктор передаётся ссылка на класс IVDXFilterPreview который управляет окном предварительного просмотра, локальную ссылку мы будем хранить в переменной mifp.
Метод Show(HWND parent) перегружен вызовом конструктора родителя и использует в качестве параметра идентификатор ресурса диалога настроек IDD_DIALOG_BLACKWHITE_SETTING
Для начала обработаем закрытие диалога по кнопкам Ok и Cancel. Кроме того нам понадобится обработчик Preview, управляющий отображением окна предварительного просмотра через метод Toggle((VDXHWND)mhdlg).
Класс для работы с диалогом написан, теперь его необходимо вызвать, для этого перегружаем в классе BlackWhiteFilter метод Configure(VDXHWND hwnd) и реализуем его
Собираем проект, копируем файл плагина в папку VirtualDub, добавляем новый фильтр в список и видим наш диалог и доступную кнопку Preview.
Окно конфигурации у нас есть, но настроек у фильтра пока нет, приступаем к реализации. Настройки будем хранить в классе BlackWhiteFilterConfig содержащем всего две переменные, mTreshold как величину порогового значения и флаг инверсии mInvert.
Отредактируем класс BlackWhiteFilterDialog, добавив в него два экземпляра класса BlackWhiteFilterConfig для хранения конфигурации mConfigNew и mConfigOld. Эти переменные будут хранить старое и измененное состояние настроек и понадобятся нам для работы кнопки
Ok и Cancel. Отредактируем конструктор, добавив в него параметр хранящий настройки и инициализацию конфигурации.
Настройки должны где-то храниться, добавляем в класс BlackWhiteFilter переменную BlackWhiteFilterConfig mConfig и меняем инициализацию класса BlackWhiteFilterDialog в методе Configure на новую.
Теперь необходимо снова поработать с элементами управления Win32. В классе BlackWhiteFilterDialog напишем два метода связывающих нашу конфигурацию и ее реализацию в диалоге.
Осталось использовать эти два метода в жизненном цикле диалога. В OnCommand для кнопки Ok вызываем SaveToConfig(), а для кнопки Cancel восстанавливаем старый набор настроек присваиванием mConfigNew = mConfigOld. Начальные параметры диалога настраиваются в методе OnInit(), диапазон слайдера устанавливается в 0-255 и на него устанавливается фокус.
Изменение настроек необходимо отобразить в окне предварительного просмотра с помощью метода RedoFrame(), для этого отредактируем метод DlgProc добавив вызов сохранения параметров в методе в обработчике WM_HSCROLL для слайдера с проверкой что окно Preview включено if(mifp && SaveToConfig())mifp->RedoFrame(). Для обработки CheckBox допишем в метод OnCommand условие для case на идентификатор IDC_CHECK_INVERTED и выполним такое же обновление.
Перепишем метод ToBlackAndWhite для использования конфигурации, учитывая два параметра, инверсию и пороговое значения. Константа BST_UNCHECKED унаследована от Win32 API и используется как значение флага true/false.
Собираем проект и опять тестируем фильтр в VirtualDub, включение инверсии превратила милого котика в нечто готические страшное.
Нам осталось совсем чуть-чуть до финала. Фильтры VirtualDub поддерживают сохранение параметров в файл настроек, для этого нужно сериализировать наш класс настроек. Для этого существует макрос VDXVF_DECLARE_SCRIPT_METHODS() который добавляется в заголовок класса BlackWhiteFilter и набор методов для реализации записи и отображения настроек GetSettingString, GetScriptString и метод ScriptConfig для синтаксического разбора параметров из файла настроек. Количество и там аргументов задаются в макросе VDXVF_DEFINE_SCRIPT_METHOD в виде последнего параметра. Новая версия класса BlackWhiteFilter будет выглядеть так
Реализуем методы которых не хватает. Декларируем количество параметров и их тип в макросе VDXVF_DEFINE_SCRIPT_METHOD, у нас их два, оба целочисленные, поэтому строка инициализации будет «ii». Список поддерживаемых форматов можно посмотреть в классе IVDXScriptInterpreter, доступны целые, дробные и строковые параметры. Метод GetSettingString отображает параметры в строке настроек, он нужен для человека который сможет быстро посмотреть параметры в окне Filters, в колонке описания Filter. Метод GetScriptString форматирует параметры для сохранения их в файл VirtualDub configuration (*.vcf) и последующего их чтения методом ScriptConfig.
Добавив данный код и собрав плагин мы получим возможность видеть настройки фильтра в окне Filters и сохранять их в файл через меню файл Save processing setting.
По умолчанию проект собирается с зависимостями от установленной в системе VC Runtime, если планируется его использование на других компьютерах, при сборке необходимо указать параметр Multi-threaded (/MT) из меню настроек Configuration->C/C++->Code Generation->Runtime Library. Плагин увеличит свой размер в десять раз но пользователям не придется подбирать Runtime под версию Visual Studio которую использовал разработчик.
Читайте также: