Directshow, фильтр смены типа формата

Как я могу изменить rcTarget в filter?

Исходные и целевые прямоугольники в видео рендерерах

Хочу, например, в бесплатные паскали и DSpack. Мой проект для работы с 720x576 видео формат. Если я могу изменить фильтр rcTarget пример: LAVSplitter ПИН ВИДЕО, я решил свои проблемы.


Я хочу объяснить мою проблему:

Мой проект и разрабатывался с DSPack и Lazarus. Я должен запустить список воспроизведения медиа-файлов и добавить прокрутку текста. Выходная карта DeckLink аналоговая или аналогичная. Для подключения телевизора используется монитор S-Video.

Сейчас я вижу в видеоконном рабочем столе и ТВ-мониторах, подключенных к DeckLink, только оригинальные видеоролики 720х576.

Я хочу, чтобы все видео форматы запускались. msdn site: Исходные и целевые прямоугольники в Video Renderers описывает, как изменить rcTarget в videoinfoheader. Я не умею писать на паскале, использовал dspack. или есть другой способ изменить размер видео? Мне нужно создать новый фильтр, или я могу изменить свойства в примере фильтра rcTarget: LAVSplitter?

мой график | SourceFile| -> 1920x1080 | LAV Splitter | -> 720x576 | LAV Decoder| -> Тройник Фильтр | -> видеоокна и рендер DeckLink

В Интернете много примеров изменения размера внешнего устройства захвата веб-камеры, я не нахожу пример кода выхода внешнего устройства. Для этого я прошу помощи.

У меня есть пример для MPEG-2, не работает. Где я ошибаюсь?

// var
//    mt     : AM_Media_Type;
//    seqHdr : array [0..0] of byte;  //this is right?
//    pWIH   : MPEG2VIDEOINFO;
ZeroMemory(@Mt, sizeof(AM_MEDIA_TYPE));
Mt.MajorType := MEDIATYPE_Video;
Mt.SubType := MEDIASUBTYPE_RGB32;
Mt.FormatType := FORMAT_MPEG2_VIDEO;

Mt.cbFormat := sizeof(MPEG2VIDEOINFO) + sizeof(seqHdr); 
mt.pbFormat := CoTaskMemAlloc(mt.cbFormat);

if (mt.pbFormat = NULL) then exit;  //   ERROR 
ZeroMemory(mt.pbFormat, mt.cbFormat);

{ RCSRC.Left := 0;
RCSRC.Top:= 0;
RCSRC.Right := 0;
RCSRC.Bottom := 0;
}
pWIH.hdr.rcSource.Left:=0;    
pWIH.hdr.rcSource.Top:=0;
pWIH.hdr.rcSource.Right:=0;
pWIH.hdr.rcSource.Bottom:=0;
// pWIH.hdr.rcSource := RCSRC;
//  pWIH.hdr.rcTarget := Rect(0,0,720,576);
pWIH.hdr.rcTarget.Left:=0;
pWIH.hdr.rcTarget.Top:=0;
pWIH.hdr.rcTarget.Right:=576;
pWIH.hdr.rcTarget.Bottom:=720;
pWIH.hdr.AvgTimePerFrame := 278335;
pWIH.hdr.dwPictAspectRatioX := 4;
pWIH.hdr.dwPictAspectRatioY := 3;
pWIH.hdr.bmiHeader.biSize := 40;
pWIH.hdr.bmiHeader.biWidth := 720;
pWIH.hdr.bmiHeader.biHeight := 576;
pWIH.cbSequenceHeader := sizeof(seqHdr);
 CopyMemory(@pwih.dwSequenceHeader, @seqHdr, sizeof(seqhdr));
//-------------------------------------
SourceFilter.FindPin('Output',PinOutSource);
(VideoWindow1 as IBaseFilter).FindPin('Input',PIn_input);
PinOutSource.Connect(PIn_input,@mt);

1 ответ

Спасибо Спасибо спасибо. Я хочу использовать ( 3. Используйте этот фильтр Resizer DMO). Я создал фильтр Resize, как ваш пример. ХОРОШО. Теперь я хочу использовать: (FResizerDMO как IMediaObject).SetOutputType для изменения размера моего видео. У меня есть трудности, вы можете мне помочь?

на сайте alax.info:

  1. Создайте экземпляр DSP как DMO и добавьте его в DMO Wrapper Filter
  2. Используйте IWMResizerProps::SetFullCropRegion для инициализации DSP // Мне не нужно обрезать регион?
  3. Подключите входной контакт
  4. Установить тип вывода через IMediaObject:: SetOutputType
  5. IGraphBuilder:: Выходной контакт ConnectDirect

Это выше правильно?

Я пишу это:

var pVIH :VIDEOINFOHEADER; mt :DMO_MEDIA_TYPE;
ZeroMemory(@mt, sizeof(DMO_MEDIA_TYPE));
mt.majortype := MEDIATYPE_Video;
mt.subtype := MEDIASUBTYPE_RGB32;
mt.formattype := FORMAT_VideoInfo;
//    ** I can not translate this **
//    VIDEOINFOHEADER * pVIH = (VIDEOINFOHEADER *)pmt->pbFormat;
//    pVIH := TVideoInfoHeader(mt.pbFormat^);   ????
pVIH.bmiHeader.biWidth := 720;
pVIH.bmiHeader.biHeight := 576;
pVIH.bmiHeader.biXPelsPerMeter:=9;
pVIH.bmiHeader.biYPelsPerMeter:=16;
pVIH.bmiHeader.biSizeImage := 720 * 480 * 3;
hr := (FResizerDMO as IMediaObject).SetOutputType(0,@mt,DMO_SET_TYPEF_CLEAR);
   if hr <> S_OK then showmessage('error'); // I receive error

исправить эту дорогу? если это правильно, вы можете помочь, потому что это не работает.

Другие вопросы по тегам