腾讯云+FFmpeg打造一条完备高效的视频产品链( 九 )

CPU的加速中,首先想到的是线程,本质上说,使用线程能力优化是想充分释放多核的能力,目前对于大部分的PC来说以4线程或8线程居多,但对于Sever来说核数可能会更多,目前的环境多以48或96线程为主,因此在不互相影响的前提下调动多核的积极性是CPU加速所要解决的首要问题。在FFmpeg中,以AVFilter为例,他有一个AVFILTER_FLAG_SLICE_THREADS的标识,很多实现上,是把一个Frame中不相关的数据以行或者列的方式做加速,以我的经验来看,如果程序出现性能问题,首先应该考虑的问题是是否使用了CPU的多线程能力。第二种CPU加速方式是SIMD加速,SIMD汇编优化形式一般有intrinsics、inline assembly、hand-written assembly三种,FFmpeg汇编优化以第三种为主,这是由于intrinsics在封装是有些潜在的性能损失,相同的功能用intrinsics和hand-written assembly去解决,前者可能会引入一些性能损失;而inline assembly的问题在于比较难以跨平台,比如Linux和Windows,而FFmpeg的跨平台是它的目标之一。所以,现在FFmpeg社区更偏向于hand-written assembly方式,另外,大部分的hand-written assembly汇编优化其实是以x264的汇编优化库为基础做的,并且选择nasm为汇编器(不选择yasm是由于它没有支持最新的一些CPU指令)。

推荐阅读