ffmpeg硬解码与软解码的压测对比

ffmpeg硬解码与软解码的压测

一、基本知识

本文基于intel集显进行压测

  • 软解码:cpu对视频进行解码
  • 硬解码:显卡或者多媒体处理芯片对视频进行解码
    ffmpeg可以基于vaapi插件或者qsv加速库进行硬解码
    参考 视频和视频帧:Intel GPU(核显)的编解码故事
    · FFmpeg-vaapi是一个FFmpeg插件,它提供基于低级VAAPI接口的硬件加速,利用行业标准VAAPI在英特尔GPU上执行高性能视频编解码器,视频处理和转码功能。
    · FFmpeg-qsv是一个FFmpeg插件,提供基于Intel GPU的硬件加速。 它提供基于Intel Media SDK库的高性能视频编解码器,视频处理和转码功能。

二、压测实验

1. 实验条件及工具说明
  • 内存:32GB
  • 操作系统:22.04 Ubuntu
  • CPU: 12核 12th Gen Intel® Core™ i7-12700 --> 限制使用6核
  • 视频:2k 分辨率
  • intel_gpu_tools
    可通过apt-get install intel_gpu_tools命令安装,新建一个窗口键入intel_gpu_top可以观察gpu使用情况
2. 压测脚本

原始版本:

#!/bin/bash
read thread_num

tmp_fifofile="/tmp/$$.fifo"
mkfifo $tmp_fifofile   # 新建一个FIFO类型的文件
exec 6<>$tmp_fifofile  # 将FD6指向FIFO类型
rm $tmp_fifofile  #删也可以,

#根据线程总数量设置令牌个数
#事实上就是在fd6中放置了$thread_num个回车符
for ((i=0;i<${thread_num};i++))
do
    echo
done >&6

start_time=`date +%s` #运行的开始时间
for ((i=0;i<${thread_num};i++))  # 找到data文件夹下所有bam格式的文件
do
    # 一个read -u6命令执行一次,就从FD6中减去一个回车符,然后向下执行
    # 当FD6中没有回车符时,就停止,从而实现线程数量控制
    read -u6
    {

        ffmpeg -i 10min39.mp4 -f null - -benchmark
        echo >&6
    } &
done
wait
stop_time=`date +%s`

exec 6>&-
expr $stop_time - $start_time
echo 'over'

但在运行过程中会出现以下问题
-bash: wait: 警告: job stopped
在《Unix 环境高级编程》第9.8节作业控制中讲到,“如果后台程序试图读取终端,这并不是一个错误,但是终端驱动程序将检测这种情况,并向后台作业发送一个特定信号SIGTTIN,该信号会停止此后台程序,并向用户发送通知”。

修改之后的版本:加上 < /dev/null

#!/bin/bash
read thread_num

tmp_fifofile="/tmp/$$.fifo"
mkfifo $tmp_fifofile   # 新建一个FIFO类型的文件
exec 6<>$tmp_fifofile  # 将FD6指向FIFO类型
rm $tmp_fifofile  #删也可以,

#根据线程总数量设置令牌个数
#事实上就是在fd6中放置了$thread_num个回车符
for ((i=0;i<${thread_num};i++))
do
    echo
done >&6

start_time=`date +%s` #运行的开始时间
for ((i=0;i<${thread_num};i++))  # 找到data文件夹下所有bam格式的文件
do
    # 一个read -u6命令执行一次,就从FD6中减去一个回车符,然后向下执行
    # 当FD6中没有回车符时,就停止,从而实现线程数量控制
    read -u6
    {

        ffmpeg -i 10min39.mp4 -f null - -benchmark
        echo >&6
    } < /dev/null &
done
wait
stop_time=`date +%s`

exec 6>&-
expr $stop_time - $start_time
echo 'over'

以上shell脚本为软解码版本,硬解码版本

  • 使用QSV只需将ffmpeg -i 10min39.mp4 -f null - -benchmark改成ffmpeg -hwaccel qsv --hwaccel_output_format qsv -c:v h264_qsv 10min39.mp4 -f null - -benchmark
  • 使用VAAPI改成ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi -i 10min39.mp4 -f null -
3. 实验数据结果

po出一部分解码速度实验结果
实验结果

实验结果分析:
1、从实验对比数据可以看出,硬编码的解码速率更快、cpu使用率更小、内存占用更少,皆优胜于软解码;软编码不占用gpu,硬编码在面对并发数5-100,gpu使用率都会达到100%
2、在实验环境下,软解码的临界并发数位于21-22区间,硬解码在面对100线程并发数仍能达到快于正常视频播放速率的解码速率
3、在实验环境下,若想保证解码速率不慢于正常视频播放速率:对软解码,并发数应控制在不大于20;对硬解码,并发数不超过100
4、硬解码的cpu使用率先随着并发数增多而增加,后随着并发数增多而减少降低,可能由于解码速率变慢,cpu能够快速应对多个线程的切换

注:以上信息,欢迎大佬们指正

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在Qt中将FFmpeg解码改为解码是可行的。通过使用FFmpeg中提供的解码器,可以实现对视频进行解码。可以按照以下步骤进行操作: 1. 首先,确保你已经正确安装了支持解码FFmpeg版本,例如n5.1.2版本。 2. 在Qt中创建一个视频播放器的项目,并引入FFmpeg库。 3. 在代码中使用FFmpeg库来打开视频文件或者网络摄像头。对于打开摄像头的情况,与打开视频文件相比,会有一些额外的步骤。 4. 使用FFmpeg解码器进行解码。在打开视频流后,可以通过选择相应的解码器来进行解码。可以参考FFmpeg的文档或者示例代码中的相关部分。 5. 使用QPainter或者其他绘图工具将解码后的视频帧进行绘制显示。 6. 如有需要,可以添加音频解码和播放功能。 通过以上步骤,你可以将Qt中的FFmpeg解码改为解码。这样可以提高视频解码的效率和性能,并减少CPU的占用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Qt-FFmpeg开发-视频播放(2)](https://blog.csdn.net/qq_43627907/article/details/127341133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Qt-FFmpeg开发-打开本地摄像头(6)](https://blog.csdn.net/qq_43627907/article/details/128184141)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值