![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Деинтерлейс [D7, WinXP]
Дмитрий Белькевич © (2006-01-15 14:34:00)Нужно захватывать из потока видео шоты. С частотой 1-10 кадров в секунду. Пробовали видезахваты на bt848 и pinnacle av/dv. Везде лезет небезывестная 'гребенка'.
Вопрос: можно ли как-то заставить граббер захватывать без интерлейса (или купить соответствующий граббер, если он такой существует). Просто голые идущие подряд кадры. На другом компьютере (до которого, к сожалению, нет доступа) с этого же источника всё захватывается безо всякого интерлейса. Что там за граббер, я, к сожалению, не знаю, и открыть посмотреть нельзя. Важен факт, что такое - возможно.
И второй вопрос: если уж нельзя это никак исправить, существуют ли какие-нибудь готовые бибилиотеки/плагины, к которым можно 'подцепиться', что бы они на выходе давали деинтерлейсное видео?
Дмитрий Белькевич (2006-02-18 21:08:00) [1]Я, надеюсь, еще не надоел ;)
Добрался я опять до интерлейса.
Фильтр таки заработал, правда, не неровский, использовал фришный deinterlace.ax. Но есть одна особенность.
Перед подключением его к графу (CoCreateInstance, AddFilter(DeinterlaceFilter, 'Deinterlace')), нужно обязательно вызвать страницу настроек:
OleCreatePropertyFrame(Handle, 30, 30, nil, 1, @StreamConf, auuid.cElems, auuid.pElems, 0, 0, nil);
иначе работает так, как я описывал выше - процессор почти не загружен, fps падает вначале до 5, потом медленно поток почти останавливается.
Если перед подключением фильтра вызвать страницу настроек потока, всё ок. Фильтр работает, загрузка - 50-55%. Может еще какие-нибудь умные у
кого мысли возникнут. Спасибо.
WondeRu (2006-01-31 09:04:00) [2]Дмитрий Белькевич (31.01.06 4:59) [24]
Realtime renderring получается?
Угу... приложение писал для одного ночного клуба... там именно пришлось применить NERO, для того чтобо нормально картинка выводилась с тюнера
Дмитрий Белькевич (2006-01-31 04:59:00) [3]
> c NERO у меня грузит проц... притом замечательно... на 60%
> на обеих машинах: Athlon64 3000+ и Athlon64 2800+ по 512Мб
> на борту
Realtime renderring получается?
Дмитрий Белькевич (2006-01-29 21:57:00) [4]Посмотрел, фильтр всего две функции экспортирует:
000028B0 1 0000 VirtualdubFilterModuleDeinit
00002870 2 0001 VirtualdubFilterModuleInit2
Пойду сырцы даба ковырять, что-то ж он им передаёт....
Дмитрий Белькевич (2006-01-29 21:41:00) [5]Спасибо за ссылку. Я уже как-то задавал вопрос, но в ответ тишина. Вторая попытка: как подлючить фильтры virtualdub'а?
AlterEgo of WondeRu (2006-01-29 21:16:00) [6]Дмитрий Белькевич (27.01.06 14:42) [18]
c NERO у меня грузит проц... притом замечательно... на 60% на обеих машинах: Athlon64 3000+ и Athlon64 2800+ по 512Мб на борту
Sapersky (2006-01-27 14:49:00) [7]Описание некоторых алгоритмов деинтерлейса:
http://compression.graphicon.ru/video/deinterlacing/deinterlacing.pdf
Кроме того, судя по информации из DX SDK, деинтерлейс может делать видеокарта при выводе через оверлей, правда, только довольно примитивным методом BOB, примерно то, что в статье называется Duplicate field. Хотя на практике вполне может оказаться, что подобных видеокарт не существует - в DX предостаточно никем не поддерживаемых возможностей.
Дмитрий Белькевич (2006-01-27 14:49:00) [8]Еще насчет телевизора.
Тв показывает с частотой 50 Гц. Сигнал тоже идёт с этой частотой.
Свалился кадр номер один. В нём 625 строк. И что телевизор с ними делает? Показывает вначале четные, потом нечетные? Или запоминает (там линии задержки есть, насколько я помню) кадр, потом четные сточки первого мешает с нечетными второго, а четные второго с нечетными третьего. Тогда тв должен 100 гц показывать, иначе времени не хватит.
Не понимаю.
Дмитрий Белькевич (2006-01-27 14:42:00) [9]Непонятно, почему фильтр (пробовал уже три - nero, как советовали, и две реализации фришного deintarlace) не грузит процессор почти. Интересно, если поставить на более мощную машину, поможет или нет?
Можно считать данные и позже, после захвата. Реалтайм не нужен.
Иванов (2006-01-27 13:19:00) [10]В телевизоре показывается первое поле, затем через 1/50 секунды второе с небольшим смещением вниз. Проблема гребенки состоит в том, что в первом поле и во втором поле находится информация за разные моменты времени.
Деинтерлейс или пытается пересчитать оба поля к одному времени (достаточно долго по времени) или просто показывает поля (с половинным разрешением) друг за другом с частотой 50 кадров в секунду.
А нельзя в Вашей задаче захватить с интерлейсом, а потом не спеша выполнить деинтерлейс? Пусть даже с 0.5 fps
Дмитрий Белькевич (2006-01-27 12:05:00) [11]Вот хочу заодно разобраться.
Четные/нечетные, в одном кадре - это всё понятно. Непонятно только, что обозначает слово 'поля'. Вот перед мной телевозор. Он в один момент времени показывает один кадр. Так? Так. В одном кадре, например, в PAL'е, 625 строчек так? Так. Я эти 625 строчек вижу? Скорее всего да, если сильно нужно, могу специально осцилограф на модулятор ткнуть и посчитать. Они размазаны гребенкой? Нет. Значит где-то этот телевизор эти строчки берет? Берет. 50 раз в секунду показывает честные кадры. Или в телевизоре реально 625/2 строчек, а остальное - эффекты интерполяции?
Как это клеит телевизор? Был бы алгоритм - сам бы написал. Благо asm, mmx, sse владею. Чувствую, будет как обычно. Помаюсь с чужой кривизной, и придётся свое что-то делать.
Спасибо за ответы.
vrem (2006-01-27 05:18:00) [12]>захватывать без интерлейса
Автор, видео идёт полями, все чётные строки, затем все нечётные, 50 полей в секунду. деинтерлейсеры клеют эти поля разными способами. Без интерлейса - это вам какое то одно поле захватывать надо, всё остальное полумеры :)
Дмитрий Белькевич (2006-01-27 04:54:00) [13]Добрый день. Был некоторое время в разъездах. Вот приехал, таки удалось всё посоединять и настройки не менять. Все заработало, деинтерлейс даёт. Но есть одно но - скорость. Получается где-то 0,2 - 0,5 фпс. Т.е. одного кадра нужно ждать 2-10 секунд. Процессор при этом (слабенький, правда - дюрон 1200), почти не загружен где-то 3-4%. Можно ли как-то от фильтра добиться работы в реальном времени? Спасибо за советы, очень помогают.
WondeRu (2006-01-19 10:14:00) [14]Дмитрий Белькевич (19.01.06 4:35) [12]
черный квадрат может возникать из-за того, что ты меняешь настройки пинов уже после подключения НЕРО :) А надо ДО!
Дмитрий Белькевич (2006-01-19 04:35:00) [15]Попробовал с неро. Получился честный квадрат Малевича, как он должен быть.
Всё нормально поподключалось, результат - s_ok на всех концах, но в окне предпросмотра пусто, пробовал как DSVideoWindowEx2, так и VideoWindow.
Может какие-то интерфейсы неровского фильтра подёргать нужно для его настройки?
FVideoWindow в DSVideoWindowEx2 тоже IVMRMixerControl не отдал, с VideoWindow пока не пробовал.
Дмитрий Белькевич (2006-01-18 13:35:00) [16]У меня TDSVideoWindowEx2 ипользуется для вывода превью.
Пробовал вчера еще у DSVideoWindowEx2 запросить - тоже не возвращает, сейчас полезу внутрь к его полю FVideoWindow, или, может приведением Делфи сама разрулит.
WondeRu (2006-01-18 09:53:00) [17]Дмитрий Белькевич (18.01.06 4:14) [9]
Сейчас ищу чей IVMRMixerControl интерфейс. vmr9 не признаётся - не его.
FVideoWindow: TVideoWindow;
procedure TVideoCapture.SetCounter(const Value: Integer);
var
pVMRMixerControl9 : IVMRMixerControl9;
hr: HRESULT;
begin
if VCap.Counter > -2
then FCounter := Value;
if Value < -1 then
if FVideoWindow <> nil then
begin
hr := FVideoWindow.QueryInterface(IID_IVMRMixerControl9, pVMRMixerControl9);
if hr = S_OK then
pVMRMixerControl9.SetAlpha(1, 0);
end;
end;
Дмитрий Белькевич (2006-01-18 04:14:00) [18]Большое спасибо!
Я с IVMRDeinterlaceControl9 еще не сдался ;)
В форуме откопал:
"To enable YUV mixing mode, call IVMRMixerControl::SetMixingPrefs with the
MixerPref_RenderTargetYUV parameter. This call must be made before any of
the VMR's input pins are connected."
Ответ создателя темы:
Setting the mixing prefs did the trick! Thanks! Output is much
cleaner now.
То есть, судя по всему, таки завёлся железячный деинтерлейсер.
Сейчас ищу чей IVMRMixerControl интерфейс. vmr9 не признаётся - не его.
Пока нужно быстро, потом обязательно подниму, если сама железяка даст.
AlterEgo of WondeRu (2006-01-18 00:38:00) [19]Дмитрий Белькевич (17.01.06 23:22) [7]
вот куски кода, думаю так понятно, если чего обращайтесь
uses DSPack;
var
Nero: TFilCatNode;
FSysDev2: TSysDevEnum;
................
FSysDev2 := TSysDevEnum.Create;
for i := 0 to FSysDev2.CountCategories - 1 do
if FSysDev2.Categories[i].FriendlyName = 'DirectShow Filters' then
begin
FSysDev2.SelectIndexCategory(i);
j := FSysDev2.FilterIndexOfFriendlyName('Nero Video Processor');
if j <> -1 then
Nero := FSysDev2.Filters[j];
Break;
end;
................
hr := CoCreateInstance(Nero.CLSID, nil, CLSCTX_INPROC, IID_IBaseFilter, pBase);
if hr = s_ok then
hr := (FFilterGraph as IGraphBuilder).AddFilter(pBase, 'Nero');
if hr <> s_ok then begin
MessageBox(0,'Не удается добавить Nero к графу фильтров','', mb_OK);
exit;
end;
//рендер в два этапа
(FFilterGraph as ICaptureGraphBuilder2).RenderStream(@PIN_CATEGORY_CAPTURE,
nil,
FFilter as IBaseFilter,
nil,
pBase);
(FFilterGraph as ICaptureGraphBuilder2).RenderStream(nil,
nil,
pBase,
nil,
FVideoWindow as IBaseFilter);
Дмитрий Белькевич (2006-01-17 23:22:00) [20]Как к этому NeroVideoProc.ax фильтру подключиться? Кинь, плиз, код сюда или на мыло и спасибо за информацию.