游厚满 發表於 2021-1-26 18:56:00

Delphi USB摄像头

<p>参考:https://blog.csdn.net/qq_44111597/article/details/112787624</p>
<p>RAD Studio 10.2.3 测试√</p>
<hr>
<p>&nbsp;</p>
<div class="toc">
<h3>目录</h3>
<ul>
<li>
<ul>
<li>声明:</li>
<li>1.展示设备</li>
<li>2.展示格式</li>
<li>3.打开预览</li>
<li>4.保存图片至本地</li>
<li>5.色彩选择 和 通道选项</li>
<li>附件:untUSBCamera单元文件</li>
</ul>
</li>
</ul>
<p><img src="https://img2020.cnblogs.com/blog/1107379/202101/1107379-20210126185234789-1584625483.png" alt="" loading="lazy"></p>
<h2>声明:</h2>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">uses</span><span style="color: rgba(0, 0, 0, 1)">
DirectShow9, untUSBCamera, Winapi.ActiveX

</span><span style="color: rgba(0, 0, 255, 1)">private</span>
    <span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> Private declarations </span><span style="color: rgba(0, 128, 0, 1)">}</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 系统开发人员枚举【基本 Filter】</span>
<span style="color: rgba(0, 0, 0, 1)">    mBaseFilter         : IBaseFilter;
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> FI图形生成器【图形生成器】</span>
<span style="color: rgba(0, 0, 0, 1)">    mGraphBuilder      : IGraphBuilder;
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> FI媒体控制【媒体控制】</span>
<span style="color: rgba(0, 0, 0, 1)">    mMediaControl      : IMediaControl;
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> FI视频窗口【视频窗口】</span>
<span style="color: rgba(0, 0, 0, 1)">    mVideoWindow         : IVideoWindow;
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> FI捕获图生成器2【捕获图生成器2】</span>
<span style="color: rgba(0, 0, 0, 1)">    mCaptureGraphBuilder2: ICaptureGraphBuilder2;
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> FI样品采集器【样品采集器】</span>
<span style="color: rgba(0, 0, 0, 1)">    mSampleGrabber       : ISampleGrabber;
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> FreeGraph;
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> mSnapBmp;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> ShowFilterPropertyPages(filter: IBaseFilter; hFormHandle: THandle): Boolean;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span> ShowPinPropertyPages(pin: IPin; hFormHandle: THandle): Boolean;</pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 视频预览变量初始化</span>
<span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TForm1.FreeGraph;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
mBaseFilter            :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
mGraphBuilder         :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
mMediaControl         :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
mVideoWindow          :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
mCaptureGraphBuilder2 :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
mSampleGrabber      :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 截图 -- 保存</span>
<span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TForm1.mSnapBmp;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
pfs      : TFilterState;
mt         : TAMMediaType;
hr         : HResult;
pBufferSize: Integer;
pBuffer    : PByte;
bmp      : TBitmap;
vi         : PVideoInfoHeader;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> mMediaControl = <span style="color: rgba(0, 0, 255, 1)">nil</span> <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> FI媒体控制.获取状态(时间,Filter状态)</span>
mMediaControl.GetState(<span style="color: rgba(128, 0, 128, 1)">1000</span><span style="color: rgba(0, 0, 0, 1)">, pfs);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> pfs = State_Stopped <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 获取媒体类型 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> = 样品采集器.获取连接的媒体类型(媒体类型)</span>
hr :=<span style="color: rgba(0, 0, 0, 1)"> mSampleGrabber.GetConnectedMediaType(mt);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> hr &lt;&gt; S_OK <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 如果 媒体类型.格式 = nil</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> mt.pbFormat = <span style="color: rgba(0, 0, 255, 1)">nil</span> <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> = 视频信息标题(媒体类型.格式)</span>
vi :=<span style="color: rgba(0, 0, 0, 1)"> PVideoInfoHeader(mt.pbFormat);

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 获取当前帧数据大小 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> = 样品采集器.获取当前缓冲区(p缓冲区大小,nil)</span>
hr := mSampleGrabber.GetCurrentBuffer(pBufferSize, <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> hr &lt;&gt; S_OK <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 分配内存大小 </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
pBuffer :</span>=<span style="color: rgba(0, 0, 0, 1)"> AllocMem(pBufferSize);
</span><span style="color: rgba(0, 0, 255, 1)">try</span>
    <span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 再一次获取当前帧,获取图像数据 </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
    hr :</span>=<span style="color: rgba(0, 0, 0, 1)"> mSampleGrabber.GetCurrentBuffer(pBufferSize, pBuffer);
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> hr &lt;&gt; S_OK <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
      Exit;

    </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 创建位图 </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
    bmp :</span>= TBitmap.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">try</span>
      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> bmp.像素格式 =</span>
      bmp.PixelFormat :=<span style="color: rgba(0, 0, 0, 1)"> pf24bit;
      bmp.width       :</span>=<span style="color: rgba(0, 0, 0, 1)"> vi^.bmiHeader.biWidth;
      bmp.height      :</span>=<span style="color: rgba(0, 0, 0, 1)"> vi^.bmiHeader.biHeight;
      SetBitmapBits(bmp.Handle, vi^.bmiHeader.biSizeImage, pBuffer);
      bmp.Canvas.CopyRect(bmp.Canvas.ClipRect, bmp.Canvas, Rect(</span><span style="color: rgba(128, 0, 128, 1)">0</span>, bmp.height, bmp.width, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">));
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 把位图信息放在img控件中</span>
      bmp.SaveToFile(ExtractFilePath(Paramstr(<span style="color: rgba(128, 0, 128, 1)">0</span>)) + <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Temp\</span><span style="color: rgba(128, 0, 0, 1)">'</span> + FormatDateTime(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">YYYYMMDDhhmmss</span><span style="color: rgba(128, 0, 0, 1)">'</span>, Now()) + <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">.jpg</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
      bmp.Free;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
    FreeMem(pBuffer);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 显示 Filter 属性页【调用 Filter 的属性页,窗口的 Windows 本身的】</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TForm1.ShowFilterPropertyPages(filter: IBaseFilter; hFormHandle: THandle): Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">var</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 指定属性页</span>
<span style="color: rgba(0, 0, 0, 1)">pSpecify: ISpecifyPropertyPages;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 全局唯一标识符</span>
<span style="color: rgba(0, 0, 0, 1)">caGUID: TCAGUID;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result   :</span>=<span style="color: rgba(0, 0, 0, 1)"> False;
pSpecify :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
filter.QueryInterface(ISpecifyPropertyPages, pSpecify);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> pSpecify &lt;&gt; <span style="color: rgba(0, 0, 255, 1)">nil</span> <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 指定属性页.获取页面(全局唯一标识符)</span>
<span style="color: rgba(0, 0, 0, 1)">    pSpecify.GetPages(caGUID);
    pSpecify :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
    Result   :</span>= OleCreatePropertyFrame(hFormHandle, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 0, 1)">''</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, Pointer(@filter), caGUID.cElems, PGUID(caGUID.pElems), <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(0, 0, 255, 1)">nil</span>) =<span style="color: rgba(0, 0, 0, 1)"> S_OK;
    CoTaskMemFree(caGUID.pElems);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TForm1.ShowPinPropertyPages(pin: IPin; hFormHandle: THandle): Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">var</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 指定属性页</span>
<span style="color: rgba(0, 0, 0, 1)">pSpecify: ISpecifyPropertyPages;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 全局唯一标识符</span>
<span style="color: rgba(0, 0, 0, 1)">caGUID: TCAGUID;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result   :</span>=<span style="color: rgba(0, 0, 0, 1)"> False;
pSpecify :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Filter.查询接口(类型,值【指定属性页】)</span>
<span style="color: rgba(0, 0, 0, 1)">pin.QueryInterface(ISpecifyPropertyPages, pSpecify);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> pSpecify &lt;&gt; <span style="color: rgba(0, 0, 255, 1)">nil</span> <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 指定属性页.获取页面(全局唯一标识符)</span>
<span style="color: rgba(0, 0, 0, 1)">    pSpecify.GetPages(caGUID);
    pSpecify :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
    Result   :</span>= OleCreatePropertyFrame(hFormHandle, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 0, 1)">''</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, Pointer(@pin), caGUID.cElems, PGUID(caGUID.pElems), <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(0, 0, 255, 1)">nil</span>) =<span style="color: rgba(0, 0, 0, 1)"> S_OK;
    CoTaskMemFree(caGUID.pElems);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<h2>1.展示设备</h2>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 视频预览变量初始化 </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
FreeGraph;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 获取所有USB摄像头,存入下面控件的列表中</span>
<span style="color: rgba(0, 0, 0, 1)">EnumAllUSBCamera(ListBox3.Items);
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<h2>2.展示格式</h2>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> ListBox3.ItemIndex = -<span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    ShowMessage(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">请选择设备!</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
    exit;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 枚举视频支持格式 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(0, 0, 255, 1)">not</span> EnumVideoFormat(String(PVideoInputInfo(ListBox3.Items.Objects)^.strName), PVideoInputInfo(ListBox3.Items.Objects)^.index, ListBox4.Items) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

ListBox4.ItemIndex :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
ListBox4.SetFocus;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<h2>3.打开预览</h2>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> mMediaControl = <span style="color: rgba(0, 0, 255, 1)">nil</span> <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 视频预览 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> USBVideoPreview(mGraphBuilder, mCaptureGraphBuilder2, mBaseFilter, mVideoWindow, mMediaControl, mSampleGrabber, PVideoInputInfo(ListBox3.Items.Objects), PVideoFormatInfo(ListBox4.Items.Objects), Panel1, True) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Button14.Caption :</span>= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">3.停止预览</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
      mMediaControl.Run;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Button14.Caption :</span>= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">3.打开预览</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
    mMediaControl.Stop;
    FreeGraph;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<h2>4.保存图片至本地</h2>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
mSnapBmp;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<h2>5.色彩选择 和 通道选项</h2>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 色彩选择</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
ShowFilterPropertyPages(mBaseFilter, Handle);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 通道选项</span>
<span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
pin: IPin;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
mCaptureGraphBuilder2.FindPin(mBaseFilter, PINDIR_OUTPUT, </span><span style="color: rgba(0, 0, 255, 1)">nil</span>, <span style="color: rgba(0, 0, 255, 1)">nil</span>, False, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">, pin);
ShowPinPropertyPages(pin, Handle);
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<h2>附件:untUSBCamera单元文件</h2>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">unit</span><span style="color: rgba(0, 0, 0, 1)"> untUSBCamera;

</span><span style="color: rgba(0, 0, 255, 1)">interface</span>

<span style="color: rgba(0, 0, 255, 1)">uses</span><span style="color: rgba(0, 0, 0, 1)">
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, DirectShow9, ActiveX, Dialogs, StdCtrls, ExtCtrls;

</span><span style="color: rgba(0, 0, 255, 1)">type</span><span style="color: rgba(0, 0, 0, 1)">
PVideoInputInfo</span>=<span style="color: rgba(0, 0, 0, 1)"> ^TVideoInputInfo;
PVideoFormatInfo </span>=<span style="color: rgba(0, 0, 0, 1)"> ^TVideoFormatInfo;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 视频输入设备 </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
TVideoInputInfo </span>= <span style="color: rgba(0, 0, 255, 1)">record</span><span style="color: rgba(0, 0, 0, 1)">
    id: TGUID;
    strName: ShortString;
    index: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 视频支持格式 </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
TVideoFormatInfo </span>= <span style="color: rgba(0, 0, 255, 1)">record</span><span style="color: rgba(0, 0, 0, 1)">
    id: TGUID;
    iWidth, iHeight: Integer;
    iMod: TGUID;
    Frame: Int64;
    format: ShortString;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">type</span><span style="color: rgba(0, 0, 0, 1)">
IAMStreamConfig </span>= <span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)">(IUnknown)
    [</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">{C6E13340-30AC-11d0-A18C-00A0C9118956}</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">]
    </span><span style="color: rgba(0, 0, 255, 1)">function</span> SetFormat(<span style="color: rgba(0, 0, 255, 1)">const</span> pmt: TAMMediaType): HResult; <span style="color: rgba(0, 0, 255, 1)">stdcall</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span> GetFormat(<span style="color: rgba(0, 0, 255, 1)">out</span> ppmt: PAMMediaType): HResult; <span style="color: rgba(0, 0, 255, 1)">stdcall</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span> GetNumberOfCapabilities(<span style="color: rgba(0, 0, 255, 1)">out</span> piCount, piSize: Integer): HResult; <span style="color: rgba(0, 0, 255, 1)">stdcall</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> Delphi 声明有误,修改声明 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
    <span style="color: rgba(0, 0, 255, 1)">function</span> GetStreamCaps(iIndex: Integer; <span style="color: rgba(0, 0, 255, 1)">var</span> ppmt: PAMMediaType; pSCC: PVideoStreamConfigCaps): HResult; <span style="color: rgba(0, 0, 255, 1)">stdcall</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

ISampleGrabber </span>= <span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)">(IUnknown)
    [</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">{6B652FFF-11FE-4FCE-92AD-0266B5D7C78F}</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">]
    </span><span style="color: rgba(0, 0, 255, 1)">function</span> SetOneShot(OneShot: BOOL): HResult; <span style="color: rgba(0, 0, 255, 1)">stdcall</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> Delphi 声明有误,修改声明 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
    <span style="color: rgba(0, 0, 255, 1)">function</span> SetMediaType(pType: PAMMediaType): HResult; <span style="color: rgba(0, 0, 255, 1)">stdcall</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span> GetConnectedMediaType(<span style="color: rgba(0, 0, 255, 1)">out</span> pType: TAMMediaType): HResult; <span style="color: rgba(0, 0, 255, 1)">stdcall</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span> SetBufferSamples(BufferThem: BOOL): HResult; <span style="color: rgba(0, 0, 255, 1)">stdcall</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span> GetCurrentBuffer(<span style="color: rgba(0, 0, 255, 1)">var</span> pBufferSize: longint; pBuffer: Pointer): HResult; <span style="color: rgba(0, 0, 255, 1)">stdcall</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span> GetCurrentSample(<span style="color: rgba(0, 0, 255, 1)">out</span> ppSample: IMediaSample): HResult; <span style="color: rgba(0, 0, 255, 1)">stdcall</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span> SetCallback(pCallback: ISampleGrabberCB; WhichMethodToCallback: longint): HResult; <span style="color: rgba(0, 0, 255, 1)">stdcall</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 枚举所有视频输入设备 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;summary&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ 枚举所有视频输入设备</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;/summary&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="strsList"&gt;设备名称展示的存放地方&lt;/param&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> EnumAllUSBCamera(strsList: TStrings);

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 枚举视频支持格式 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;summary&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ 枚举视频支持格式【遍历出支持的视频格式】</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;/summary&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="strFriendlyName"&gt;传进来的设备名称&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="intIndex"&gt;设备的下标序号&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="strsList"&gt;格式展示的box&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;returns&gt;布尔类型&lt;/returns&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">function</span> EnumVideoFormat(<span style="color: rgba(0, 0, 255, 1)">const</span> strFriendlyName: String; <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> intIndex: Integer; strsList: TStrings): Boolean;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 视频预览 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;summary&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ 视频预览【USB视频预览】</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;/summary&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="FIGraphBuilder"&gt;FI图形生成器&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="FICaptureGraphBuilder2"&gt;FI捕获图生成器2&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="FSysDevEnum"&gt;FSys开发枚举【mBaseFilter】&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="FIVideoWindow"&gt;FI视频窗口&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="FIMediaControl"&gt;FI媒体控制&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="FISampleGrabber"&gt;FI样品采集器&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="pv"&gt;P视频输入信息(USB摄像头.列表.对象)&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="pf"&gt;P视频输入信息(USB摄像头支持格式.列表.对象)&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="pnl"&gt;pnl视频【放视频的面板】&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="bSnapBmp"&gt;是否需要截屏功能&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;returns&gt;布尔类型&lt;/returns&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">function</span> USBVideoPreview(<span style="color: rgba(0, 0, 255, 1)">var</span> FIGraphBuilder: IGraphBuilder; <span style="color: rgba(0, 0, 255, 1)">var</span> FICaptureGraphBuilder2: ICaptureGraphBuilder2; <span style="color: rgba(0, 0, 255, 1)">var</span> FSysDevEnum: IBaseFilter; <span style="color: rgba(0, 0, 255, 1)">var</span> FIVideoWindow: IVideoWindow; <span style="color: rgba(0, 0, 255, 1)">var</span> FIMediaControl: IMediaControl; <span style="color: rgba(0, 0, 255, 1)">var</span> FISampleGrabber: ISampleGrabber; pv: PVideoInputInfo; pf: PVideoFormatInfo; pnl: TPanel; <span style="color: rgba(0, 0, 255, 1)">const</span> bSnapBmp: Boolean =<span style="color: rgba(0, 0, 0, 1)"> True): Boolean;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 视频录制 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;summary&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ 视频录制【USB视频录制】</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;/summary&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="FIGraphBuilder"&gt;FI图形生成器&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="FICaptureGraphBuilder2"&gt;FI捕获图生成器&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="FSysDevEnum"&gt;FSys开发枚举&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="FIVideoWindow"&gt;FI视频窗口&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="FIMediaControl"&gt;FI媒体控制&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="FISampleGrabber"&gt;FI样品采集器&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="pv"&gt;P视频输入信息(USB摄像头.列表.对象)&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="pf"&gt;P视频输入信息(USB摄像头支持格式.列表.对象)&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="pnl"&gt;pnl视频【放视频的面板】&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="strSaveFileName"&gt;视频文件保存的位置&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;returns&gt;布尔类型&lt;/returns&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">function</span> USBVideoRecord(<span style="color: rgba(0, 0, 255, 1)">var</span> FIGraphBuilder: IGraphBuilder; <span style="color: rgba(0, 0, 255, 1)">var</span> FICaptureGraphBuilder2: ICaptureGraphBuilder2; <span style="color: rgba(0, 0, 255, 1)">var</span> FSysDevEnum: IBaseFilter; <span style="color: rgba(0, 0, 255, 1)">var</span> FIVideoWindow: IVideoWindow; <span style="color: rgba(0, 0, 255, 1)">var</span> FIMediaControl: IMediaControl; <span style="color: rgba(0, 0, 255, 1)">var</span> FISampleGrabber: ISampleGrabber; pv: PVideoInputInfo; pf: PVideoFormatInfo; pnl: TPanel; <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> strSaveFileName: String): Boolean;

</span><span style="color: rgba(0, 0, 255, 1)">implementation</span>

<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)">
IID_IPropertyBag: TGUID </span>= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">{55272A00-42CB-11CE-8135-00AA004BB851}</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;

c_arrVideoFormatGUID: </span><span style="color: rgba(0, 0, 255, 1)">array</span> [<span style="color: rgba(128, 0, 128, 1)">0</span> .. <span style="color: rgba(128, 0, 128, 1)">35</span>] <span style="color: rgba(0, 0, 255, 1)">of</span> PGUID = (                                                                                 <span style="color: rgba(0, 128, 0, 1)">//
</span>    @MEDIASUBTYPE_CLPL, @MEDIASUBTYPE_YUYV, @MEDIASUBTYPE_IYUV, @MEDIASUBTYPE_YVU9, @MEDIASUBTYPE_Y411, @MEDIASUBTYPE_Y41P,          <span style="color: rgba(0, 128, 0, 1)">//
</span>    @MEDIASUBTYPE_YUY2, @MEDIASUBTYPE_YVYU, @MEDIASUBTYPE_UYVY, @MEDIASUBTYPE_Y211, @MEDIASUBTYPE_YV12, @MEDIASUBTYPE_CLJR,          <span style="color: rgba(0, 128, 0, 1)">//
</span>    @MEDIASUBTYPE_IF09, @MEDIASUBTYPE_CPLA, @MEDIASUBTYPE_MJPG, @MEDIASUBTYPE_TVMJ, @MEDIASUBTYPE_WAKE, @MEDIASUBTYPE_CFCC,          <span style="color: rgba(0, 128, 0, 1)">//
</span>    @MEDIASUBTYPE_IJPG, @MEDIASUBTYPE_Plum, @MEDIASUBTYPE_DVCS, @MEDIASUBTYPE_DVSD, @MEDIASUBTYPE_MDVF, @MEDIASUBTYPE_RGB1,          <span style="color: rgba(0, 128, 0, 1)">//
</span>    @MEDIASUBTYPE_RGB4, @MEDIASUBTYPE_RGB8, @MEDIASUBTYPE_RGB565, @MEDIASUBTYPE_RGB555, @MEDIASUBTYPE_RGB24, @MEDIASUBTYPE_RGB32,    <span style="color: rgba(0, 128, 0, 1)">//
</span>    @MEDIASUBTYPE_ARGB1555, @MEDIASUBTYPE_ARGB4444, @MEDIASUBTYPE_ARGB32, @MEDIASUBTYPE_AYUV, @MEDIASUBTYPE_AI44, @MEDIASUBTYPE_IA44 <span style="color: rgba(0, 128, 0, 1)">//
</span><span style="color: rgba(0, 0, 0, 1)">    );

c_arrVideoFormatName: </span><span style="color: rgba(0, 0, 255, 1)">array</span> [<span style="color: rgba(128, 0, 128, 1)">0</span> .. <span style="color: rgba(128, 0, 128, 1)">35</span>] <span style="color: rgba(0, 0, 255, 1)">of</span> AnsiString = (    <span style="color: rgba(0, 128, 0, 1)">//
</span>    <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">CLPL</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">YUYV</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">IYUV</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">YVU9</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Y411</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Y41P</span><span style="color: rgba(128, 0, 0, 1)">'</span>,          <span style="color: rgba(0, 128, 0, 1)">//
</span>    <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">YUY2</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">YVYU</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">UYVY</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Y211</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">YV12</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">CLJR</span><span style="color: rgba(128, 0, 0, 1)">'</span>,          <span style="color: rgba(0, 128, 0, 1)">//
</span>    <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">IF09</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">CPLA</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">MJPG</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">TVMJ</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">WAKE</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">CFCC</span><span style="color: rgba(128, 0, 0, 1)">'</span>,          <span style="color: rgba(0, 128, 0, 1)">//
</span>    <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">IJPG</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Plum</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">DVCS</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">DVSD</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">MDVF</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">RGB1</span><span style="color: rgba(128, 0, 0, 1)">'</span>,          <span style="color: rgba(0, 128, 0, 1)">//
</span>    <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">RGB4</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">RGB8</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">RGB565</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">RGB555</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">RGB24</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">RGB32</span><span style="color: rgba(128, 0, 0, 1)">'</span>,    <span style="color: rgba(0, 128, 0, 1)">//
</span>    <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ARGB1555</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ARGB4444</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ARGB32</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">AYUV</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">AI44</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">IA44</span><span style="color: rgba(128, 0, 0, 1)">'</span> <span style="color: rgba(0, 128, 0, 1)">//
</span><span style="color: rgba(0, 0, 0, 1)">    );

</span><span style="color: rgba(0, 0, 255, 1)">function</span> GetMaxIndex(<span style="color: rgba(0, 0, 255, 1)">const</span> strsList: TStrings; <span style="color: rgba(0, 0, 255, 1)">const</span> strUSBCameraName: <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">): Integer;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
III, Count: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result:</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
Count   :</span>=<span style="color: rgba(0, 0, 0, 1)"> strsList.Count;
</span><span style="color: rgba(0, 0, 255, 1)">for</span> III := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Count - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> CompareText(String(PVideoInputInfo(strsList.Objects)^.strName), strUSBCameraName) = <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Result :</span>= Result + <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 创建 Filter【Filter 实际上它不是物理摄像头,只是模拟摄像头设备可以采集图像】</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;summary&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ 创建 Filter【Filter 实际上它不是物理摄像头,只是模拟摄像头设备可以采集图像</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;/summary&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="gid"&gt;全局唯一标识&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="FriendlyName"&gt;摄像头名字&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="instanceIndex"&gt;摄像头下标序号&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;returns&gt;基本 Filter&lt;/returns&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> CreateFilter(gid: TGUID; FriendlyName: AnsiString; instanceIndex: Integer): IBaseFilter;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
pSysDevEnum: ICreateDevEnum;
pEnumCat   : IEnumMoniker;
pMoniker   : IMoniker;
cFetched   : ULONG;
pPropBag   : IPropertyBag;
bc         : IBindCtx;
mo         : IMoniker;
er         : IErrorLog;
ov         : OleVariant;
iIndex   : Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 系统开发人员枚举</span>
pSysDevEnum := <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 枚举猫</span>
pEnumCat    := <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 绰号</span>
pMoniker    := <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 如果 共同创建实例() = 0</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> CocreateInstance(CLSID_SystemDeviceEnum, <span style="color: rgba(0, 0, 255, 1)">nil</span>, CLSCTX_INPROC, IID_ICreateDevEnum, pSysDevEnum) = S_OK <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 系统开发人员枚举.创建类枚举器(gid,枚举猫,0)</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> pSysDevEnum.CreateClassEnumerator(gid, pEnumCat, <span style="color: rgba(128, 0, 128, 1)">0</span>) = S_OK <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      iIndex :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">while</span> (pEnumCat.Next(<span style="color: rgba(128, 0, 128, 1)">1</span>, pMoniker, @cFetched) = S_OK) <span style="color: rgba(0, 0, 255, 1)">and</span> (cFetched &gt; <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (pMoniker &lt;&gt; <span style="color: rgba(0, 0, 255, 1)">nil</span>) <span style="color: rgba(0, 0, 255, 1)">do</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      bc :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
      mo :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
      pMoniker.BindToStorage(bc, mo, IID_IPropertyBag, pPropBag);
      er :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
      pPropBag.Read(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">FriendlyName</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, ov, er);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> AnsiString(ov) = FriendlyName <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span>
          <span style="color: rgba(0, 0, 255, 1)">if</span> iIndex = instanceIndex <span style="color: rgba(0, 0, 255, 1)">then</span>
          <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
            bc :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
            mo :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
            pMoniker.BindToObject(bc, mo, IID_IBaseFilter, Result);
          </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
          Inc(iIndex);
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      pPropBag :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
      pMoniker :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
pEnumCat    :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
pSysDevEnum :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> VideoMediaSubTypeToStr(mst: TGUID): AnsiString;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
I: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>= <span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">for</span> I:= <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> <span style="color: rgba(128, 0, 128, 1)">35</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> CompareMem(c_arrVideoFormatGUID, @mst, sizeof(TGUID)) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> c_arrVideoFormatName;
      </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> FreeMediaType(mt: TAMMediaType);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (mt.cbFormat &lt;&gt; <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    CoTaskMemFree(mt.pbFormat);
    mt.cbFormat :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
    mt.pbFormat :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (mt.pUnk &lt;&gt; <span style="color: rgba(0, 0, 255, 1)">nil</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    mt.pUnk :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> DeleteMediaType(pmt: PAMMediaType);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> pmt &lt;&gt; <span style="color: rgba(0, 0, 255, 1)">nil</span> <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FreeMediaType(pmt^);
    CoTaskMemFree(pmt);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 获取输出引脚</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetOutputPin(filter: IBaseFilter): IPin;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
penum: IEnumPins;
f    : Integer;
d    : PIN_DIRECTION;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
filter.EnumPins(penum);
</span><span style="color: rgba(0, 0, 255, 1)">while</span> (penum.Next(<span style="color: rgba(128, 0, 128, 1)">1</span>, Result, @f) = S_OK) <span style="color: rgba(0, 0, 255, 1)">and</span> (f &gt; <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> (Result.QueryDirection(d) = S_OK) <span style="color: rgba(0, 0, 255, 1)">and</span> (d = PINDIR_OUTPUT) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 找到输出接口,返回 </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
      Exit;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
Result :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Str到视频媒体子类型(格式)</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> StrToVideoMediaSubType(ss: AnsiString): TGUID;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
I: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>= c_arrVideoFormatGUID[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">]^;
</span><span style="color: rgba(0, 0, 255, 1)">for</span> I:= <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> <span style="color: rgba(128, 0, 128, 1)">35</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> ss = c_arrVideoFormatName <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> c_arrVideoFormatGUID^;
      </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span> CompareGUID(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> g1, g2: TGUID): Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> CompareMem(@g1, @g2, sizeof(TGUID));
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置媒体类型(基本Filter,宽,高,格式)</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> SetMediaType(filter: IBaseFilter; Width, Height: Integer; format: AnsiString): Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
pmt            : PAMMediaType;
piCount, piSize: Integer;
I            : Integer;
pSCC         : PVideoStreamConfigCaps;
streamConfig   : IAMStreamConfig;
outPin         : IPin;
formatID       : TGUID;
selectedIndex: Integer;
ih             : PVIDEOINFOHEADER;
bitRate      : dword;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> False;

</span><span style="color: rgba(0, 0, 255, 1)">if</span> (Width = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">or</span> (Height = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 获取输出引脚</span>
outPin :=<span style="color: rgba(0, 0, 0, 1)"> GetOutputPin(filter);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 查询界面(IID_IAM流配置,流配置)</span>
<span style="color: rgba(0, 0, 0, 1)">outPin.QueryInterface(IID_IAMStreamConfig, streamConfig);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 如果 已分配(流配置)</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> assigned(streamConfig) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 选定索引 = -1</span>
    selectedIndex := -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 比特率 = 0</span>
    bitRate       := <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 格式ID = Str到视频媒体子类型(格式)</span>
    formatID      :=<span style="color: rgba(0, 0, 0, 1)"> StrToVideoMediaSubType(format);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 配置流.获取功能数量(数量,大小)</span>
<span style="color: rgba(0, 0, 0, 1)">    streamConfig.GetNumberOfCapabilities(piCount, piSize);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> getmen(视频流配置上限,大小)</span>
<span style="color: rgba(0, 0, 0, 1)">    getmem(pSCC, piSize);
    </span><span style="color: rgba(0, 0, 255, 1)">try</span>
      <span style="color: rgba(0, 0, 255, 1)">for</span> I := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> piCount - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 配置流.获取流上限(选定索引,媒体类型,视频流配置上限)</span>
<span style="color: rgba(0, 0, 0, 1)">      streamConfig.GetStreamCaps(I, pmt, pSCC);
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 视频信息头</span>
      ih :=<span style="color: rgba(0, 0, 0, 1)"> Pointer(pmt^.pbFormat);
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 选择最大比特率的格式</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (pSCC^.MinOutputSize.cx = Width) <span style="color: rgba(0, 0, 255, 1)">and</span> (pSCC^.MinOutputSize.cy = Height) <span style="color: rgba(0, 0, 255, 1)">and</span> (ih^.bmiHeader.biWidth = Width) <span style="color: rgba(0, 0, 255, 1)">and</span> (ih^.bmiHeader.biheight = Height) <span style="color: rgba(0, 0, 255, 1)">and</span> ((format = <span style="color: rgba(128, 0, 0, 1)">''</span>) <span style="color: rgba(0, 0, 255, 1)">or</span> (CompareGUID(formatID, pmt^.subtype))) <span style="color: rgba(0, 0, 255, 1)">and</span> (ih^.dwBitRate &gt; bitRate) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> select format with maximum bitrate</span>
      <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
          selectedIndex :</span>=<span style="color: rgba(0, 0, 0, 1)"> I;
          bitRate       :</span>=<span style="color: rgba(0, 0, 0, 1)"> ih^.dwBitRate;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 删除媒体类型(媒体类型)</span>
<span style="color: rgba(0, 0, 0, 1)">      DeleteMediaType(pmt);
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> selectedIndex &gt; -<span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      streamConfig.GetStreamCaps(selectedIndex, pmt, pSCC);
      </span><span style="color: rgba(0, 0, 255, 1)">try</span>
          <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 配置流.设置格式()</span>
<span style="color: rgba(0, 0, 0, 1)">          streamConfig.SetFormat(pmt^);
      </span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
          DeleteMediaType(pmt);
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">finally</span>
      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 释放</span>
<span style="color: rgba(0, 0, 0, 1)">      FreeMem(pSCC);
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 枚举所有USB摄像头</span><span style="color: rgba(0, 128, 0, 1)">
{</span><span style="color: rgba(0, 128, 0, 1)"> 枚举所有视频输入设备 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> EnumAllUSBCamera(strsList: TStrings);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
SysDevEnum: ICreateDevEnum;
EnumCat   : IEnumMoniker;
hr      : Integer;
Moniker   : IMoniker;
Fetched   : ULONG;
PropBag   : IPropertyBag;
strName   : OleVariant;
strGuid   : OleVariant;
III       : Integer;
puInfo    : PVideoInputInfo;
intIndex: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 共同创建实例</span>
<span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 创建系统枚举器对象 </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
hr :</span>= CocreateInstance(CLSID_SystemDeviceEnum, <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">, CLSCTX_INPROC, IID_ICreateDevEnum, SysDevEnum);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 如果 hr &lt;&gt; 0</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> hr &lt;&gt; S_OK <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 系统开发人员枚举.创建类枚举器(CLSID视频输入设备类别,枚举猫,0)</span>
<span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 用指定的 Filter 目录类型创建一个枚举器,并获得 IEnumMoniker 接口; </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
hr :</span>= SysDevEnum.CreateClassEnumerator(CLSID_VideoInputDeviceCategory, EnumCat, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> hr &lt;&gt; S_OK <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

</span><span style="color: rgba(0, 0, 255, 1)">try</span>
    <span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 释放内存 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 如果 数组的成员数量 &gt; 0</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> strsList.Count &gt; <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 0, 255, 1)">for</span> III := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> strsList.Count - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 释放(视频格式信息(对象))</span>
<span style="color: rgba(0, 0, 0, 1)">      FreeMem(PVideoFormatInfo(strsList.Objects));
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 数组释放</span>
<span style="color: rgba(0, 0, 0, 1)">    strsList.Clear;

    </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 获取指定类型目录下所有设备标识 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
    <span style="color: rgba(0, 0, 255, 1)">while</span> (EnumCat.Next(<span style="color: rgba(128, 0, 128, 1)">1</span>, Moniker, @Fetched) = S_OK) <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Moniker.BindToStorage(</span><span style="color: rgba(0, 0, 255, 1)">nil</span>, <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">, IID_IPropertyBag, PropBag);
      PropBag.Read(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">CLSID</span><span style="color: rgba(128, 0, 0, 1)">'</span>, strGuid, <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">);
      PropBag.Read(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">FriendlyName</span><span style="color: rgba(128, 0, 0, 1)">'</span>, strName, <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">);
      New(puInfo);
      puInfo^.id      :</span>=<span style="color: rgba(0, 0, 0, 1)"> TGUID(strGuid);
      puInfo^.strName :</span>=<span style="color: rgba(0, 0, 0, 1)"> ShortString(strName);
      puInfo^.index   :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> strsList.IndexOf(strName) = -<span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      strsList.AddObject(strName, TObject(puInfo));
      </span><span style="color: rgba(0, 0, 255, 1)">end</span>
      <span style="color: rgba(0, 0, 255, 1)">else</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 相同名称的 USBCamera 相机,&lt;有可能有多个名称重复的相机&gt; </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
      intIndex      :</span>=<span style="color: rgba(0, 0, 0, 1)"> GetMaxIndex(strsList, strName);
      puInfo^.index :</span>= intIndex + <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
      strsList.AddObject(strName </span>+ format(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">(%d)</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, ), TObject(puInfo));
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      PropBag :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
      Moniker :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
    EnumCat    :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
    SysDevEnum :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 遍历出来所有支持的格式【各种分辨率】参数1:传进来的名字,参数2:选择名字的下标,参数3:枚举出来的格式放在那里</span><span style="color: rgba(0, 128, 0, 1)">
{</span><span style="color: rgba(0, 128, 0, 1)"> 枚举视频支持格式 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">function</span> EnumVideoFormat(<span style="color: rgba(0, 0, 255, 1)">const</span> strFriendlyName: String; <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> intIndex: Integer; strsList: TStrings): Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
SysDevEnum          : IBaseFilter;
CaptureGraphBuilder2: ICaptureGraphBuilder2;
iunk                : IUnknown;
fStreamConfig       : IAMStreamConfig;
piCount, piSize   : Integer;
III               : Integer;
pmt               : PAMMediaType;
pSCC                : PVideoStreamConfigCaps;
pvInfo            : PVideoFormatInfo;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> False;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Filter 实际上它不是物理摄像头,只是模拟摄像头设备可以采集图像</span>
<span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 获取指定USB摄像头的 Filter </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
SysDevEnum :</span>=<span style="color: rgba(0, 0, 0, 1)"> CreateFilter(CLSID_VideoInputDeviceCategory, AnsiString(strFriendlyName), intIndex);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> SysDevEnum = <span style="color: rgba(0, 0, 255, 1)">nil</span> <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 释放内存 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> strsList.Count &gt; <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">for</span> III := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> strsList.Count - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      FreeMem(PVideoFormatInfo(strsList.Objects));
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
strsList.Clear;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 创建 ICaptureGraphBuilder2 接口 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> Failed(CocreateInstance(CLSID_CaptureGraphBuilder2, <span style="color: rgba(0, 0, 255, 1)">nil</span>, CLSCTX_INPROC, IID_ICaptureGraphBuilder2, CaptureGraphBuilder2)) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 获取 IID_IAMStreamConfig 接口 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> Failed(CaptureGraphBuilder2.FindInterface(<span style="color: rgba(0, 0, 255, 1)">nil</span>, <span style="color: rgba(0, 0, 255, 1)">nil</span>, SysDevEnum, IID_IAMStreamConfig, iunk)) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 获取 IAMStreamConfig 媒体类型接口 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> Failed(iunk.QueryInterface(IID_IAMStreamConfig, fStreamConfig)) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

</span><span style="color: rgba(0, 0, 255, 1)">if</span> Failed(fStreamConfig.GetNumberOfCapabilities(piCount, piSize)) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

</span><span style="color: rgba(0, 0, 255, 1)">if</span> piCount &lt;= <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> pSCC 视频流配置上线</span>
<span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 枚举支持的视频格式 </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
pSCC :</span>=<span style="color: rgba(0, 0, 0, 1)"> AllocMem(piSize);
</span><span style="color: rgba(0, 0, 255, 1)">try</span>
    <span style="color: rgba(0, 0, 255, 1)">for</span> III := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> piCount - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> fStreamConfig.GetStreamCaps(III, pmt, pSCC) = S_OK <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
          New(pvInfo); </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 注意释放内存 </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
          pvInfo^.Frame   :</span>=<span style="color: rgba(0, 0, 0, 1)"> PVIDEOINFOHEADER(pmt^.pbFormat)^.AvgTimePerFrame;
          pvInfo^.id      :</span>=<span style="color: rgba(0, 0, 0, 1)"> pmt^.formattype;
          pvInfo^.iWidth:</span>=<span style="color: rgba(0, 0, 0, 1)"> pSCC^.MaxOutputSize.cx;
          pvInfo^.iHeight :</span>=<span style="color: rgba(0, 0, 0, 1)"> pSCC^.MaxOutputSize.cy;
          pvInfo^.iMod    :</span>=<span style="color: rgba(0, 0, 0, 1)"> pmt^.subtype;
          pvInfo^.format:</span>=<span style="color: rgba(0, 0, 0, 1)"> VideoMediaSubTypeToStr(pmt^.subtype);
          strsList.AddObject(format(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">类型:%s分辨率:%4d×%4d</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, ), TObject(pvInfo));
      </span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
          DeleteMediaType(pmt);
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
    FreeMem(pSCC);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

SysDevEnum         :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
CaptureGraphBuilder2 :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
fStreamConfig      :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;

Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;summary&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ 普通影片</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;/summary&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="FIGraphBuilder"&gt;FI图形生成器&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="FICaptureGraphBuilder2"&gt;FI捕获图生成器&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="FSysDevEnum"&gt;FSys开发枚举&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="FIVideoWindow"&gt;FI视频窗口&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="FIMediaControl"&gt;FI媒体控制&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="FISampleGrabber"&gt;FI样品采集器&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="pv"&gt;P视频输入信息&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="pf"&gt;P视频格式信息&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="pnl"&gt;搭载视频的面板【panel面板控件】&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="strSaveFileName"&gt;保存文件路径名&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="bRecord"&gt;是否开始录像&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="bSnapBmp"&gt;是否开启截图功能&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;returns&gt;布尔类型&lt;/returns&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">function</span> CommonVideo(<span style="color: rgba(0, 0, 255, 1)">var</span> FIGraphBuilder: IGraphBuilder;               <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> FI图形生成器</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> FICaptureGraphBuilder2: ICaptureGraphBuilder2;                  <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> FI捕获图生成器</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> FSysDevEnum: IBaseFilter;                                       <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> FSys开发枚举</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> FIVideoWindow: IVideoWindow;                                    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> FI视频窗口</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> FIMediaControl: IMediaControl;                                  <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> FI媒体控制</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> FISampleGrabber: ISampleGrabber;                              <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> FI样品采集器</span>
pv: PVideoInputInfo; pf: PVideoFormatInfo;                        <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> pv:P视频输入信息、pf:P视频格式信息</span>
pnl: TPanel;                                                      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 搭载视频的面板【panel面板控件】</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> strSaveFileName: <span style="color: rgba(0, 0, 255, 1)">string</span> = <span style="color: rgba(128, 0, 0, 1)">''</span>; <span style="color: rgba(0, 0, 255, 1)">const</span> bRecord: Boolean = False; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 录像 【strSaveFileName:保存文件路径名、bRecord:是否开始录像】</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> bSnapBmp: Boolean = False                                     <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 截图 【bSnapBmp:是否开启截图功能】</span>
<span style="color: rgba(0, 0, 0, 1)">): Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
SampleGrabberFilter: IBaseFilter;
mt               : TAMMediaType;
multiplexer      : IBaseFilter;
Writer             : IFileSinkFilter;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> False;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 创建 图形生成器 接口</span>
<span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 创建 IGraphBuilder 接口 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> Failed(CocreateInstance(CLSID_FilterGraph, <span style="color: rgba(0, 0, 255, 1)">nil</span>, CLSCTX_INPROC, IID_IGraphBuilder, FIGraphBuilder)) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 创建 捕获图生成器 接口</span>
<span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 创建 ICaptureGraphBuilder2 接口 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> Failed(CocreateInstance(CLSID_CaptureGraphBuilder2, <span style="color: rgba(0, 0, 255, 1)">nil</span>, CLSCTX_INPROC, IID_ICaptureGraphBuilder2, FICaptureGraphBuilder2)) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> SetFiltergraph:设置滤镜</span>
<span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 调用 ICaptureGraphBuilder2 的 SetFilterGraph 方法将 FilterGraph 加入到 Builder 中 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> Failed(FICaptureGraphBuilder2.SetFiltergraph(FIGraphBuilder)) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 调用本单元的 CreateFilter 创建 Filter</span>
<span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 获取指定USB摄像头的 Filter </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
FSysDevEnum :</span>=<span style="color: rgba(0, 0, 0, 1)"> CreateFilter(CLSID_VideoInputDeviceCategory, AnsiString(pv^.strName), pv^.index);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> FSysDevEnum = <span style="color: rgba(0, 0, 255, 1)">nil</span> <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 调用本单元 SetMediaType 【设置指定 Filter 的媒体格式类型】</span>
<span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 设置指定 Filter 的媒体格式类型 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(0, 0, 255, 1)">not</span> SetMediaType(FSysDevEnum, pf^.iWidth, pf^.iHeight, pf^.format) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 将视频捕捉 Filter 添加到 Filter 图中 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> Failed(FIGraphBuilder.AddFilter(FSysDevEnum, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">VideoCapture</span><span style="color: rgba(128, 0, 0, 1)">'</span>)) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 如果需要截图功能 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> bSnapBmp <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 共同创建实例(,,,,样品采集器Filter)</span>
    CocreateInstance(CLSID_SampleGrabber, <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">, CLSCTX_INPROC, IID_IBaseFilter, SampleGrabberFilter);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> FI图形生成器.添加 Filter(样品采集器Filter,‘样品采集器’)</span>
    FIGraphBuilder.AddFilter(SampleGrabberFilter, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">SampleGrabber</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 样品采集器Filter.查询接口()</span>
<span style="color: rgba(0, 0, 0, 1)">    SampleGrabberFilter.QueryInterface(IID_ISampleGrabber, FISampleGrabber);
    zeromemory(@mt, sizeof(AM_MEDIA_TYPE));
    mt.majortype :</span>=<span style="color: rgba(0, 0, 0, 1)"> MEDIATYPE_Video;
    mt.subtype   :</span>= MEDIASUBTYPE_RGB24;   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 24位,位图格式输出</span>
    FISampleGrabber.SetMediaType(@mt);      <span style="color: rgba(0, 128, 0, 1)">//
</span>    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 样品采集器.设置缓冲液样本()</span>
    FISampleGrabber.SetBufferSamples(True); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 允许从 Buffer 中获取数据</span>
    <span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 渲染预览视频PIN </span><span style="color: rgba(0, 128, 0, 1)">}</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> Failed(FICaptureGraphBuilder2.RenderStream(@PIN_CATEGORY_PREVIEW, @MEDIATYPE_Video, FSysDevEnum, SampleGrabberFilter, <span style="color: rgba(0, 0, 255, 1)">nil</span>)) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
      Exit;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 渲染预览视频PIN </span><span style="color: rgba(0, 128, 0, 1)">}</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> Failed(FICaptureGraphBuilder2.RenderStream(@PIN_CATEGORY_PREVIEW, @MEDIATYPE_Video, FSysDevEnum, <span style="color: rgba(0, 0, 255, 1)">nil</span>, <span style="color: rgba(0, 0, 255, 1)">nil</span>)) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
      Exit;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 如果是视频录制 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> bRecord <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> SetOutputFileName:设置输出文件名</span>
    <span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 视频录制文件保持路径 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> Failed(FICaptureGraphBuilder2.SetOutputFileName(MEDIASUBTYPE_Avi, PWideChar(strSaveFileName), multiplexer, Writer)) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
      Exit;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> RenderStream:渲染流</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> Failed(FICaptureGraphBuilder2.RenderStream(@PIN_CATEGORY_CAPTURE, @MEDIATYPE_Video, FSysDevEnum, <span style="color: rgba(0, 0, 255, 1)">nil</span>, multiplexer)) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
      Exit;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 设置视频预览窗口 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> Failed(FIGraphBuilder.QueryInterface(IID_IVideoWindow, FIVideoWindow)) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 设置视频播放的WINDOWS窗口 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> Failed(FIVideoWindow.put_Owner(pnl.Handle)) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

</span><span style="color: rgba(0, 0, 255, 1)">if</span> Failed(FIVideoWindow.put_windowstyle(WS_CHILD <span style="color: rgba(0, 0, 255, 1)">or</span> WS_Clipsiblings)) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 设置视频尺寸 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> Failed(FIVideoWindow.SetWindowposition(<span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, pnl.Width, pnl.Height)) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 得到IMediaControl接口,用于控制流播放 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> Failed(FIGraphBuilder.QueryInterface(IID_IMediaControl, FIMediaControl)) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;

Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 视频预览 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">function</span> USBVideoPreview(<span style="color: rgba(0, 0, 255, 1)">var</span> FIGraphBuilder: IGraphBuilder; <span style="color: rgba(0, 0, 255, 1)">var</span> FICaptureGraphBuilder2: ICaptureGraphBuilder2; <span style="color: rgba(0, 0, 255, 1)">var</span> FSysDevEnum: IBaseFilter; <span style="color: rgba(0, 0, 255, 1)">var</span> FIVideoWindow: IVideoWindow; <span style="color: rgba(0, 0, 255, 1)">var</span> FIMediaControl: IMediaControl; <span style="color: rgba(0, 0, 255, 1)">var</span> FISampleGrabber: ISampleGrabber; pv: PVideoInputInfo; pf: PVideoFormatInfo; pnl: TPanel; <span style="color: rgba(0, 0, 255, 1)">const</span> bSnapBmp: Boolean =<span style="color: rgba(0, 0, 0, 1)"> True): Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>= CommonVideo(FIGraphBuilder, FICaptureGraphBuilder2, FSysDevEnum, FIVideoWindow, FIMediaControl, FISampleGrabber, pv, pf, pnl, <span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">, False, bSnapBmp);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 视频录制 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">function</span> USBVideoRecord(<span style="color: rgba(0, 0, 255, 1)">var</span> FIGraphBuilder: IGraphBuilder; <span style="color: rgba(0, 0, 255, 1)">var</span> FICaptureGraphBuilder2: ICaptureGraphBuilder2; <span style="color: rgba(0, 0, 255, 1)">var</span> FSysDevEnum: IBaseFilter; <span style="color: rgba(0, 0, 255, 1)">var</span> FIVideoWindow: IVideoWindow; <span style="color: rgba(0, 0, 255, 1)">var</span> FIMediaControl: IMediaControl; <span style="color: rgba(0, 0, 255, 1)">var</span> FISampleGrabber: ISampleGrabber; pv: PVideoInputInfo; pf: PVideoFormatInfo; pnl: TPanel; <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> strSaveFileName: String): Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> CommonVideo(FIGraphBuilder, FICaptureGraphBuilder2, FSysDevEnum, FIVideoWindow, FIMediaControl, FISampleGrabber, pv, pf, pnl, strSaveFileName, True, True);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">end</span>.</pre>
</div>
<p>&nbsp;</p>
<pre class="prettyprint"></pre>
</div>

</div>
<div id="MySignature" role="contentinfo">
    好的代码像粥一样,都是用时间熬出来的<br><br>
来源:https://www.cnblogs.com/jijm123/p/14331959.html
頁: [1]
查看完整版本: Delphi USB摄像头