电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
利用ffmpeg+QSV进行视频处理
分 享
扫描二维码分享
利用ffmpeg+QSV进行视频处理
ffmpeg
qsv
xdsnet
关注
发布时间: 2020-05-20
丨
阅读: 5123
##引言## ffmpeg是一个视频处理领域的佼佼者,在很多应用中都会用到,这里就不详细介绍它的使用啦,有需要的可以参考其官方文档和大量网上的资料。 这里着重介绍一下`qsv`这个东东,qsv的全称是Quick Sync Video Acceleratio,是Intel提供的一个对数字视频通用解决方案(其实是对其芯片——集成显卡或者独立显卡视频处理的专用支持库),说穿了就是可以利用相应的Intel硬件支持实施硬件加速的视频处理。 这里我也不再说那么多的题外话啦,重点就是怎么才能用上qsv吧。首先就是使用条件 ##使用条件## ###受支持的硬件### intel很多代的芯片其实都提供了qsv的支持,不过支持的能力是不同的(否则芯片的代级差异怎么体现!),大致有这样一个表来体现不同代际芯片提供的QSV能力(其实从另外一个方面说就是这些芯片才支持QSV,其他的就不支持) 大致是(针对当前主要在用的intel 架构平台): 1. Ironlake,gen5显核,支持MPEG-2, H.264硬解 2. Sandy Bridge,gen6显核,添加支持VC-1硬解和H.264硬编 3. Ivy Bridge,gen7显核,添加支持JPEG硬解和MPEG-2硬编. 4. Bay Trail,gen7显核,同上 5. Haswell,gen7.5显核,同上 6. Broadwell,gen8显核,增加了VP8硬解 7. Braswell,gen8显核,增加了H.265硬解以及JPEG, VP8硬编 8. Skylake,gen9显核,增加了H.265硬编 9. Apollo Lake,gen9显核,增加了VP9, H.265 Main10 硬解 10. Kaby Lake,gen9.5显核,增加了VP9 profile 2 硬解,以及 VP9, H.265 Main10硬编 11. Coffee Lake,gen9.5显核,同上 12. Gemini Lake ,gen9.5显核,同上 13. Cannonlake,gen10显核,同上 只要你的硬解平台属于上述范围,代表你在硬件上是支持的。 ###相应软件安装### 现在很多网上的资料都说要自行编译安装来实现ffmpeg对qsv的支持,但其实这个并不是必须的,应该说在[zeranoe.com](https://ffmpeg.zeranoe.com/builds/)下载的windows预编译版本是直接支持了qsv的,比如我下载的这个版本[ffmpeg4.2.2]( https://ffmpeg.zeranoe.com/builds/win64/static/ffmpeg-20200515-b18fd2b-win64-static.zip) 当然如果在其他诸如linux发行版上的一些官方预编译版本可能是不支持的,比如debian官方预编译包默认就不包含qsv支持,这时可能需要专门找到相应保护了qsv支持的预编译版本,或者自行编译(这个过程就复杂了,这里就不再累述,有需要的参考网上相应资料) 要检查ffmpeg是否支持qsv也比较简单,直接用 `ffmpeg -decoders|grep qsv` 就可以检验当前ffmpeg是否支持qsv解码 `ffmpeg -encoders|grep qsv`就可以检验当前ffmpeg是否支持qsv编码 不过这里再次**强调**,上述两条命令有输出,只是说ffmpeg软件本身包含了qsv处理的部分,但并不代表你真正能使用qsv,它还需要你使用的硬件平台有对应的支持。 至此,qsv应用的环境完全搭好。 ##ffmpeg+qsv的使用## 关于ffmpeg+qsv使用,主要包括3种情况,分别是仅解码使用、仅编码使用,以及转码(特效)使用,下面分别介绍一下: ### 仅解码 ### 其实仅解码有时在视频处理流上还是有一定应用的,比如图形、图像处理中,需要用到解码出来的数据流。 这里举几个例子: 1. H264视频解码为yuv420p的raw数据文件 `ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -vf hwdownload,format=nv12 -pix_fmt yuv420p output.yuv` 2. H264视频解码,并通过SDL进行显示 `ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -vf hwdownload,format=nv12 -pix_fmt yuv420p -f sdl -` 3. H264视频解码,但不进行输出(这通常用于粗略的视频解码能力指标测试) `ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -f null -` 4. HEVC 10bit视频解码为p010le的yuv格式数据流文件(需要较新intel平台,gen8、甚至gen9显核以上才能支持) `ffmpeg -hwaccel qsv -c:v hevc_qsv -load_plugin hevc_hw -i input.mp4 -vf hwdownload,format=p010 -pix_fmt p010le output.yuv` ###仅编码### 1. 编码一个1080p的yuv raw数据文件流到H264,5Mbps码率,VBR模式 `ffmpeg -init_hw_device qsv=hw -filter_hw_device hw -f rawvideo -pix_fmt yuv420p -s:v 1920x1080 -i input.yuv -vf hwupload=extra_hw_frames=64,format=qsv -c:v h264_qsv -b:v 5M output.mp4` 2. 编码一个1080p的p010le raw yuv输入文件到HEVC(H265) main10特性(需要Kaby Lake以上平台才支持) `ffmpeg -init_hw_device qsv=hw -filter_hw_device hw -v verbose -f rawvideo -video_size 1920x1080 -pix_fmt p010le -i input.yuv -an -vf 'hwupload=extra_hw_frames=64,format=qsv' -c:v hevc_qsv -profile:v main10 output.mp4` ###转码### 1. 软解+H264_qsv硬编为5Mbps码率,CBR模式 `ffmpeg -init_hw_device qsv=hw -filter_hw_device hw -i input.mp4 -vf hwupload=extra_hw_frames=64,format=qsv -c:v h264_qsv -b:v 5M -maxrate 5M output.mp4` 2. 软解+H264_qsv硬编,包含CQP模式 `ffmpeg -init_hw_device qsv=hw -filter_hw_device hw -i input.mp4 -vf hwupload=extra_hw_frames=64,format=qsv -c:v h264_qsv -q 25 output.mp4` 3. H264_qsv硬解+H264_qsv硬编为VBR模式和Look_ahead模式(Look_ahead模式可能在很多平台上不被支持)的5Mbps码率文件 `ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -c:v h264_qsv -b:v 5M -look_ahead 1 output.mp4` 4. H264_qsv硬解+H264_qsv硬编为ICQ模式(它类似于crf模式的x264编码效果) `ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -c:v h264_qsv -global_quality 25 output.mp4` 5. H264_qsv硬解+H264_qsv硬编为ICQ模式和look_ahead模式 `ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -c:v h264_qsv -global_quality 25 -look_ahead 1 output.mp4` 6. Hevc qsv硬解 + qsv硬件缩放为1080p@60fps + h264 qsv硬编 `ffmpeg -hwaccel qsv -c:v hevc_qsv -i input.mp4 -vf 'vpp_qsv=framerate=60,scale_qsv=w=1920:h=1080' -c:v h264_qsv output.mp4` 7.Hevc qsv 硬解 + qsv硬件缩放为1080p@60fps与色彩空间转换(从nv12到ggb32)并且输出到sdl `ffmpeg -hwaccel qsv -c:v hevc_qsv -i input.mp4 -vf 'vpp_qsv=framerate=60,scale_qsv=w=1920:h=1080:format=rgb32,hwdownload,format=rgb32' -f sdl -` 8. 硬件1对多(1:N)转码: (ffmpeg版本需要包含MFE支持) `ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -filter_complex "split=2[s1][s2]; [s1]scale_qsv=1280:720[o1];[s2]scale_qsv=960:540[o2]" -map [o1] -c:v h264_qsv -b:v 3200k 3200a.mp4 -map [o2] -c:v h264_qsv -b:v 1750k 1750a.264` 9. M:N转码(同样ffmpeg版本需要包含MFE支持) `ffmpeg -hwaccel qsv -c:v h264_qsv -i input1.mp4 -hwaccel qsv -c:v h264_qsv -i input2.mp4 -filter_complex '[0:v]split=2[out1][out2],[1:v]split=2[out3][out4]' -map '[out1]' -c:v h264_qsv output1.mp4 -map '[out2]' -c:v h264_qsv output2.mp4 -map '[out3]' -c:v h264_qsv output3.mp4 -map '[out4]' -c:v h264_qsv output4.mp4` 此外对于有多个显示核心的环境,可以利用`-qsv_device`来指定qsv应用的设备,以避免在有多个设备时默认初始化失败(例如既有intel集成显卡,又有AMD/Nvidia独立显卡的情况)。下面是在Linux下一个例子 `fmpeg -hwaccel qsv -qsv_device /dev/dri/renderD128 -c:v h264_qsv -i input.mp4 -c:v h264_qsv output.mp4` 因为可能有多个显卡,所以甚至可以混合(混杂)利用不同的硬件来进行转码,比如: 10. vaapi硬解+ vaapi 硬件缩放 + qsv硬编码 (下面的例子在Linux平台上有效) `ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi -i input.mp4 -vf 'scale_vaapi=1280:720,hwmap=derive_device=qsv,format=qsv' -c:v h264_qsv output.mp4` 11. dxva硬解 decode + qsv硬件缩放 + qsv硬编 (下面的例子在windows平台上有效) `ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -i input.mp4 -vf 'hwmap=derive_device=qsv,format=qsv,scale_qsv=w=1280:h=720' -c:v h264_qsv output.mp4` 至此,使用ffmpeg+qsv处理视频的相关内容介绍完了,你们可以愉快的使用了吧!
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
xdsnet
擅长:科研教育
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交