提高Media SDK效率之多线程篇

来源:互联网 发布:mac怎么装正版office 编辑:程序博客网 时间:2024/05/21 14:16
    提高Media SDK效率之初始化设置篇提高Media SDK效率之内存选择篇中,笔者已经对Media SDK的两个重要配置部分进行了分析和总结。本节,我们将着重讨论如何使用多线程技术提高视频Converter的效能(一种视频的常用应用)。

在运用Media SDK进行格式转换时,一般要涉及三大模块,他们是Decoder,VPP和Encoder,数据输入输出如图1所示。

                                                图1 基本数据输入输出图

从图1可以看出,每经过一个模块,都要对数据进行同步操作。在此期间,其他两个模块是处于空闲状态,是一个典型的串行处理过程。对于英特尔的多核技术,它的多核利用率是最低的,相应的效率也较差。

那么如何对现有流程进行多线程化呢?

本文提供了一种最简单的方法,即对每个模块线程化。它在实际运用中并非是最佳方案,之所以采用它,仅仅是为了提供一种思路。请参考图2所示。

                                                图2 模块线程化输入输出图

图2将Decoder,VPP和Encoder三个模块分别线程化,在彼此之间以队列(queue)为数据交换。
简单的工作模式如下:
- 若队列为空,后级模块等待数据。
- 若队列被填充,前级模块通知后级模块。
- 若无输入数据,前级模块通知后级模块结束工作,后自行了断。

虽然这种线程化的工作增加的程序的复杂性,但是对于赢得的性能而言是值得的。在理想状态下,我们看到三个模块的并行工作,转化时间的长短取决于最为耗时模块。

【小结】
- Media SDK仅仅提供硬件加速能力,线程化工作展开于具体应用。
- 三个模块线程化仅仅是一种简单参考实现,不是最佳方案。如何充分利用英特尔的多核技术,应该建立在具体分析的基础之上。英特尔提供了丰富的性能检测和优化工具,他们能够帮助程序员找出关键问题所在。

- VPP模块是可选的,如果应用没有采用,就将Decoder后的队列直接连接到Encoder之前。

http://software.intel.com/zh-cn/blogs/2010/01/28/media-sdk

原创粉丝点击