DirectShow音视频同步实验报告(2)

2023-11-09

单一视频流

 

Filter Graph如图2

 

2 单一视频流的Filter Graph

 

注意:紧靠Video Renderer的上一级FilterVideo输出Pin,其GetMediaType函数提供的Media TypeVIDEOINFOHEADER结构要求填写完整,不仅包括图像的宽度、高度、像素位数,还包括BITMAPINFOHEADER结构的大小(biSize,指定为sizeof(BITMAPINFOHEADER))、平面数(biPlanes,指定为1)。如果需要调色板,BITMAPINFOHEADER数据结构后面还要带上调色板数据;如果是16位的RGB格式,BITMAPINFOHEADER数据结构后面则要带上RGB分量提取的掩码。代码参考如下:

 

VIDEOINFO  mVideoInfo;

ZeroMemory(&mVideoInfo, sizeof(mVideoInfo));

mVideoInfo.AvgTimePerFrame = 333667;

mVideoInfo.bmiHeader.biSize     = sizeof(BITMAPINFOHEADER);

mVideoInfo.bmiHeader.biWidth    = 352;

mVideoInfo.bmiHeader.biHeight   = 240;

mVideoInfo.bmiHeader.biBitCount = 16;

mVideoInfo.bmiHeader.biPlanes   = 1;

mVideoInfo.bmiHeader.biCompression = BI_BITFIELDS;

mVideoInfo.bmiHeader.biSizeImage   = mVideoInfo.bmiHeader.biWidth *

        mVideoInfo.bmiHeader.biHeight * mVideoInfo.bmiHeader.biBitCount / 8;

for (int i = 0; i < 3; i++) // Important for 16 bit RGB!

{

        mVideoInfo.dwBitMasks[i] = bits565[i];

}

 

1.  使用Filter Graph Manager默认的参考时钟

 

:如果Filter Graph中没有一个Filter实现IReferenceClock接口,则该Filter Graph默认使用系统时钟作为参考时钟。

 

1.1    Video Sample不打时间戳、连续送出

现象:视频以最快的速度播放。Video Renderer不发送Quality Control消息。流时间线性增加。

Msiavsrc.ax(tid 920)     2307 : stream time: 120000

Msiavsrc.ax(tid 920)     2309 : stream time: 140000

Msiavsrc.ax(tid 920)     2311 : stream time: 160000

Msiavsrc.ax(tid 920)     2314 : stream time: 190000

Msiavsrc.ax(tid 920)     2316 : stream time: 210000

Msiavsrc.ax(tid 920)     2318 : stream time: 230000

Msiavsrc.ax(tid 920)     2320 : stream time: 250000

……

Msiavsrc.ax(tid 920)     3569 : stream time: 12740000(最后一个Sample

 

1.2    Video Sample不打时间戳、间隙送出(模拟网络阻塞情况)

现象:视频播放一顿一顿。Video Renderer不发送Quality Control消息。视频数据流的阻塞不会影响流时间。流时间线性增加,间隙休眠的时间反映在前后两次获得的流时间上。

Msiavsrc.ax(tid 970)     2385 : stream time: 680000

Msiavsrc.ax(tid 970)     2389 : stream time: 720000

Msiavsrc.ax(tid 970)     4390 : Sleep(2000)...(出现视频播放的停顿)

Msiavsrc.ax(tid 970)     4391 : stream time: 20740000(流时间反映出Sleep2s

Msiavsrc.ax(tid 970)     4393 : stream time: 20760000

Msiavsrc.ax(tid 970)     4395 : stream time: 20780000

……

Msiavsrc.ax(tid 970)    39826 : stream time: 375090000(最后一个Sample

 

1.3    Video Sample打(连续)时间戳、连续送出

现象:视频连续播放。Video Renderer发送Quality Control消息进行反馈控制。流时间线性增加,两次获取的流时间差大致是一帧的显示时间。

Msiavsrc.ax(tid 970)     4105 : stream time: 3600000

Msiavsrc.ax(tid 970)     4106 : Quality control (Famine) received.

Msiavsrc.ax(tid 970)     4139 : stream time: 3940000

Msiavsrc.ax(tid 970)     4140 : Quality control (Famine) received.

Msiavsrc.ax(tid 970)     4171 : stream time: 4260000

Msiavsrc.ax(tid 970)     4172 : Quality control (Famine) received.

Msiavsrc.ax(tid 970)     4205 : stream time: 4600000

Msiavsrc.ax(tid 970)     4206 : Quality control (Famine) received.

Msiavsrc.ax(tid 970)     4238 : stream time: 4930000

Msiavsrc.ax(tid 970)     4239 : Quality control (Famine) received.

……

Msiavsrc.ax(tid 970)    21922 : stream time: 181770000(最后一个Sample

 

1.4    Video Sample打时间戳(中途复位一次,时间戳从0重打)、连续送出

现象:播放较连续。Video Renderer发送Quality Control消息进行反馈控制。时间戳复位后有一个“快镜头”,相邻两次Sample发送的时间差较小(正常时应该是一帧图像的显示时间),说明Video Renderer收到Sample后马上返回,以最快速度处理Sample,使Sample时间戳能够再次赶上流时间。

Msiavsrc.ax(tid 964)     2133 : stream time: 12280000

Msiavsrc.ax(tid 964)     2165 : stream time: 12600000

Msiavsrc.ax(tid 964)     2166 : Reset time stamp...

Msiavsrc.ax(tid 964)     2199 : stream time: 12940000(流时间递增缓慢)

Msiavsrc.ax(tid 964)     2201 : stream time: 12960000

Msiavsrc.ax(tid 964)     2203 : stream time: 12980000

Msiavsrc.ax(tid 964)     2205 : stream time: 13000000

Msiavsrc.ax(tid 964)     2208 : stream time: 13030000

Msiavsrc.ax(tid 964)     2210 : stream time: 13050000

Msiavsrc.ax(tid 964)     2212 : stream time: 13070000

Msiavsrc.ax(tid 964)     2214 : stream time: 13090000

……

Msiavsrc.ax(tid 964)    17748 : stream time: 168430000(最后一个Sample

 

1.5    Video Sample打时间戳(时间戳超前流时间一个delta)、连续送出

现象:等待delta后播放连续。Video Renderer发送Quality Control消息进行反馈控制。

Msiavsrc.ax(tid 848)      821 : stream time: 4167195720000(随机值,此Sample送出后被Video Renderer阻塞)

Msiavsrc.ax(tid 848)     5828 : stream time: 49940000delta在此反映出来)

Msiavsrc.ax(tid 848)     5860 : stream time: 50250000

Msiavsrc.ax(tid 848)     5892 : stream time: 50580000

Msiavsrc.ax(tid 848)     5927 : stream time: 50930000


……

Msiavsrc.ax(tid 848)    22677 : stream time: 218430000(最后一个Sample

 

1.6    Video Sample打时间戳(时间戳随机乱序)、连续送出

现象:播放有断续、有快镜头。Video Renderer发送Quality Control消息进行反馈控制。整个播放过程中,如果新Sample的时间戳比流时间超前,则Sample会被Video Renderer阻塞住,直到流时间到达Sample时间后才开始播放;如果新Sample的时间戳比流时间滞后,Sample到达Video Renderer后会被立即播放,因此出现快镜头,直到Sample的时间戳赶上流时间后视频才恢复正常速度。总之,视频流不会影响参考时钟的正常运作。

Msiavsrc.ax(tid 610)     1774 : stream time: 5590000

Msiavsrc.ax(tid 610)     1807 : stream time: 5930000

Msiavsrc.ax(tid 610)     1808 : Add 5 second delta...

Msiavsrc.ax(tid 610)     1841 : stream time: 6270000(此Sample送出后阻塞)

Msiavsrc.ax(tid 610)     6873 : stream time: 56590000(流时间到达Sample上的时间戳后再继续播放)

Msiavsrc.ax(tid 610)     6906 : stream time: 56920000

Msiavsrc.ax(tid 610)     6940 : stream time: 57260000

……

Msiavsrc.ax(tid 610)     7440 : stream time: 62260000

Msiavsrc.ax(tid 610)     7473 : stream time: 62590000

Msiavsrc.ax(tid 610)     7474 : Add -3 second delta...

Msiavsrc.ax(tid 610)     7508 : stream time: 62940000(出现快镜头,Sample以很快的速度发送给Video Renderer

Msiavsrc.ax(tid 610)     7509 : stream time: 62950000

Msiavsrc.ax(tid 610)     7511 : stream time: 62970000

Msiavsrc.ax(tid 610)     7512 : stream time: 62980000

Msiavsrc.ax(tid 610)     7513 : stream time: 62990000

……

Msiavsrc.ax(tid 610)     7563 : stream time: 63490000

Msiavsrc.ax(tid 610)     7564 : stream time: 63500000

Msiavsrc.ax(tid 610)     7566 : Do not add delta...

Msiavsrc.ax(tid 610)     7566 : stream time: 63520000

Msiavsrc.ax(tid 610)     7567 : stream time: 63530000

Msiavsrc.ax(tid 610)     7568 : stream time: 63540000

Msiavsrc.ax(tid 610)     7570 : stream time: 63560000

……

Msiavsrc.ax(tid 610)     7719 : stream time: 65050000

Msiavsrc.ax(tid 610)     7721 : stream time: 65070000

Msiavsrc.ax(tid 610)     7722 : stream time: 65080000

Msiavsrc.ax(tid 610)     7746 : stream time: 65320000Sample时间戳终于赶上了流时间)

Msiavsrc.ax(tid 610)     7779 : stream time: 65650000

……

Msiavsrc.ax(tid 610)    19390 : stream time: 181760000(最后一个Sample

 

1.7    Video Sample打(连续)时间戳、间隙送出(模拟网络阻塞情况)

现象:视频播放一顿一顿。Video Renderer发送Quality Control消息进行反馈控制。无数据时,流时间仍然在走;于是紧接着下一个Sample到达Video Renderer时已经“迟到”,所以会出现快镜头。

Msiavsrc.ax(tid 678)     1667 : stream time: 8940000

Msiavsrc.ax(tid 678)     1700 : stream time: 9270000

Msiavsrc.ax(tid 678)     3701 : Sleep(2000)...(此时阻塞显示上一个Sample的图像)

Msiavsrc.ax(tid 678)     3702 : stream time: 29290000(出现快镜头)

Msiavsrc.ax(tid 678)     3704 : stream time: 29310000

Msiavsrc.ax(tid 678)     3706 : stream time: 29330000

……

Msiavsrc.ax(tid 678)     3762 : stream time: 29890000

Msiavsrc.ax(tid 678)     3766 : stream time: 29930000

Msiavsrc.ax(tid 678)     5767 : Sleep(2000)... (此时阻塞显示上一个Sample的图像)

Msiavsrc.ax(tid 678)     5768 : stream time: 49950000(出现快镜头)

Msiavsrc.ax(tid 678)     5770 : stream time: 49970000

Msiavsrc.ax(tid 678)     5772 : stream time: 49990000

……

Msiavsrc.ax(tid 678)    38788 : stream time: 380150000(最后一个Sample

 

2.  Filter Graph不使用参考时钟

 

现象:不管Video Sample打不打时间戳,也不管时间戳打得是否正确,视频都是以最快的速度播放。并且Video Renderer不发送Quality Control消息。如果Video Sample送出过程中有间隙性停顿,视频也会出现间隙性的停顿。

 

3.  Filter Graph中残留(处于未连接状态)一个Audio Renderer

 

:默认情况下,Audio Renderer会被选中为Filter Graph的参考时钟。

 

Filter Graph如图3

 

3 残留一个Audio Renderer的单一视频流Filter Graph

 

测试结果均与以系统时钟作为Filter Graph的参考时钟的情况类似。

 

 

小结:

 

v      在任何时候,Video Sample上的时间戳都不会影响Filter Graph的流时间。

v      如果Video Sample上没有时间戳,则Video Renderer以最快速度处理Sample数据;如果有时间戳,则根据时间戳以及当前的流时间来安排Sample内容(视频图像)的显示。若Sample上的时间戳超前流时间,Video Renderer将该Sample阻塞,直到流时间到达Sample时间戳后再开始播放;若Sample上的时间戳滞后于流时间,Video RendererSample内容立即显示后返回,以最快速度处理Sample,以使Sample时间戳尽快追赶流时间。

v      视频流播放过程中有一个Quality Control机制;Quality Control消息发送者是Video Renderer,反馈给数据发送线程,以加快或减慢数据发送速度,试图提高服务质量。

v       

 

如果您能从上述数据中得到更多重要的结论,请告诉我luqiming@263.net
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DirectShow音视频同步实验报告(2) 的相关文章

  • 如何为高流量网络应用程序实现“保存搜索”功能?

    我想知道可以在 eBay 等大型网络应用程序上找到的 保存的搜索 功能 您可以做的就是保存搜索 例如 宾得镜头 50mm 1 4 每当有人出售符合搜索条件的新优质标准快速宾得镜头时 您都会收到通知 对我来说 实现此类功能并不是一件简单的事情
  • 如何在matplotlib_venn中将维恩图保存为PNG图

    使用以下代码我尝试创建维恩图 然后另存为文件 import matplotlib from matplotlib venn import venn2 set1 set A B C D set2 set B C D E plt venn2 s
  • 视频流上的 TCP 与 UDP

    我刚从网络编程考试回来 他们问我们的问题之一是 如果您要传输视频 您会使用 TCP 还是 UDP 请解释一下存储视频和实时视频流 对于这个问题 他们只是希望得到一个简短的答案 TCP 用于存储视频 UDP 用于实时视频 但我在回家的路上想到
  • .NET(或 MFC)的高速图形控件?

    我需要编写一个数字示波器类型的应用程序 有很多很棒的静态绘图控件 但我需要一些可以绘制每秒处理 4000 个样本的 16 条轨迹的东西 有人知道 NET 的高速图形控件吗 我什至会选择 MFC 因为它可以封装到 NET 控件中 谢谢您的帮助
  • R - 过滤器坐标

    我是 R 新手 我有一个简单的问题 据我看来 但到目前为止我还没有找到解决方案 我有一组 长 2D x y 坐标 只是 2D 空间中的点 如下所示 ID x y 1 1758 56 1179 26 2 775 67 1197 14 3 29
  • C# - 捕获 RTP 流并发送到语音识别

    我正在努力实现的目标 在 C 中捕获 RTP 流 将该流转发到 System Speech SpeechRecognitionEngine 我正在创建一个基于 Linux 的机器人 它将接受麦克风输入 将其发送给 Windows 机器 Wi
  • 如何显示 matplotlib 饼图中的实际值

    我有一个饼图 绘制从 CSV 文件中提取的值 当前显示值的比例 百分比显示为 autopct 1 1f 有没有办法显示每个切片的数据集中表示的实际值 Pie for Life Expectancy in Boroughs import pa
  • HTML 5 视频自定义控件

    与许多 Web 开发人员一样 我期待着利用新的 HTML 5 进行流式传输视频
  • c# 模拟 IFormFile CopyToAsync() 方法

    我正在对一个异步函数进行单元测试 该函数将 IFormFile 列表转换为我自己的任意数据库文件类列表 将文件数据转换为字节数组的方法是 internal async Task
  • node.js - 将两个可读流写入同一个可写流

    我想知道如果您同时将两个不同的读取流传输到同一目的地 node js 会如何操作 例如 var a fs createReadStream a var b fs createReadStream b var c fs createWrite
  • 使用另一个对象数组过滤对象数组

    这个问题与这个问题类似Jquery 过滤带循环的对象数组 https stackoverflow com questions 30998424 jquery filter array of object with loop但这次我需要使用对
  • Gremlin 中的广度优先枚举

    我正在尝试使用 Gremlin 进行广度优先枚举 但是我无法找到一种方法来输出枚举期间观察到的所有步骤 我只能打印出最后一次迭代的结果 我的问题是 给定这样的起始节点 我如何使用 Gremlin 跟踪所有路径 不知道整体深度 并打印出我沿途
  • 在java中将StreamWriter转换为OutputStream?

    我正在尝试使用 System setOut 将 System out 重定向到字符串 它需要一个 PrintStream 有什么方法可以将 StringWriter 转换为 Stream 以便我可以将其传递给 setOut 吗 你不能完全这
  • R中一张图中的多个条形图

    我是 R 初学者 我需要创建一个像这样的图表 https i stack imgur com az56z jpg https i stack imgur com az56z jpg 我不知道如何生成整个数据集 基本思想是某个外显子 ID 会
  • nginx server_name 在流块内可能吗?

    目前设置如下 stream server listen 9987 udp server name subdomain EXAMPLE com this line is resulting in an error proxy pass loc
  • 从内存流播放视频文件

    只是好奇看看这是否可能 我有一个 Windows 应用程序 它从我的电脑上的 avi 文件读取所有字节 然后将其存储在 byte 中 现在我的内存中有 avi 文件 我想直接从内存将其加载到某种视频播放器控件中 我尝试过使用 wmplaye
  • 如何从 Linux 命令行获取视频文件的分辨率(宽度和高度)?

    我一直在挖掘 mplayer mencoder 和 ffmpeg 文档 但我似乎无法想出anything 我对输出格式不是特别挑剔 因为我可以使用正则表达式将其拉出来 我只是似乎无法首先获取数据 Use ffprobe https ffmp
  • d3力定向布局-链接距离优先

    在 d3 中使用力导向布局 如何使链接距离成为优先事项 同时仍然保持良好的图形布局 如果我指定动态链接距离 但保留默认费用 则我的图形距离会因费用函数而发生一些变形 并且不再是准确的距离 但是 如果我删除电荷 图表将如下所示 任何建议表示赞
  • 在 Chrome 中为

    我已经看到这个问题多次出现 但没有任何明确的解决方案 我正在加载一个简单的视频
  • 电子应用程序可以播放本地支持的任何视频吗?

    我知道浏览器通常会限制玩家mp4 and webm类型的媒体 但我想知道基于电子的应用程序是否可以运行 MKV 和 AVI 等格式的本地视频 我找不到明确的来源来告诉我什么是可用的 什么是不可用的 Electron 仍然仅限于网络技术 这意

随机推荐

  • 几种负荷预测方法及其应用

    1 趋势分析法 趋势分析法称之趋势曲线分析 曲线拟合或曲线回归 它是迄今为止研究最多 也最为流行的定量预测方法 它是根据已知的历史资料来拟合一条曲线 使得这条曲线能反映负荷本身的增长趋势 然后按照这个增长趋势曲线 对要求的未来某一点估计出该
  • rust 学习笔记1

    RUST Rust 语言是一种高效 可靠的通用高级语言 其高效不仅限于开发效率 它的执行效率也是令人称赞的 是一种少有的兼顾开发效率和执行效率的语言 Rust的应用 Rust 语言可以用于开发 传统命令行程序 Rust 编译器可以直接生成目
  • MFC 单文档中添加OnPaint

    单文档中添加OnPaint 方法 1 在xxxView h里添加 生成的消息映射函数 protected DECLARE MESSAGE MAP public afx msg void OnPaint 2 实现OnPaint 3 在xxxV
  • 微信小程序渗透测试

    一 工具准备 burpsuite 夜神模拟器 把微信装好 node js wxappUnpacker 二 获取源码 1 配置Burp和模拟器 模拟器需导入ca证书 打开模拟器的WLAN gt 高级设置 gt 输入物理机的ip以及一个没被占用
  • Gof23设计模式之原型模式

    1 概述 用一个已经创建的实例作为原型 通过复制该原型对象来创建一个和原型对象相同的新对象 2 结构 原型模式包含一下角色 抽象原型类 规定了具体原型对象必须实现的clone 方法 具体原型类 实现了抽象圆形类的clone 方法 它是可被复
  • ASP.NET开发公众号时微信支付遇到签名错误

    请求返回来xml数据
  • 7-21 口罩发放(标准注释+测试点说明)

    为了抗击来势汹汹的 COVID19 新型冠状病毒 全国各地均启动了各项措施控制疫情发展 其中一个重要的环节是口罩的发放 某市出于给市民发放口罩的需要 推出了一款小程序让市民填写信息 方便工作的开展 小程序收集了各种信息 包括市民的姓名 身份
  • 事件流及事件处理程序总结

    事件流 事件捕获阶段 处于目标阶段 事件冒泡阶段 事件捕获与事件冒泡的区别 如何阻止事件的默认行为 以及如何阻止事件冒泡 事件捕获和事件冒泡的概念是相反的 事件捕获 不具体的节点更早接收到事件 而最具体的节点最后接收到事件 DOM2级事件
  • EndNote在Word中插入文献不能自动生成编号 - 解决方案

    本文出处 新浪博客 小数码植物摄影 之http blog sina com cn s blog 629be3eb0100sih3 html 新浪博客 小数码植物摄影 首页 http blog sina com cn u 1654383595
  • Android Studio中怎样引用图片资源

    随着不断接触Android Studio 越来越发现和Eclipse有着巨大的差别 不管是表面的目录结构 还是内在对各种资源的管理 本篇就来聊聊Android Studio中怎样来显示图片 以及与Eclipse中的差别 在Eclipse中依
  • requests爬虫遇到404怎么办_Python爬虫基础库和实践

    爬虫有三大基础库Requests BeautifulSoup和Lxml 这三大库对于初学者使用频率最高 现在大家一起来看看这基础三大库的使用 Requests库 Requests库的作用就是请求网站获取网页数据 Code res reque
  • C# Modbus Rtu实现

    Modbus Rtu的实现与Modbus Tcp的实现类似 C ModBus Tcp的学习及Master的实现 我们还是需要借用一个开源库NModbus4 在vs中 打开NuGet管理器 安装NModbus4 具体实现 具体实现与之前的Mo
  • 主流大语言模型的技术原理细节

    作者 spring 1 比较 LLaMA ChatGLM Falcon 等大语言模型的细节 tokenizer 位置编码 Layer Normalization 激活函数等 2 大语言模型的分布式训练技术 数据并行 张量模型并行 流水线并行
  • Vue组件(插槽)

    1 插槽属于Vue组件的三个核心之一 其余两个分别是属性和事件 今天主要学习插槽的使用 2 插槽 slot 将子组件和父组件进行组合 可以弥补视图的不足 是组件具有更好的拓展性 组件的封装方式 抽取共性 3 插槽的使用方式 1 vue2 0
  • 解决'Unknown custom element'问题

    报错截图 解决方法 模板少写了一个 然后删除多余的模板就行啦
  • 如何安装mysql5.7包_安装mysql 5.7 最完整版教程

    安装环境 CentOS7 64位 MINI版 安装MySQL5 7 1 配置YUM源 在MySQL官网中下载YUM源rpm安装包 http dev mysql com downloads repo yum 下载mysql源安装包 shell
  • anaconda python3.8目录_Linux系统下Anaconda的安装和使用教程

    一 Anaconda的安装 去官网下载 https www anaconda com products individual 下载到本地后利用FileZilla软件上传到服务器 我这里上传到了 data bioinfosoftware文件夹
  • vcpkg编译第三方库leveldb

    vcpkg编译leveldb 1 安装vcpkg 使用git命令直接pull vcpkg源码 git clone https github com microsoft vcpkg 2 在vcpkg目录执行bootstrap vcpkg ba
  • Android 之 intent内容解析

    文章目录 intent intent 属性 1 Action 匹配规则 Action匹配只要有一个与Intent中携带Action相同即可 2 Category 注意 3 Data 4 Component 5 Type 6 Extras 存
  • DirectShow音视频同步实验报告(2)

    单一视频流 Filter Graph如图2 图2 单一视频流的Filter Graph 注意 紧靠Video Renderer的上一级Filter的Video输出Pin 其GetMediaType函数提供的Media Type的VIDEOI