媒体基金会 onReadSample 返回的样本大小错误

2024-02-28

我正在致力于将捕获库从 DirectShow 转换为 MediaFoundation。捕获库似乎工作得很好,但我在运行 Windows 8 32 位的平板电脑上遇到集成网络摄像头的问题。

枚举捕获格式时(如中所述媒体基金会文档 http://msdn.microsoft.com/en-us/library/windows/desktop/ff485858%28v=vs.85%29.aspx),我得到了相机支持的以下格式:

  • 0:MFVideoFormat_NV12,分辨率:448x252,帧率:30000x1001
  • 1:MFVideoFormat_YUY2,分辨率:448x252,帧率:30000x1001
  • 2:MFVideoFormat_NV12,分辨率:640x360,帧率:30000x1001
  • 3:MFVideoFormat_YUY2,分辨率:640x360,帧率:30000x1001
  • 4:MFVideoFormat_NV12,分辨率:640x480,帧率:30000x1001
  • 5:MFVideoFormat_YUY2,分辨率:640x480,帧率:30000x1001

然后,我使用以下函数设置捕获格式,在本例中为索引 5 处的格式,如示例中所述:

hr = pHandler->SetCurrentMediaType(pType);      

该函数执行没有错误。因此,相机应配置为以 YUY2 格式拍摄,分辨率为 640*480。

In the onReadSample 回调 http://msdn.microsoft.com/en-us/library/windows/desktop/dd374658%28v=vs.85%29.aspx,我应该收到一个缓冲区大小为 的样本:

640 * 480 * sizeof(unsigned char) * 2 =  614400 //YUY2 is encoded on 2 bytes

但是,我得到了一个缓冲区大小为 169344 的样本。下面是回调函数的一部分。

HRESULT SourceReader::OnReadSample(
    HRESULT hrStatus,
    DWORD dwStreamIndex,
    DWORD dwStreamFlags,
    LONGLONG llTimeStamp,
    IMFSample *pSample      // Can be NULL
    )
{
    EnterCriticalSection(&m_critsec);

    if (pSample)
    {
        DWORD expectedBufferSize = 640*480*1*2; // = 614400 (hard code for the example)

        IMFMediaBuffer* buffer = NULL;
        hr = pSample->ConvertToContiguousBuffer(&buffer);
        if (FAILED(hr))
        {
            //...
            goto done;
        }

        DWORD byteLength = 0;
        BYTE* pixels = NULL;
        hr = buffer->Lock(&pixels, NULL, &byteLength);

        //byteLength is 169344 instead of 614400 
        if (byteLength > 0 && byteLength == expectedBufferSize)
        {
            //do someting with the image, but never comes here because byteLength is wrong
        }
        //...

为什么我会得到尺寸为 169344 的样本,有什么建议吗?

提前致谢


感谢 Mgetz 的回答。

我检查了媒体类型的 MF_MT_INTERLACE_MODE 的值,发现视频流包含逐行帧。 MF_MT_INTERLACE_MODE 的值返回 MFVideoInterlace_Progressive。

hr = pHandler->SetCurrentMediaType(m_pType);
if(FAILED(hr)){
    //
}
else
{
    //get info about interlacing
    UINT32 interlaceFormat = MFVideoInterlace_Unknown;
    m_pType->GetUINT32(MF_MT_INTERLACE_MODE, &interlaceFormat);

    //...

所以视频流不是隔行扫描的。我在 onReadSample 中再次检查 MFSampleExtension_Interlaced 的值,以查看样本是否隔行扫描,并且看起来样本是隔行扫描的。

if (pSample && m_bCapture)
{
    //check if interlaced 
    UINT32 isSampleInterlaced = 0;
    pSample->GetUINT32(MFSampleExtension_Interlaced, &isSampleInterlaced);
    if(isSampleInterlaced)
    {
        //enters here
    }

流怎么可能是逐行的而样本是隔行的?我还在 onReadSample 回调中仔细检查了 MF_MT_INTERLACE_MODE 的值,它仍然给我值 MFT_INPUT_STREAM_WHOLE_SAMPLES。

关于您的第一个建议,我无法在输入流上强制使用标志 MFT_INPUT_STREAM_WHOLE_SAMPLES 。

提前致谢


我仍然面临这个问题,我现在正在调查可用的不同流。

根据文档,每个媒体源都提供一个表示描述符,我们可以从中获取可用的流。要获取表示描述符,我们必须调用:

HRESULT hr = pSource->CreatePresentationDescriptor(&pPD);

然后,我使用 IMFPresentationDescriptor::GetStreamDescriptorCount 函数请求可用的流:

DWORD nbrStream;
pPD->GetStreamDescriptorCount(&nbrStream);

当在运行 Windows 8 的 ACER 平板电脑上的前置网络摄像头上请求此信息时,我得到了三个可用的流。我循环访问这些流,请求它们的 MediaTypeHandler 并检查 MajorType。这三个流的主要类型为:MFMediaType_Video,因此所有流都是视频流。当列出不同流上可用的媒体类型时,我发现所有流都支持以 640x480 捕获。 (某些流具有更多可用的媒体类型)。

我测试选择每个不同的流和适当的格式类型(框架没有返回任何错误),但我仍然没有在回调函数中收到正确的样本...

对于解决这个问题有什么建议吗?


终于找到了问题:我必须使用 SourceReader->SetCurrentMediaType(..) 直接在源阅读器上设置媒体类型。这就成功了!

感谢您的帮助!


在不知道输入媒体类型描述符是什么的情况下,我们很大程度上只能推测,但最可能的答案是您说您可以处理流,即使MFT_INPUT_STREAM_WHOLE_SAMPLES http://msdn.microsoft.com/en-us/library/windows/desktop/ms703975%28v=vs.85%29.aspx未在输入流上设置。

下一个最可能的原因是交错 http://msdn.microsoft.com/en-us/library/windows/desktop/aa367729%28v=vs.85%29.aspx在这种情况下,每一帧都是完整的,但不是您假设的全分辨率。无论如何,您应该验证ENTIRE在接受媒体类型描述符之前。

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

媒体基金会 onReadSample 返回的样本大小错误 的相关文章

  • 实现 `memcpy()`:需要 `unsigned char *`,还是只需要 `char *`?

    我正在实施一个版本memcpy 能够与它一起使用volatile 使用安全吗char 或者我需要unsigned char volatile void memcpy v volatile void dest const volatile v
  • LINQ TO ENTITY 无法与枚举类型进行比较

    下面是枚举叶子 public enum Leaves Annual 0 Medical 1 Hospitalization 2 Unpaid 3 下面是linq查询 public ActionResult ApproveLeave int
  • 获取 WSA 错误代码的格式化消息

    我在 win32 C 应用程序中使用winsock2 我将使用 MessageBox 显示可以通过调用 WSAGetLastError 检索的网络错误 我怎样才能做到这一点 我看到 FormatMessage 但我不明白如何使用它 例如 以
  • C# Socket.receive连续接收0字节且循环中不阻塞

    我正在尝试用 C 编写一个最简单的多线程 TCP 服务器 它接收来自多个客户端的数据 每次连接新客户端时 都会建立套接字连接 并将套接字作为参数传递给新类函数 之后运行 while 循环并接收数据 直到客户端连接为止 这里的问题是 sock
  • 如何解决“HTTP 错误 404.3 - 未找到”错误?

    简单的问题 我启动 VS2008 并创建一个新的 WCF 服务应用程序 这将创建一个默认应用程序 并使用一些测试方法来显示它的工作原理 我按 CTRL F5 确实有效 伟大的 但是 它使用 Visual Studio 开发服务器 我不想支持
  • F1 2019 UDP解码

    我目前正在为 F1 方向盘开发自己的显示器 F1 2019 由codemasters提供 通过UDP发送数据 该数据存储在字节数组中 我在解码返回的数组时遇到一些问题 问题是我得到了很多信息 但我不知道如何处理它们 我将向您介绍我所尝试过的
  • 将 MyGeneration 与 Fluent NHibernate 结合使用

    我在这里找到了一个使用 MyGeneration 生成 NHibernate 代码的绝佳模板 http vucetica blogspot com 2009 01 nhibernate template for my Generation
  • 如何在 Xamarin.Forms 中强制使用浅色模式?

    我的应用程序的 UI 设计为在灯光模式下使用 但如果手机的默认主题是深色模式 我的应用程序也会切换到深色模式 并且 UI 看起来很垃圾 所以我想强制我的应用程序使用灯光模式 我怎样才能做到这一点 In my app xaml我使用的文件Us
  • Qml 中的 FileDialog 在发布中不起作用

    我正在与以下项目合作Qt Quick Control 2 当我尝试在调试模式下运行软件时 FileDialog qml 可以完美打开 但是当我将其部署为发布模式时 它无法工作 这是我的代码 import QtQuick 2 4 import
  • 如何创建 .bat 文件来运行 C# 代码?

    我需要的是 我有一个 C 代码 我想构建它以便在桌面上创建一个 bat 文件 因此 当我从桌面运行这个 bat 文件时 它应该执行 C 代码 有没有办法在编译之前更改 c 项目的设置或属性 以便创建应运行此 c 代码的 bat 文件 将 C
  • boost::unordered_map 是...有序的吗?

    我有一个 boost unordered map 但它看起来是有序的 给我一种压倒性的 你做错了 的感觉 为什么输出是这样的 我希望底层的哈希算法能够随机化这个顺序 include
  • C# 中的异步方法如何工作?

    我在我的一些项目中使用异步方法 我喜欢它 因为它使我的应用程序更具可扩展性 但是 我想知道异步方法如何在后台真正工作 NET 或 Windows 如何知道调用已完成 根据我进行的异步调用的数量 我可以看到创建了新线程 但并不总是 为什么 此
  • 如何存储生成的格式化 C 字符串

    这是一个新手问题 为了创建格式化的 C 字符串 我使用printf like int n 10 printf My number is i 10 但是 怎么样 int n 10 char msg My number is i 10 prin
  • 在 NoSQL 存储中存储图像

    我们的应用程序将通过 HTTP 提供大量缩略图大小的小图像 大小约为 6 12KB 我被要求调查使用 NoSQL 数据存储是否是一个可行的数据存储解决方案 理想情况下 我们希望我们的数据存储是容错且分布式的 在 NoSQL 存储中存储 bl
  • 拦截C# HttpClient GetAsync

    我有一个 Web 项目 C MVC5 但没有 WebAPI 和一个简单的 HTTP REST 客户端 该客户端调用外部 REST 服务并获取 accessToken 等 我想检查所有 Get PostAsync 调用对 statusCode
  • 为什么这是一个未定义的行为?

    我的回答这个问题 https stackoverflow com q 18706587 845092这个函数是 inline bool divisible15 unsigned int x 286331153 2 32 1 15 40086
  • LINQ 中的左外连接

    下面的代码不断给我一个错误消息 你调用的对象是空的 var partsWithDefaults from partsList1 in p join partsList2 in d on new PartNo partsList1 PartN
  • 有C语言的解释器吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话
  • 如何在 C++ 中打印变量的名称? [复制]

    这个问题在这里已经有答案了 可能的重复 在C中获取变量名称的编程方法 https stackoverflow com questions 1623111 programmatic way to get variable name in c
  • asp.net 保护图像免受其他用户的静态请求?

    我在一个为每个特定用户生成动态图像的网站上工作 有时这些图像包含非常敏感数据的描述 最近 我们开始看到对属于不同用户的图像的请求 其形式为 http myapp images someuid image1 jpg http myapp im

随机推荐

  • 具有 CORS 的跨域 REST/Jersey Web 服务

    我想使用 CORS 跨源资源共享 制作跨域 REST Web 服务 我正在使用泽西图书馆提供服务 我需要知道 从服务器端的角度来看 我需要进行哪些代码 配置更改 如何从 HTML5 js 调用此服务 Thanks 服务器端配置的所有信息都可
  • 将 Reporting Services 报表导出到 Excel 时抑制分页符

    将多页报表从 SQL Server 2008 Reporting Services 导出到 Excel 时 默认情况下 报表中由分页符创建的页面将发送到 Excel 文件中的单独工作表 虽然这在大多数情况下都很好 但有时却不然 现在 我希望
  • Python 多处理:类型错误:__new__() 缺少 1 个必需的位置参数:'path'

    我目前正在尝试使用 joblib 库和多处理后端在 python 3 5 中运行并行进程 但是 每次运行时我都会收到此错误 Process ForkServerPoolWorker 5 Traceback most recent call
  • 使用 PYQT 中的图像填充列表

    我有一个包含产品图像的外部数据库 是否可以导入这些图像并将其显示在滚动列表中 并使用户可以单击它们 类似于文件浏览器的工作方式 我只能找到有关转换为资源文件的人的信息 但我想知道是否可以跳过它 OK ListView 和 ListWidge
  • 检查SDCard是否存在,布尔值始终为true

    在我的启动屏幕中 我想检查手机是否有 SDCard 布尔语句如下 Boolean isSDPresent android os Environment getExternalStorageState equals android os En
  • 具有实体框架的 Oracle 非托管提供程序的 Nuget 包

    根据 Oracle 的最新文档 Net 数据提供程序开发人员指南 12c 第 1 版 安装 Oracle Data Provider for NET 非托管驱动程序 一章 声明非托管驱动程序的实体框架提供程序可在 NuGet 上使用http
  • 开发wordpress插件时如何调试php代码?

    我开始自己开发一些 WordPress 插件 在开发插件时 我在插件中使用不同的钩子 wp head add shortcode 等 函数 谁能告诉我一个简单方便的方法调试 WordPress 插件或者有没有其他方法可以轻松开发 WordP
  • 如何向 zend 表单添加“纯文本节点”?

    我正在尝试以 zend 形式添加纯文本节点 目的是仅显示一些静态文本 问题是 我不知道有任何这样的方法可以做到这一点 我已经使用了 描述 但必须将其附加到表单元素上 有什么方法可以简单地将一些文本显示为表单的一部分吗 Zend 将所有内容视
  • Oracle:存储过程的参数数量可变

    我想使用存储过程将各种用户插入到 Oracle 数据库中 一个用户 表 user 有名字 姓氏和出生日期 CREATE TABLE USER Name VARCHAR2 50 Surname VARCHAR2 50 Dt Birth DAT
  • Ruby:如何创建公共静态方法?

    在Java中我可能会这样做 public static void doSomething 然后我可以静态访问该方法而无需创建实例 className doSomething 我怎样才能在 Ruby 中做到这一点 这是我的课 根据我的理解se
  • 使用点将提示标签链接到系统发育树

    我正在尝试使用 R 中的 ape 包和函数plot phylo 生成一个非超度量树 我正在努力寻找任何有关如何使尖端标签在其左边缘垂直对齐以及如何用一系列点 可变长度 将物种名称连接到节点尖端的文档 任何帮助以及 R 中可能能够实现此目的的
  • 小黄瓜,两种情况可以相互依赖吗

    Scenario1 When a new user clicks on sign up page And provides login ID Then user is signed up and can view profile page
  • Node JS - 将数据从 Busboy 流式传输到 AWS S3

    我正在尝试通过 ec2 将文件上传到 s3 我的第一个方法是 将文件完全上传到 ec2 然后将该文件上传到 s3 这种方法不好 因为从 ec2 到 s3 的传输时间是浪费时间 目前我正在尝试使用服务员上传流 to s3上传流这样上传到 ec
  • 使用 Boost Python 和 std::shared_ptr

    我正在尝试让 Boost Python 与 std shared ptr 很好地配合 目前 我收到此错误 Traceback most recent call last File test py line 13 in
  • C# 中强制垃圾回收的最佳实践

    根据我的经验 似乎大多数人都会告诉您强制垃圾收集是不明智的 但在某些情况下 您正在处理的大型对象并不总是在 0 代中收集 但内存是一个问题 是强制收集可以吗 有这样做的最佳实践吗 最佳实践是不强制进行垃圾回收 根据 MSDN 强制垃圾是可能
  • 谁能推荐一个Java富文本编辑器? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 Cloud Endpoints 中的客户端库。 jar 导入不起作用

    我为我的 appengine python 应用程序创建了一个 jar 文件 我已按照以下步骤导入我的库 jar 文件这个例子 https developers google com appengine docs python endpoi
  • Java 中的最终变量操作

    谁能告诉我下面这行在 Java 上下文中的含义是什么 最终变量仍然可以是 被操纵 除非它是不可变的 据我所知 通过将任何变量声明为最终变量 您将无法再次更改它 那么它们的含义是什么不可变的在上面一行 这意味着如果您的最终变量是引用类型 即不
  • nginx:使用环境变量

    我有以下场景 我有一个环境变量 SOME IP已定义并希望在 nginx 块中使用它 参考Nginx 文档 http wiki nginx org CoreModule我用env指令中的nginx conf文件如下 user www dat
  • 媒体基金会 onReadSample 返回的样本大小错误

    我正在致力于将捕获库从 DirectShow 转换为 MediaFoundation 捕获库似乎工作得很好 但我在运行 Windows 8 32 位的平板电脑上遇到集成网络摄像头的问题 枚举捕获格式时 如中所述媒体基金会文档 http ms