0

我怎样才能rcTarget改变filter

视频渲染器中的源矩形和目标矩形

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


我想解释我的问题:

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

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

我希望所有视频格式都运行。msdn 站点: 视频渲染器中的源和目标矩形 描述了如何更改 videoinfoheader 中的 rcTarget。我不知道怎么用pascal写,用dspack。还是有另一种调整视频大小的方法?我必须构建一个新过滤器,或者我可以更改 rcTarget 过滤器示例中的属性:LAVSplitter?

我的图表 | 源文件| -> 1920x1080 | LAV 分流器 | -> 720x576 | LAV解码器| -> 三通过滤器| -> 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);
4

1 回答 1

0

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

在网站 alex.info 中:

  1. CoCreateInstance 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

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

于 2015-03-28T15:50:15.667 回答