视频录制挂在 IMFSinkWriter->Finalize() 上;

2024-04-11

我在使用 Media Foundation 将视频录制完成为 .mp4 时遇到问题,其中调用IMFSinkWriter->Finalize();永远挂起。它并不总是发生,并且几乎可以在任何计算机上发生(在 Windows 服务器、7、8、10 上可见)。Flush()事先在音频和视频流上调用,并且之间不添加新样本Flush and Finalize。关于可能导致什么的任何想法Finalize永远挂起来?

我尝试过的事情:

  • 记录全部HRESULT检查是否有任何问题(在继续下一行代码之前已经检查过它们)

一切都回来了S_OK,没有看到任何问题

  • 添加了IMFSinkWriterCallback在流上获取回调 流处理标记(每 10 个样本添加标记)并完成Finalize()

自从添加此功能以来一直无法重现,但这将提供有关当我让它工作时发生的情况的最佳信息。

  • 网上搜索代码示例,看看其他人是如何设置的 Sink Writer 以及如何使用Finalize() is used

没有找到很多示例,看起来我的代码与找到的代码类似

  • 查看每个系统可用和使用的编码器,包括编码器 dll 的版本

在可以重现该问题的机器上,AMD H.264 硬件 MFT 编码器和 H264 编码器 MFT 之间的编码器有所不同。版本似乎并不重要,有些机器的视频驱动程序是最新的。

这是一些没有任何代码示例HRESULT检查(代码量增加了一倍,所以我把它拿出来)

构建水槽示例:

CComPtr<IMFAttributes> pAttr;
::MFCreateAttributes( &pAttr, 4 );
pAttr->SetGUID( MF_TRANSCODE_CONTAINERTYPE, GetFileContainerType() );
pAttr->SetUINT32( MF_LOW_LATENCY, FALSE ); // Allows better multithreading
pAttr->SetUINT32( MF_SINK_WRITER_DISABLE_THROTTLING, TRUE ); // Does not block
pAttr->SetUINT32( MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, TRUE );

m_pCallback.Attach( new MFSinkWriterCallback() );
pAttr->SetUnknown( MF_SINK_WRITER_ASYNC_CALLBACK, m_pCallback );

::MFCreateSinkWriterFromURL( m_strFilename.c_str(), NULL, pAttr, &m_pSink );

if ( m_pVideoInputType && m_pVideoOutputType )
{
   m_pSink->AddStream( m_pVideoOutputType, &m_dwVideoStreamId );
   // Attributes for encoding?
   CComPtr<IMFAttributes> pAttrVideo;

   // Not sure if these are needed
   //::MFCreateAttributes( &pAttrVideo, 5 );

   m_pSink->SetInputMediaType( m_dwVideoStreamId, m_pVideoInputType, pAttrVideo );
}
if ( m_pAudioInputType && m_pAudioOutputType )
{
   m_pSink->AddStream( m_pAudioOutputType, &m_dwAudioStreamId );
   // Attributes for encoding?
   CComPtr<IMFAttributes> pAttrAudio;

   // Not sure if these are needed
   //::MFCreateAttributes( &pAttrAudio, 2 );
   //pAttrAudio->SetGUID( MF_MT_SUBTYPE, MFAudioFormat_AAC );
   //pAttrAudio->SetUINT32( MF_MT_AUDIO_BITS_PER_SAMPLE, 16 );

   m_pSink->SetInputMediaType( m_dwAudioStreamId, m_pAudioInputType, pAttrAudio );
}
m_pSink->BeginWriting();

停止录制样本:

if ( m_dwVideoStreamId != (DWORD)-1 )
{
   m_sink->Flush( m_dwVideoStreamId );
}
if ( m_dwAudioStreamId != (DWORD)-1 )
{
   m_sink->Flush( m_dwAudioStreamId );
}

m_sink->Finalize();

在很多情况下,媒体基础应用程序可能会挂起:

  • 使用媒体基础对象时调用 MFShutDown/CoUninitialize。
  • 使用 GUI,并在多线程应用程序中错误地使用 Windows 消息泵。
  • MTA/STA 组件使用不当。
  • 错误使用临界区/等待事件功能。
  • 使用BeginXXX()函数时忘记调用EndXXX()函数。
  • 回调函数使用不当。
  • 忘记在必要时调用AddRef,并释放另一个线程使用的对象。
  • Media Foundation 中的一个错误(Windows 7 上有一些)。
  • 等等...

当我说最小源代码时,我的意思是,隔离执行编码过程的源代码,如果太大则将其提供给 Github。最好能编译并尝试源代码,因为死锁很难发现。

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

视频录制挂在 IMFSinkWriter->Finalize() 上; 的相关文章

  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • for循环中计数器变量的范围是多少?

    我在 Visual Studio 2008 中收到以下错误 Error 1 A local variable named i cannot be declared in this scope because it would give a
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a

随机推荐

  • 在UpSetR中,如何在交叉条上显示小数

    我正在为以下百分比数据制作一个翻转图 这是我的更复杂数据的虚拟示例 x 我希望这些百分比显示为小数 并且所有条形都可见 即使它是 0 1 所有数据在此图中都很重要 令人心烦意乱的情节 library UpSetR x lt c a 80 b
  • 如何使用 php 转义字符串中的单引号(撇号)

    我有一个这样的 SQL 查询 stmt pdo gt prepare SELECT FROM products keywords WHERE product type product type 我不知道它的价值是多少 产品类型多变的 但现在
  • 除 File.Move 之外更快的文件移动方法

    我有一个控制台应用程序大约需要 625 天才能完成 除非有办法让它更快 首先 我正在一个包含大约 4 000 000 个文件 如果不是更多的话 的目录中 我正在一个数据库中工作 每个文件都有一行 然后还有一些 现在使用 SQL 相对较快 瓶
  • 从 XBRL 文档中获取特定值

    我一直在使用Gepsio https github com JeffFerguson gepsio尝试通过他们的 EDGAR 系统翻阅标准 SEC XBRL 文件 尽管我多次尝试解决这一问题 但似乎我还是不知所措 当您从任何文档中提取事实
  • 如何使用 Animated.View 在本机反应中以动画形式展开/折叠文本预览

    我正在创建一个文本组件 默认情况下我希望它是 2 行 如果用户点击它 它将扩展到完整长度 如果用户再次点击它 它将折叠回 2 行 到目前为止 我的返回函数中有类似的内容
  • 了解 smb 和 DCERPC 的远程命令执行功能

    我试图了解通过 impacket 脚本在 Windows 上执行远程命令的所有可用方法 https www coresecurity com corelabs research open source tools impacket http
  • PyGame rect.move 运动无法正常运行

    我正在以打砖块克隆的形式开发我的第一个 pygame 应用程序 对于玩家桨 我检查主游戏循环中的按键保持情况 然后每帧重新绘制玩家对象的精灵 如下面的代码片段所示 class Player def init self self sprite
  • kotlin中val和final有什么区别?

    在Kotlin中 val用于使变量 属性不可更改 那么final有什么用呢 据我所知 在java中final用于限制继承或使变量常量 但在kotlin中val正在做常量部分那么final在kotlin中会做什么 While val and
  • 使用 TFS 命令行部署 SSIS 项目

    如何从 TFS 2015 部署 SSIS 项目 对于常规数据库项目来说 sqlpackage exe publish与发布配置文件 将 SSIS 项目模型自动部署到服务器中的命令行参数是什么 我们使用的是 SQL Server 2016 E
  • Oracle中不使用触发器的自动增量

    oracle中除了使用触发器还有哪些方式实现自增 您可以创建和使用预言序列 语法和详细信息位于http www techonthenet com oracle sequences php http www techonthenet com
  • Facebook 风格的 ASP.NET 聊天组件

    我将启动一个有点像社交媒体网站的网站 我需要一个基于 AJAX 的 ASP NET 聊天控件 如果有 jQuery 就太好了 因为我的整个网站将使用 jQuery 主题进行主题化 我正在寻找类似于 Gmail 或 Facebook 风格的聊
  • Android 如何在画布上匀速缓慢绘制多条线?

    我需要在Android中捕获标记在canvas上绘制图形 效果如下图所示 好吧 到目前为止 我可以通过以下方式绘制一条等速的边值动画器 但是 我一次只能绘制一侧 因为在绘制下一侧时无法保存最后一侧 那么 有没有什么好的办法可以解决这个问题呢
  • elasticsearch - 具有多个条件的术语过滤器

    我想实现一次对ES的搜索具有2个或更多条件的多个值 For Eg customer index has 2 fields userid and order 我使用下面的查询来搜索与这两个字段匹配的结果 query filtered quer
  • Javascript:检测窗口何时完全加载

    我有一个脚本 可以在网页生命周期的任何阶段加载 当脚本加载时 它必须运行一个initialize 方法 我希望此函数在 onload 事件上运行 但我无法确定该页面尚未加载 即 onload 尚未被触发 理想情况下我的脚本如下所示 var
  • 如何在Python中用字符串轴而不是整数绘制混淆矩阵

    我正在关注上一篇关于如何在 Matplotlib 中绘制混淆矩阵的线程 脚本如下 from numpy import import matplotlib pyplot as plt from pylab import conf arr 33
  • 如何退出(或导航出)MasterDetail 页面到 Xamarin 中的简单 ContentPage。形式?

    我有一个 Xamarin Forms 应用程序 其中包含以下内容 LoginPage a ContentPage type RegisterPage a ContentPage type parentMasterDetail a Maste
  • 你能在 Haskell 中为整个类创建一个类的实例吗?

    假设我想让所有数字成为Monoid 而不必为每个实例创建一个实例Num像这样 instance Monoid Int where mappend mempty 0 instance Monoid Float where mappend me
  • 无法获取 Python 2.7 的 SFML

    我正在尝试做什么我正在尝试获取 Python 2 7 的 SFML 绑定 使用 Windows 的 32 位版本的 python https python sfml org download html https python sfml o
  • Python中最佳比率的压缩?

    Python 中哪种压缩方法的压缩率最好 常用的是zlib compress 最好的还是有更好的选择 我需要获得尽可能最佳的压缩比 我正在压缩字符串并通过 UDP 发送它们 我压缩的典型字符串大约有 1 700 000 字节 我确信可能有一
  • 视频录制挂在 IMFSinkWriter->Finalize() 上;

    我在使用 Media Foundation 将视频录制完成为 mp4 时遇到问题 其中调用IMFSinkWriter gt Finalize 永远挂起 它并不总是发生 并且几乎可以在任何计算机上发生 在 Windows 服务器 7 8 10