Windows/linux版本中QSV 在 FFMPEG 中的使用教程

QSV 在 FFMPEG 中的使用(windows)

INDE

在 Windows 下通常使用 INDE 中的 Intel Media SDK 而不是 MMS,因为后者只在 Linux 下和 Windows Server 下可用。

INDE 可以免费下载,建议下载它的离线安装包,因为很多功能你并不需要,使用离线安装包,你可以指下载你想要的功能。

安装 Media SDK

在 Windows 上安装 Media SDK 比较简单,请参考这个链接中的安装方法。我们只使用它做视频编码,所以只需要选择build 下的

- Media SDK for Windows
- Media Raw Acclecerator for Windows
这两项就可以了。

Windows 下编译支持 qsv 的 FFMPEG 库

编译 mfx_dispatcher

windows 编译 qsv 之前需要安装 mfx_dispatcher,它相当于是应用程序和具体的硬件加速库之间的一个中间层,它负责帮助应用库定位底层代码,这样应用库就可以不用直接链接到硬件加速的具体实现。

[mfx_dispatcher][] 代码可以在 github 上下载到,在 github 的 README 中也提供了编译方法。需要注意的是,它使用的编译工具是 mingw64 的 x86_64 工具链,如果你使用的是 mingw64 的 i686 工具库,记得把教程中的 x86_64替换成 i686。

mfx_dispatcher 安装完成之后会在 /usr/i686-w64-mingw32/usr/local/ 下生成相应的库文件和头文件。

链接到 FFMPEG

FFMPEG 需要使用 pkg-config 定位 libmfx 库,这个库的 libmfx.pc 文件在安装完 mfx_dispatcher 之后会安装在/usr/i686-w64-mingw32/usr/local/lib/pkgconfig 目录下。为了让 FFMPEG 的configure 脚本能够找到它你需要把这个地址加入到 PKG_CONFIG_PATH 中。

export PKG_CONFIG_PATH=/usr/i686-w64-mingw32/usr/local/lib/pkgconfig
为了让 FFMPEG 支持 qsv 你需要加入下面三个配置选项:

./configure --enable-libmfx \
            --enable-encoder=h264_qsv \
            --enable-decoder=h264_qsv \
            ...
使用中可能会出现的问题

在使用 h264_qsv 编码器的时候,可能会出现 Error initializing an internal MFX session 错误,目前没有找到具体原因。在把 Media SDK 下的libmfxhw32.dll 文件拷贝到执行目录下之后这个问题就消失看。

QSV 在 FFMPEG 中的使用(Linux)

Intel Media SDK

现在 Intel 不再发布单独的 Intel Media SDK, 这个组件在 Linux 平台下集成在 Intel Media Server Studio 中,后文简称 MMS

目前的 MMS 版本推荐的安装平台只有一个 CentOS(SUSE12 在当前版本中也算是一个推荐平台)。其他平台的安装比较复杂,官方也不太推荐使用。后文的介绍是基于 CentOS 操作系统的。

如何安装 MMS

首先,你需要在 Intel Developer Zone 下载最新的 MMS 版本,其中的 Community 版本是免费的, MMS 的安装主要分三个步骤。

在解压出来的的文件夹下面有一个 SDK2015Production* 目录,切换到这个目录下面之后,有一个 CentOS 目录。这个目录下面有一个 intel_scripts_centos*压缩包,解压这个压缩包之后可以得到下面三个脚本:

-build_kernel_rpm_CentOS.sh
-install_sdk_UMD_CentOS.sh
-uninstall_sdk_UMD_CentOS.sh
安装需要用的是前面两个脚本。

1. 安卓用户空间驱动(user-mode driver – UMD)

下面的命令需要使用超级用户权限:

./install_sdk_UMD_CentOS.sh

mkdir /MSS

chown {普通用户名}:{普通组名} /MSS
2. 编译内核空间的驱动包

下面的命令使用普通用户权限执行:

cp build_kernel_rpm_CentOS.sh /MSS

cd /MSS

./build_kernel_rpm*.sh
3. 安装内核空间的驱动

下面的命令使用超级用户权限执行:

cd /MSS/rpmbuild/RPMS/x86_64

rpm -Uvh kernel-3.10.*.rpm

reboot
判断是否已经成功的编译内核模块驱动

重启系统之后执行如下命令:

lsmod | grep 'i915'
得到的类似如下的结果:

i915                837369 4
drm_kms_helper      44256 1 i915
drm                 294746 3 i915,drm_kms_helper
i2c_algo_bit        13509 1 i915
intel_gtt           19747 1 i915
i2c_core            40683 5
i2c_i801,i915,drm_kms_helper,drm,i2c_algo_bit
video               19785 1 i915
button              13953 1 i915
如何在 FFMPEG 中编译 intel qsv 硬件编码器

FFMPEG 中使用 libmfx 实现 intel qsv 的硬件编码器,如果想要编译它的硬件编码器,所以如果想要编译这个硬件编码器,你需要在加入如下的配置选项:

./configure --enable-libmfx \
            --enable-encoder=h264_qsv \
            --enable-decoder=h264_qsv \
            ...
libmfx can not found using pkg-config

libmfx.pc

编译中可能会报出下面的错误: libmfx can not found using pkg-config,这个错误可能是不同的原因导致,你需要查看 ffmpeg 根目录下的 config.log 文件。

如果这个文件中报错说 pkg-config 无法找到 libmfx 这个库,那是因为 MMS 的默认安装没有提供 libmfx.pc 文件,你需要在自己创建这个文件:

sudo mkdir -p /opt/intel/mediasdk/pkgconfig

vim /opt/intel/mediasdk/lib64/pkgconfig/libmfx.pc
在文件中写入如下内容:

prefix=/opt/intel/mediasdk
exec_prefix=${prefix}
libdir=${exec_prefix}/lib64
includedir=${exec_prefix}/include

Name: libmfxhw64

Description: Intel Media SDK dispatcher.
Version: 2015r6
Libs: -L${libdir} -lmfxhw64
Cflags: -I${includedir}
注意这个地方引用的是 libmfxhw64 库,因为测试的是 64 位平台。

当然你可以可以选择在 /usr/lib64/pkgconfig/ 下面创建 libmfx.pc 文件。

mfx/mfxvideo.h

同样是 libmfx can not found using pkg-config 这个命令,也可能是头文件的错误,在 config.log 中会报错说无法找到 mfx/mfxvideo.h 这个文件。

在安装完 MMS 之后,在 /opt/intel/mediasdk/include/ 目录下面会有mfxvideo.h 这个文件,但是在 FFMPEG 中,引用的是 mfx/mfxvideo.h 这个头文件,因此报错,解决的方式是,在 /opt/intel/mediasdk/include 这个目录下面新建目录 mfx,然后吧 include 的头文件拷贝一份到 mfx 目录下。

通过上面这种方式可以修正 mfx/mfxvideo.h 无法找到的错误。

链接 FFMPEG 时的错误

在链接 ffmpeg 的时候还是有可能会出现 MFXxxx undefinded reference 的错误,这时候你需要让你的程序链接到 lmfxhw64 这个库。最简单的方式是,在/usr/lib64/ 中建立一个 libmfxhw64 的软连接

ln -s /opt/intel/mediasdk/lib64/libmfxhw64.so /usr/lib64/libmfxhw64.so
然后在编译自己的程序的时候加入 -lmfxhw64 选项。

在 FFMPEG 中使用 qsv 编码器

qsv 的编码器在 FFMPEG 中有 h264 和 h265 两种,你可以通过下面的代码找到这个编码器。

av_find_encoder_by_name("h264_qsv");
此外,通过 qsvenc_h264.c 这个源文件,我们可以看到它支持 QSV 和 NV12两种格式,但是 QSV 这个格式好像无法正常的使用,你需要把编码的 pfx_fmt设置成 NV12。

时间: 2024-08-07 05:40:01

Windows/linux版本中QSV 在 FFMPEG 中的使用教程的相关文章

SQL Server补丁版本的检查和安装过程中常见问题

server|过程|问题 来源:http://www.xfocus.net 一.SQL Server补丁版本的检查 SQL Server的补丁版本检查不如Windows 补丁版本检查直接,一个系统管理员,如果不了解SQL Server版本对应的补丁号,可能也会遇到一点麻烦,因此在这说明一下,通过这样的办法判别机器是安全的办法,不会对系统产生任何影响.1.用Isql或者SQL查询分析器登录到SQL Server,如果是用Isql,请在cmd窗口输入isql -U sa,然后输入密码,进入:如果是用

Windows Shellcode学习笔记——shellcode在栈溢出中的利用与优化

本文讲的是Windows Shellcode学习笔记--shellcode在栈溢出中的利用与优化, 0x00 前言 在<Windows Shellcode学习笔记--shellcode的提取与测试>中介绍了如何对shellcode作初步优化,动态获取Windows API地址并调用,并通过程序实现自动提取机器码作为shellcode并保存到文件中. 0x01 简介 先从最入门的缓冲区溢出开始 本文将要结合<0day安全:软件漏洞分析技术>中的"栈溢出原理与实践"

ffmpeg中的sws_scale算法性能测试

经常用到ffmpeg中的sws_scale来进行图像缩放和格式转换,该函数可以使用各种不同算法来对图像进行处理.以前一直很懒,懒得测试和甄别应该使用哪种算法,最近的工作时间,很多时候需要等待别人.忙里偷闲,对ffmpeg的这一组函数进行了一下封装,顺便测试了一下各种算法. 简单说一下测试环境,我使用的是Dell的品牌机,i5的CPU.ffmpeg是2010年8月左右的当时最新版本编译而成,我使用的是其静态库版本. sws_scale的算法有如下这些选择. #define SWS_FAST_BIL

Linux Systemd——在RHEL/CentOS 7中启动/停止/重启服务

Linux Systemd--在RHEL/CentOS 7中启动/停止/重启服务 RHEL/CentOS 7.0中一个最主要的改变,就是切换到了systemd.它用于替代红帽企业版Linux前任版本中的SysV和Upstart,对系统和服务进行管理.systemd兼容SysV和Linux标准组的启动脚本. Systemd是一个Linux操作系统下的系统和服务管理器.它被设计成向后兼容SysV启动脚本,并提供了大量的特性,如开机时平行启动系统服务,按需启动守护进程,支持系统状态快照,或者基于依赖的

最新Windows 10版本改善了Windows Subsystem for Linux

几天前微软面向Fast通道用户发布了Windows 10 Build 14942版本更新,其中就包括改善了首次在周年更新中亮相面向Linux的Windows子系统.在Build 14942更新中并未带来新功能,但是修复了不少BUG,其中最值得关注的是在WSL中添加了inotify支持. 微软开发者博客上公司解释道WSL经过了特别优化,在内容升级之后同时允许Windows和bash接受更新通知.微软解释道:"那么,如果Linux和Windows支持文件系统更改通知,如果两者的系统能够连接在一起是否

MySQL在Linux系统中隐藏命令行中的密码的方法

  这篇文章主要介绍了MySQL在Linux系统中隐藏命令行中的密码的方法,作者利用简单的C程序实现,需要的朋友可以参考下 在命令行中输入命令并不是一个好主意,会造成安全问题.但是如果你决定去写一个应用,而这个应用需要在命令行中使用密码或者其他敏感信息.那么,你能通过以下方法禁止系统的其他用户轻易的看到这些敏感数据 呢?,类似MySQL在ps命令下隐藏密码. 假设我这里系统里两个用户,一个是root ,一个是dabu .测试系统为centos 6.5在按照下面的步骤做: ? 1 2 3 4 [r

Linux有问必答:如何检查PDF中使用了哪种字体

Linux有问必答:如何检查PDF中使用了哪种字体 问题:我想要知道PDF文件中使用了什么字体,或者嵌入了什么字体.Linux中有工具可以检查PDF文档中使用了哪种字体吗? 要检查PDF文件中包含了,或者使用了什么字体,你可以使用命令行工具:pdffonts,它是一个PDF字体分析工具.pdffonts是Poppler PDF工具集包中的一个部分. 安装PDF工具集到Linux 要安装Poppler到Debian,Ubuntu或Linux Mint: $ sudo apt-get install

为什么在vs2010版本显示正常在vs2012中出错

问题描述 为什么在vs2010版本显示正常在vs2012中出错 未经处理的异常,行 1,列 282,在 http://api.map.baidu.com/library/MarkerClusterer/1.2/src/MarkerClusterer_min.js 中 0x800a138f - Microsoft JScript 运行时错误: 无法获取属性"lng"的值: 对象为 null 或未定义 解决方案 一个是将vs2012中的jscript验证关掉,当然是在确认你的js code

ffmpeg中怎么编程实现获取视频中某指定的一帧?

问题描述 ffmpeg中怎么编程实现获取视频中某指定的一帧? ffmpeg中怎么编程实现获取视频中某指定的一帧?不是通过遍历,而是直接跳到指定帧,ffmpeg中有没有有相关的函数? 解决方案 /** Seek to the keyframe at timestamp. 'timestamp' in 'stream_index'. * @param s media file handle @param stream_index If stream_index is (-1), a default