当前位置: 首页 > article >正文

FFMPEG总结——底层调用COM导致编码器无法正常打开

具体情况是使用qt和ffmpeg,之前就发现qt在调用win的文件系统的时候容易因为COM产生冲突从而卡死程序,当qt调用保存文件对话框之类的时候特别明显。这次是因为使用qt和ffmpeg结合编码视频,但是发现视频编码器打不开了,我使用的编码器是h264_mf,这个编码器可以实现硬件加速,比起纯软解少占用CPU,不然电脑会特别的卡。这个h264_mf调用的就是微软的那套媒体开发库Media Foundation,这个底层就用到了COM,但是现在因为使用qt导致无法正常打开编码器。查找原因之后是因为COM存在两种模式STA(单线程模式)和MTA(多线程模式),当前是在同一个线程中调用的,这个时候STA会产生冲突,因为一个线程只允许打开一个COM,但是现在要打开两个就会出现错误,有的时候整个软件都会卡死。这个时候如果把视频保存的内容放到单独的一个线程中去处理就不会有这个问题,因为他已经不会在主线程中再开一个COM,这个时候是可以正常打开的。但是想要看到ffmpeg的报错信息需要进一步的处理,因为他不会直接显示在后台或者崩溃,他会返回错误代码,错误代码的提示信息不够全面,这里就需要我们自己写一个log的回调函数用于接收这些错误信息。下面是相关的代码:

//日志回调函数,这里就可以看到具体的报错信息,COM的报错信息就是从这里看到
void ffmpeg_log_callback(void* ptr, int level, const char* fmt, va_list vl)
{
	if (level > av_log_get_level())
		return;
	char temp[1024] = { 0 };
	vsnprintf(temp, 1024, fmt, vl);
	printf("%s\n", temp);
}
//要设置日志的回调函数以及日志的等级,日志的等级提示哪些返回信息会被捕捉显示,一般只需要一些error的信息
	av_log_set_level(AV_LOG_ERROR);
	av_log_set_callback(ffmpeg_log_callback);

通过上面的代码就可以看到ffmepg代码中av_log()函数返回的报错信息,有助于代码的调试,不然只靠返回码真的太艰难了,各种错误返回同一个码。


http://www.kler.cn/news/328145.html

相关文章:

  • 51单片机系列-串口(UART)通信技术
  • Java网络通信—UDP
  • Xshell7下载及服务器连接
  • 九、设备的分配与回收
  • 单片机的两种看门狗原理解析——IWDG和WWDG
  • 使用 Light Chaser 进行大屏数据可视化
  • onload_tcpdump命令抓包报错Onload stack [7,] already has tcpdump process
  • c语言基础作业
  • Java面试必杀技为什么面试官都爱问源码?
  • 苹果盛宴:iPhone 16系列领衔,智能穿戴新潮流来袭
  • OpenCV-指纹识别
  • Bert Score-文本相似性评估
  • Vxe UI vue 使用 vxe-form 表单实现简历模板
  • k8s 分布式存储平台 -- Longhorn
  • css的背景background属性
  • GLIP v1
  • 代码随想录算法训练营第四六天| 647. 回文子串 516.最长回文子序列
  • mfc140u.dll缺失?快速解决方法全解析,解决mfc140u.dll错误
  • Go语言中的深拷贝:概念、实现与局限
  • Rust安装
  • 笔记 - 高分辨率下部分软件应用字体太小
  • Ruby基础语法
  • 询盘鸭独立站
  • PHP 中,将 JSON 数据与二进制数据之间进行相互转化主要涉及两个步骤:
  • opencv实战项目二十七:基于meanshif的视频脸部跟踪
  • Java | Leetcode Java题解之第447题回旋镖的数量
  • 示波器如何测试晶振
  • Spring Boot 驱动的在线订餐平台
  • 快速选择算法--无序数组中寻找中位数 O(n)的算法及证明
  • Django 解决跨域