gpt4 book ai didi

c++ - 如何使用 DirectShow 检测 PAL 或 NTSC 信号的存在?

转载 作者:行者123 更新时间:2023-12-04 14:46:22 37 4
gpt4 key购买 nike

背景
为了记录来自各种模拟摄像机的复合视频信号,我使用了 AverMedia 生产的基本 USB 视频捕获设备 (C039)。
enter image description here
我有两个模拟摄像机,一个产生 PAL 信号,另一个产生 NTSC 信号:

  • PAL B,625 行,25 帧/秒
  • NTSC M,525 行,29.97 fps(即 30/1.001)

  • 不幸的是,AverMedia C039 采集卡的驱动程序不会根据连接的摄像机自动设置正确的视频标准。
    目标
    我希望捕获驱动程序根据连接的摄像机自动配置为正确的视频标准,无论是 PAL 还是 NTSC。
    方法
    基本思想是设置一个视频标准,例如PAL,检查信号,如果没有检测到信号,则切换到其他标准。
    通过拼凑一些来自 DirectShow documentation 的例子,我可以从命令行手动设置正确的视频标准。
    所以,我需要做的就是弄清楚在切换到 PAL 或 NTSC 后如何检测信号是否存在。
    我知道必须可以自动检测信号的类型,例如描述的书中 "Video Demystified" .
    此外,(商业) AMCap viewer软件实际上证明它可以做到。
    然而,尽管我尽了最大的努力,我还是没能完成这项工作。
    有人能解释一下如何使用 C++ 中的 DirectShow 检测是否存在 PAL 或 NTSC 信号吗?
    Windows/COM/DirectShow 编程的世界对我来说仍然是新的,所以欢迎任何帮助。
    我试过的
    使用 IAMAnalogVideoDecoder界面,我可以读取当前标准( get_TVFormat() ),写入标准( put_TVFormat() ),读取行数等等。
    我采取的步骤可以总结如下:
    // summary of steps used to set the video standard, given a device moniker
    // NOTE: declarations, error handling, cleanup, and details of device enumeration are omitted, for brevity
    InitCaptureGraphBuilder(&pGraph, &pBuild);
    pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pCap);
    pGraph->AddFilter(pCap, L"Capture Filter");
    pBuild->FindInterface(&PIN_CATEGORY_ANALOGVIDEOIN, &MEDIATYPE_AnalogVideo, pCap, IID_IAMAnalogVideoDecoder, (void**)&pDecoder);
    pDecoder->put_TVFormat(AnalogVideo_PAL_B); // or AnalogVideo_NTSC_M
    上述步骤无需实际运行图形即可工作。 IAMAnalogVideoDecoder接口(interface)还定义了一个 get_HorizontalLocked()方法,返回成功,但无论是否连接相机,输出值似乎都没有变化。
    我可以想象可能有必要运行图表以获取有关例如的更新信息水平同步,但这似乎没有什么区别,尽管我不确定我的方法是否正确。
    一些观察
    下面描述的对话框是来自 AMCap viewer 的屏幕截图软件(选项-> 视频设备-> 属性)。
    这和 AmCap sample 不是一回事对于 DirectShow,随 Windows SDK 提供(尽管它可能基于此)。
    当我(断开)连接符合指定标准的相机时,此对话框中的“检测到的信号”值会发生变化。
    (尽管“检测到的线”值无论是否连接相机都保持不变。)
    property page
    “检测到的信号”值实际上是我正在寻找的。
    但是,我在 DirectShow 文档和 property set for analog video decoder devices 中都找不到任何提及它的地方。 .
    这可能与水平同步有关吗?
    该对话框看起来与我使用 ffmpeg 打开视频设备时出现的对话框相同。 :
    ffmpeg -f dshow -show_video_device_dialog true -i video="..." ...
    但是,在这种情况下,当相机断开连接时,“检测到的信号”值不会改变。
    我想这两个程序都使用 filter property pages 生成这个对话框.
    AverMedia SDK确实定义了一个 AVerGetSignalPresence()功能。
    不确定这是否可以完成这项工作,但如果可以使用“纯”DirectShow 来完成,我宁愿不引入依赖项。
    更新
    GraphEdit 中使用捕获设备后,我注意到“检测到的信号”值仅在连接(视频)渲染器(并且图形正在运行或暂停)时更新:
    graphedit

    最佳答案

    提到的属性页很可能会使用 IAMAnalogVideoDecoder 拉取数据和 get_HorizontalLocked方法特别。请注意,您可能会因要求过滤器图处于暂停或运行状态而无法接收有效状态,这反过来可能需要您连接渲染器以完成数据路径(视频渲染器或 Null Renderer,或其他渲染器你的选择)。
    另见 this question关于 Null Renderer 弃用和最坏情况替换的源代码。

    关于c++ - 如何使用 DirectShow 检测 PAL 或 NTSC 信号的存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69980501/

    37 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com