Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2006.08.13;
Скачать: [xml.tar.bz2];

Вниз

Деинтерлейс   Найти похожие ветки 

 
Дмитрий Белькевич   (2006-01-15 14:34) [0]

Нужно захватывать из потока видео шоты. С частотой 1-10 кадров в секунду. Пробовали видезахваты на bt848 и pinnacle av/dv. Везде лезет небезывестная "гребенка".
Вопрос: можно ли как-то заставить граббер захватывать без интерлейса (или купить соответствующий граббер, если он такой существует). Просто голые идущие подряд кадры. На другом компьютере (до которого, к сожалению, нет доступа) с этого же источника всё захватывается безо всякого интерлейса. Что там за граббер, я, к сожалению, не знаю, и открыть посмотреть нельзя. Важен факт, что такое - возможно.
И второй вопрос: если уж нельзя это никак исправить, существуют ли какие-нибудь готовые бибилиотеки/плагины, к которым можно "подцепиться", что бы они на выходе давали деинтерлейсное видео?


 
WondeRu ©   (2006-01-16 10:07) [1]

через что захватываешь?


 
Дмитрий Белькевич   (2006-01-16 12:39) [2]

1. Через свой захват.
2. Через Virtual DUB
3. Через Pinnacle Studio.
Результат один - на низком разрешении (352х288) - всё хорошо, на высоком (720х576) - лезет гребенка.
Нужно, если возможно, либо выключить интерлейс в захвате программно или с помощью настроек драйверов, правда, ничего нигде пока не нашёл,
либо к своему видеограбберу подцепить фильтр от даба, либо от чего-то еще.


 
WondeRu ©   (2006-01-16 13:19) [3]

если через 1, то можно подключить фильтр деинтерлейса, он снимает гребенку. Я подключаю фильтр "Nero Video Processor", он устанавливается совместно с пакетом "Nero 6".


 
Дмитрий Белькевич   (2006-01-16 13:33) [4]

Спасибо, гляну.


 
Дмитрий Белькевич   (2006-01-17 03:00) [5]

Уточнил у заказчика - неры купленной у его нет, а с лицензиями там всё жестко. Есть ли еще варианты?

Пробую достучаться до IID_IVMRDeinterlaceControl9.
Выдаёт VFW_E_VMR_NO_DEINTERLACE_HW когда вызываю GetNumberOfDeinterlaceModes.

Не могу нигде вразумительное описание по IID_IVMRDeinterlaceControl9 найти.

Еще вариант: если сохранить два кадра подряд, можно ли из них восстановить неинтерлейсную катинку, или это впринципе не возможно?


 
AlterEgo of WondeRu ©   (2006-01-17 21:28) [6]

Дмитрий Белькевич   (17.01.06 3:00) [5]
Пробую достучаться до IID_IVMRDeinterlaceControl9.

у меня тоже не пашет! в документашке написано, что VMR9 поддерживает хардварный деинтерлейс, а может и только с ним работает! но я еще не встречал такой платы!

Дмитрий Белькевич   (17.01.06 3:00) [5]
Уточнил у заказчика - неры купленной у его нет, а с лицензиями там всё жестко

там необходима только одна длл-ка NeroVideoProc.ax


 
Дмитрий Белькевич   (2006-01-17 23:22) [7]

Как к этому NeroVideoProc.ax фильтру подключиться? Кинь, плиз, код сюда или на мыло и спасибо за информацию.


 
AlterEgo of WondeRu ©   (2006-01-18 00:38) [8]

Дмитрий Белькевич   (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-18 04:14) [9]

Большое спасибо!
Я с 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 не признаётся - не его.

Пока нужно быстро, потом обязательно подниму, если сама железяка даст.


 
WondeRu ©   (2006-01-18 09:53) [10]

Дмитрий Белькевич   (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 13:35) [11]

У меня TDSVideoWindowEx2 ипользуется для вывода превью.
Пробовал вчера еще у DSVideoWindowEx2 запросить - тоже не возвращает, сейчас полезу внутрь к его полю FVideoWindow, или, может приведением Делфи сама разрулит.


 
Дмитрий Белькевич   (2006-01-19 04:35) [12]

Попробовал с неро. Получился честный квадрат Малевича, как он должен быть.
Всё нормально поподключалось, результат - s_ok на всех концах, но в окне предпросмотра пусто, пробовал как DSVideoWindowEx2, так и VideoWindow.
Может какие-то интерфейсы неровского фильтра подёргать нужно для его настройки?

FVideoWindow в DSVideoWindowEx2 тоже IVMRMixerControl  не отдал, с VideoWindow пока не пробовал.


 
WondeRu ©   (2006-01-19 10:14) [13]

Дмитрий Белькевич   (19.01.06 4:35) [12]
черный квадрат может возникать из-за того, что ты меняешь настройки пинов уже после подключения НЕРО :) А надо ДО!


 
Дмитрий Белькевич   (2006-01-27 04:54) [14]

Добрый день. Был некоторое время в разъездах. Вот приехал, таки удалось всё посоединять и настройки не менять. Все заработало, деинтерлейс даёт. Но есть одно но - скорость. Получается где-то 0,2 - 0,5 фпс. Т.е. одного кадра нужно ждать 2-10 секунд. Процессор при этом (слабенький, правда - дюрон 1200), почти не загружен где-то 3-4%. Можно ли как-то от фильтра добиться работы в реальном времени? Спасибо за советы, очень помогают.


 
vrem   (2006-01-27 05:18) [15]

>захватывать без интерлейса
Автор, видео идёт полями, все чётные строки, затем все нечётные, 50 полей в секунду. деинтерлейсеры клеют эти поля разными способами. Без интерлейса - это вам какое то одно поле захватывать надо, всё остальное полумеры :)


 
Дмитрий Белькевич   (2006-01-27 12:05) [16]

Вот хочу заодно разобраться.
Четные/нечетные, в одном кадре - это всё понятно. Непонятно только, что обозначает слово "поля". Вот перед мной телевозор. Он в один момент времени показывает один кадр. Так? Так. В одном кадре, например, в PAL"е, 625 строчек так? Так. Я эти 625 строчек вижу? Скорее всего да, если сильно нужно, могу специально осцилограф на модулятор ткнуть и посчитать. Они размазаны гребенкой? Нет. Значит где-то этот телевизор эти строчки берет? Берет. 50 раз в секунду показывает честные кадры. Или в телевизоре реально 625/2 строчек, а остальное - эффекты интерполяции?
Как это клеит телевизор? Был бы алгоритм - сам бы написал. Благо asm, mmx, sse владею. Чувствую, будет как обычно. Помаюсь с чужой кривизной, и придётся свое что-то делать.
Спасибо за ответы.


 
Иванов   (2006-01-27 13:19) [17]

В телевизоре показывается первое поле, затем через 1/50 секунды второе с небольшим смещением вниз. Проблема гребенки состоит в том, что в первом поле и во втором поле находится информация за разные моменты времени.

Деинтерлейс или пытается пересчитать оба поля к одному времени (достаточно долго по времени) или просто показывает поля (с половинным разрешением) друг за другом с частотой 50 кадров в секунду.

А нельзя в Вашей задаче захватить с интерлейсом, а потом не спеша выполнить деинтерлейс? Пусть даже с 0.5 fps


 
Дмитрий Белькевич   (2006-01-27 14:42) [18]

Непонятно, почему фильтр (пробовал уже три - nero, как советовали, и две реализации фришного deintarlace) не грузит процессор почти. Интересно, если поставить на более мощную машину, поможет или нет?
Можно считать данные и позже, после захвата. Реалтайм не нужен.


 
Дмитрий Белькевич   (2006-01-27 14:49) [19]

Еще насчет телевизора.
Тв показывает с частотой 50 Гц. Сигнал тоже идёт с этой частотой.
Свалился кадр номер один. В нём 625 строк. И что телевизор с ними делает? Показывает вначале четные, потом нечетные? Или запоминает (там линии задержки есть, насколько я помню) кадр, потом четные сточки первого мешает с нечетными второго, а четные второго с нечетными третьего. Тогда тв должен 100 гц показывать, иначе времени не хватит.
Не понимаю.


 
Sapersky   (2006-01-27 14:49) [20]

Описание некоторых алгоритмов деинтерлейса:

http://compression.graphicon.ru/video/deinterlacing/deinterlacing.pdf

Кроме того, судя по информации из DX SDK, деинтерлейс может делать видеокарта при выводе через оверлей, правда, только довольно примитивным методом BOB, примерно то, что в статье называется Duplicate field. Хотя на практике вполне может оказаться, что подобных видеокарт не существует - в DX предостаточно никем не поддерживаемых возможностей.


 
AlterEgo of WondeRu ©   (2006-01-29 21:16) [21]

Дмитрий Белькевич   (27.01.06 14:42) [18]
c NERO у меня грузит проц... притом замечательно... на 60% на обеих машинах: Athlon64 3000+ и Athlon64 2800+ по 512Мб на борту


 
Дмитрий Белькевич   (2006-01-29 21:41) [22]

Спасибо за ссылку. Я уже как-то задавал вопрос, но в ответ тишина. Вторая попытка: как подлючить фильтры virtualdub"а?


 
Дмитрий Белькевич   (2006-01-29 21:57) [23]

Посмотрел, фильтр всего две функции экспортирует:

   000028B0    1 0000 VirtualdubFilterModuleDeinit
   00002870    2 0001 VirtualdubFilterModuleInit2

Пойду сырцы даба ковырять, что-то ж он им передаёт....


 
Дмитрий Белькевич   (2006-01-31 04:59) [24]


> c NERO у меня грузит проц... притом замечательно... на 60%
> на обеих машинах: Athlon64 3000+ и Athlon64 2800+ по 512Мб
> на борту


Realtime renderring получается?


 
WondeRu ©   (2006-01-31 09:04) [25]

Дмитрий Белькевич   (31.01.06 4:59) [24]
Realtime renderring получается?

Угу... приложение писал для одного ночного клуба... там именно пришлось применить NERO, для того чтобо нормально картинка выводилась с тюнера


 
Дмитрий Белькевич ©   (2006-02-18 21:08) [26]

Я, надеюсь, еще не надоел ;)
Добрался я опять до интерлейса.
Фильтр таки заработал, правда, не неровский, использовал фришный deinterlace.ax. Но есть одна особенность.
Перед подключением его к графу (CoCreateInstance, AddFilter(DeinterlaceFilter, "Deinterlace")), нужно обязательно вызвать страницу настроек:

OleCreatePropertyFrame(Handle, 30, 30, nil, 1, @StreamConf, auuid.cElems, auuid.pElems, 0, 0, nil);

иначе работает так, как я описывал выше - процессор почти не загружен, fps падает вначале до 5, потом медленно поток почти останавливается.

Если перед подключением фильтра вызвать страницу настроек потока, всё ок. Фильтр работает, загрузка - 50-55%. Может еще какие-нибудь умные у
кого мысли возникнут. Спасибо.



Страницы: 1 вся ветка

Форум: "Media";
Текущий архив: 2006.08.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.042 c
6-1143533342
Sasha73
2006-03-28 12:09
2006.08.13
Копирование файлов по ЛВС с авторизацией?


2-1153028383
Chort
2006-07-16 09:39
2006.08.13
Фильтр


11-1131278061
Haker
2005-11-06 14:54
2006.08.13
wordwrap в KOLRichEdit


2-1153895423
Константин_
2006-07-26 10:30
2006.08.13
Выборка определенного количества символов в SQL запросе


2-1153487386
bajenovv
2006-07-21 17:09
2006.08.13
помогите плиз !!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский