标题:Qt音视频开发10-ffmpeg内核硬解码
作者:liudianwu
日期:2023-01-06 14:59
内容:
## 一、前言
为了极大的降低CPU的占用,实现硬解码(也叫硬件加速)非常有必要,一个视频文件或者一路视频流还好,如果增加到64路视频流呢,如果是4K、8K这种高分辨率的视频呢,必须安装上硬解码才是上上策。举个例子在电脑上播放4K以上的H265这类的视频文件,如果不开硬解码,很容易出现卡顿现象,在配置高的电脑也容易出现,毕竟非常的耗CPU资源,来不及刷新,上了硬解码之后,明显流畅的不要不要的,怪不得现在的显卡性能越做越牛逼,就是为了在显示这块尽可能的分担CPU的压力,以便留出CPU时间片做其他的事情。
关于ffmpeg解码,网上搜索到的代码绝对是一大堆一大堆,而且很多都讲得很详细,解码的函数流程图非常清晰,关于ffmpeg这块的学习本人推荐雷神的博客,分析的相当细致,我在很久以前刚用Qt+ffmpeg解码的时候,参考的就是雷神的例子,当然这些demo其实在ffmpeg的开发包dev下的examples也是非常详细的,只不过没有什么分析过程,参考雷神的博客可以看到很多分析过程。
硬解码大致流程:
01. 根据硬解码类型查找硬解码设备类型 av_hwdevice_find_type_by_name
02. 根据解码设备类型找到硬解码的格式 find_fmt_by_hw_type
03. 获取解码器格式回调 videoCodecCtx->get_format
04. 创建硬解码设备 av_hwdevice_ctx_create
05. 设备硬解码设备 videoCodecCtx->hw_device_ctx
06. 解码数据包 avcodec_send_packet avcodec_receive_frame
07. 将硬解码后的数据从GPU转换取出来 av_hwframe_transfer_data
## 二、效果图
## 三、体验地址
1. 国内站点:[https://gitee.com/feiyangqingyun](https://gitee.com/feiyangqingyun)
2. 国际站点:[https://github.com/feiyangqingyun](https://github.com/feiyangqingyun)
3. 个人作品:[https://blog.csdn.net/feiyangqingyun/article/details/97565652](https://blog.csdn.net/feiyangqingyun/article/details/97565652)
4. 体验地址:[https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g](https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g) 提取码:01jf 文件名:bin_video_demo/bin_linux_video。
## 四、相关代码
```cpp
bool FFmpegThread::initHardware()
{
if (hardware == "none") {
return true;
..
#1 [hello_peter 01-07 08:44]
大侠,请教下:如果装有2个显卡(Intel集成显卡、英伟达),如何指定硬解码使用显卡?