编写自定义 DirectShow RTSP/RTP 源推送过滤器 - 来自实时源的时间戳数据

2023-12-15

我正在编写自定义 DirectShow 源推送过滤器,该过滤器应该从视频服务器接收 RTP 数据并将它们推送到渲染器。我编写了一个 CVideoPushPin 类,它继承自 CSourceStream 和 CVideoReceiverThread 类,它是从视频服务器接收 RTP 数据包的线程的包装器。接收器线程本质上做了三件事:

  • 接收原始 RTP 数据包并收集接收器报告所需的一些数据
  • 组装帧,将它们复制到缓冲区并将有关它们的信息存储到 256 元素队列,其定义如下:

    struct queue_elem {
       char *start; // Pointer to a frame in a buffer
       int length; // Lenght of data
       REFERENCE_TIME recvTime; // Timestamp when the frame was received (stream time)
    };
    
    struct data {
       struct queue_elem queue[QUEUE_LENGTH];
       int qWrIdx;
       int qRdIdx;
    HANDLE mutex;
    };
    
  • 每个接收到的帧都带有当前流时间的时间戳

    p->StreamTime(refTime);
    REFERENCE_TIME rt = refTime.GetUnits();
    

问题是我不确定如何为 FillBuffer 方法中的每个 MediaSample 设置时间戳。我尝试了多种方法,但播放要么停止,要么播放速度太慢。 目前 FillBuffer 方法如下所示:

   REFERENCE_TIME thisFrameStartTime, thisFrameEndTime;
// Make sure if there are at least 4 frames in the buffer
    if(noOfFrames >= 4)
    {   
        currentQe = m_myData.queue[m_myData.qRdIdx++]; //Take current frame description     
        if(m_myData.qRdIdx >= QUEUE_LENGTH)
        {
            m_myData.qRdIdx = 0;
        }           
        nextQe = m_myData.queue[m_myData.qRdIdx]; //Take next frame description
        if(currentQe.length > 0)
        {
            memcpy(pData, currentQe.start, currentQe.length);               

             pSample->SetActualDataLength(currentQe.length);                
            CRefTime refTime;
            m_pFilter->StreamTime(refTime);
            REFERENCE_TIME rt;
            rt = refTime.GetUnits();
            pSample->GetTime(&thisFrameStartTime, &thisFrameEndTime);
            thisFrameEndTime = thisFrameStartTime + (nextQe.recvTime - currentQe.recvTime);
            pSample->SetTime(&thisFrameStartTime, &thisFrameEndTime);   
        }
    }
    else 
    {
        pSample->SetActualDataLength(0);
    }

在这种情况下,我注意到队列中的项目数量增加得非常快(由于某种原因 FillBuffer 方法无法足够快地提取数据),结果是播放视频时增加了延迟。有人知道从实时来源接收数据时应该如何做时间戳吗?


当图形的流时间达到示例对象上的时间戳时,渲染器将绘制帧。如果我正确地阅读了您的代码,您将使用到达时的流时间对它们进行时间戳记,因此它们在渲染时总是会迟到。这在某种程度上被音频渲染器混淆了:如果音频渲染器提供图形的时钟,那么它将报告当前流时间为当前正在播放的任何样本,这将导致一些不良的时间行为。

  1. 您想要设置一个未来的时间,以允许图表中的延迟和过滤器中的任何缓冲。尝试将时间设置为未来 300 毫秒(现在的流时间 + 300 毫秒)。

  2. 您希望帧之间保持一致,因此不要根据每个帧的到达时间对它们添加时间戳。对每一帧使用 RTP 时间戳,并将第一帧的基线设置为未来 300 毫秒;随后的帧是 (rtp - rtp_at_baseline) + dshow 基线(具有适当的单位转换。

  3. 您需要使用相同的基线以相同的方式为音频和视频流添加时间戳。但是,如果我记得的话,RTP 时间戳在每个流中都有不同的基线,因此您需要使用 RTCP 数据包将 RTP 时间戳转换为(绝对)NTP 时间,然后使用初始基线将 NTP 转换为 directshow (基线 NTP = dshow现在的流时间 + 300 毫秒)。

G

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编写自定义 DirectShow RTSP/RTP 源推送过滤器 - 来自实时源的时间戳数据 的相关文章

  • 自定义文件格式和编解码器?

    我已经被编解码器问题弄乱了好几天了 但仍然看不到全局 这是我第一次处理音频 视频格式和编解码器 所以我真的需要一些帮助 这是工作 我正在编写几个负责编码和解码自定义 mpeg 文件的组件 在标准解 压缩过程 对于音频和视频 之上 我将实现一
  • 应用基于 dplyr 中的字符串(或字符串向量)的过滤器向量

    R 和 tidyverse 有一些极其强大但同样神秘的方法可以将字符串转换为可操作的表达式 我觉得一个人需要成为一名专家才能真正理解如何使用它们 NOTE 这个问题不同于this one https stackoverflow com qu
  • Powershell Get-ChildItem -Filter 的操作方式与具有相同值的Where 子句不同

    我的服务器上有一个名为 MyFolder 的文件夹 还有其他文件夹称为 MyFolder 1 MyFolder 2 MyFolder 3 等 如果我运行 gci C Sample Name like MyFolder 我得到预期的输出 Di
  • 图像卷积核逆滤波器的推导

    有谁知道如何计算二维滤波器的逆 假设我有一个 3x3 过滤器 0 1 0 1 1 1 0 1 0我想找到它的倒数 使用 DFT 很容易做到 但假设我想通过卷积来完成 现在 这就是问题所在 Matlab 符号不是我的专长 假设有一个 3X3
  • 使用 jQuery 从多个选择元素中过滤表格

    我想根据用户从多个选择元素中选择的内容使用 jQuery 隐藏 显示来过滤表格 我希望用户能够从 1 2 或 3 个选择元素中选择多个值 因此 他们可能会选择 2 名培训师 1 名新兵和 1 名状态人员 或者可能只选择 1 名培训师 计划创
  • MySQL 日期比较过滤器

    我有一些运行良好的 SQL 代码 并从我的 Wordpress 数据库返回所需的结果 但是 我根本无法理解如何过滤以下日期之间的日期 2010 12 10 00 00 00 and 2010 12 15 00 00 00 这是我的 SQL
  • 选择 pandas 数据框中所有零条目的列

    给定一个数据框df 如何找出所有只有0作为值的列 0 1 2 3 4 5 6 7 0 0 0 0 1 0 0 1 0 1 1 1 0 0 0 1 1 1 预期产出 2 4 0 0 0 1 0 0 我只需将这些值与 0 进行比较并使用 all
  • Jquery 匹配值

    您好 我正在尝试执行 if 语句来查看数组中的值是否完全匹配 然后我希望它的同级元素能够显示精确匹配的 html 有人可以帮忙吗 我使用 TWIG 作为高级自定义字段 Wordpress 插件的 HTML 我只想说一次的所有地点的图片以及它
  • ASP.NET Core 中的自定义授权属性

    我正在研究 asp net core 但我不明白一些事情 例如 在 mvc net 5 中 我们可以使用 AuthorizeAttribute 创建类来过滤和授权操作 并将属性设置为操作 如下所示 public class AdminAut
  • Grails 过滤器:无法使其工作!

    我正在尝试为我的网络应用程序编写一个过滤器 我阅读了 文档 1 并在我的grails app conf目录 class SecurityFilters def filters someFilter controller action wri
  • WordPress 使用 GD 图像引擎以编程方式将图像转换为 WebP 格式

    有许多 PHP 解决方案和 WP 插件 它们都带有我不想要 不需要的附加选项 即如何提供转换后的文件 存储它们的位置等 我不需要所有这些 并且正在寻找使用 GD 的纯简单代码 我不想使用插件 谢谢 编码应该什么时候发生 任何时候你知道这是钩
  • Ruby:通过正则表达式过滤数组?

    这对我来说是一个常见的 重复的习惯用法 使用正则表达式过滤数组 然后返回子数组 我的方法看起来不太像 Ruby 我来自 Java 我最终得到了很多看起来很像这样的方法 改进此代码的惯用 Ruby 方法是什么 def get all gifs
  • 卡尔曼滤波器和内部状态变量的质量

    我正在尝试为 Android 开发运动检测应用程序 应用程序应该能够跟踪手机在空间中的运动并将其映射到计算机屏幕上的运动 我正在使用 3 轴加速度计 由于数据非常嘈杂 我正在使用卡尔曼滤波器 内部状态是 6 个分量向量 speed x sp
  • 在过滤器Javascript中添加两个条件

    我试图在过滤器中添加两个条件 但只有一个有效 第一个条件检查单词之间是否有空格 第二个条件检查words length 是否大于给定的最小长度 如果字符串是 hello world 然后我需要在分割它时得到 hello world 相反 我
  • WEKA 的重采样过滤器 - 如何解释结果

    我目前正在努力解决机器学习问题 而我必须处理大量不平衡的数据集 也就是说 有六个类 1 2 6 不幸的是有例如对于 1 类 有 150 个示例 实例 对于 2 有 90 个实例 对于 3 类 只有 20 个实例 所有其他类都无法 训练 因为
  • 使用组合框过滤文本框

    好吧 我必须创建一个表单 它获取文件夹的内容并将其列出在文本框中 是的 文本框不是列表框 然后 我必须使用包含文件夹所有扩展名的组合框来过滤此文本框 例如 如果我在组合框中选择 txt 则文本框应过滤以仅显示所有文本文件 除了让组合框过滤文
  • 如何根据开始和结束条件过滤数据?

    我试图根据依赖于连续日期的两个条件来过滤数据 我在寻找对于 5 个以上的连续日期 值低于 2 with a 缓冲期 of 值 2 到 5 最多连续 3 天 它看起来像这样 很抱歉这里的 Excel 尝试很糟糕 第 1 天到第 10 天将包括
  • R - 过滤器坐标

    我是 R 新手 我有一个简单的问题 据我看来 但到目前为止我还没有找到解决方案 我有一组 长 2D x y 坐标 只是 2D 空间中的点 如下所示 ID x y 1 1758 56 1179 26 2 775 67 1197 14 3 29
  • gstreamer gst-rtsp-server 是否接受 udpsrc (RTP)?

    我想将 RTP 流输入到 gstreamer gst rtsp server 中 对于初始测试 我使用来自 github 的 test launch c 示例 https github com GStreamer gst rtsp serv
  • 使用 TextBox 过滤 Datagridview 行

    我有一个绑定的 datagridView 我想使用 TextBox 值对其进行过滤 我使用了这段代码 private void ChercheStextBox TextChanged object sender EventArgs e tr

随机推荐