Directshow,格式类型更改过滤器

时间:2015-03-23 11:49:32

标签: directshow lazarus dspack

如何更改rcTarget中的filter

Source and Target Rectangles in Video Renderers

我想要,例如免费的pascal和DSpack。 我的项目是使用720x576视频格式。如果我可以更改过滤器rcTarget ex。:LAVSplitter pin VIDEO,我解决了我的问题。


我想解释一下我的问题:

我的项目并与DSPack和lazarus共同开发。 我必须运行媒体文件播放列表并添加文本滚动。 输出DeckLink卡模拟或类似。用于连接电视监视器 S-视频。

现在我在连接到DeckLink的桌面和电视监视器上看到,只有原始视频720x576。

我想要运行所有视频格式。 msdn网站: Source and Target Rectangles in Video Renderers 介绍如何在videoinfoheader中更改rcTarget。我不知道如何写pascal,用过dspack。还是有另一种方法来调整视频大小? 我必须构建一个新的过滤器,或者我可以在rcTarget过滤器示例中更改属性:LAVSplitter?

我的图表 |的资源文件| - > 1920x1080 | LAV Splitter | - > 720x576 | LAV解码器| - > T恤过滤器| - > videowindows和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 个答案:

答案 0 :(得分:0)

谢谢,谢谢,谢谢。 我想使用(3.使用此Resizer DMO过滤器)。 我创建了Resize过滤器作为示例。好。 现在我想使用:(FResizerDMO as IMediaObject).SetOutputType 来调整我的视频大小。 我有困难,你可以帮帮我吗?

在网站alax.info中:

  1. CoCreate将DSP作为DMO实例并将其添加到DMO Wrapper Filter
  2. 使用IWMResizerProps :: SetFullCropRegion初始化DSP //我没有裁剪区域?
  3. 连接输入引脚
  4. 通过IMediaObject :: SetOutputType
  5. 设置输出类型
  6. IGraphBuilder :: ConnectDirect输出引脚
  7. 以上是正确的吗?

    我写这个:

    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
    

    纠正这条路? 如果它是正确的,你可以提供帮助,因为它不起作用。