由于现在h264,h265视频的增多,分辨率增大,甚至2k,4k监控视频的增多,需要利用硬件来实现高效解码和AI识别等的情况越来越多,日益重要,显卡GPU的算力强大,可以提供更高效和灵活的能力,开发者面对日益增加的不同硬件,面对不同的接口,需要耗费大量的精力,对接不同的硬件是比较耗时的,ffmpeg为我们提供了一个完整的解决方案,让我们不关心底层的实现,只面向接口。 主流的硬件解码方案由Intel、AMD-ATI以及Nvdia 三家公司推出。
ffmpeg支持的硬件名称可以使用avcodec_find_decoder_by_name 来查找名称。
static const char *const hw_type_names[] = { //CUDA–》Nvidia GPU计算库 [AV_HWDEVICE_TYPE_CUDA] = “cuda”, //DRM 是linux 下的图形渲染架构(Direct Render Manager) [AV_HWDEVICE_TYPE_DRM] = “drm”, //微软directx,使用D3D9 [AV_HWDEVICE_TYPE_DXVA2] = “dxva2”, //微软directx,使用D3D11 [AV_HWDEVICE_TYPE_D3D11VA] = “d3d11va”, //面向异构系统(此系统中可由CPU,GPU或其它类型的处理器架构组成)的并行编程的开放式标准。 [AV_HWDEVICE_TYPE_OPENCL] = “opencl”, //英特尔Quick Sync Video [AV_HWDEVICE_TYPE_QSV] = “qsv”, //Video Acceleration Api,UNINX下的编码接口 [AV_HWDEVICE_TYPE_VAAPI] = “vaapi”, //Video Decode and Presentation API for Unix ,NVIDIA提供的 [AV_HWDEVICE_TYPE_VDPAU] = “vdpau”, // 苹果 [AV_HWDEVICE_TYPE_VIDEOTOOLBOX] = “videotoolbox”, // 安卓 [AV_HWDEVICE_TYPE_MEDIACODEC] = “mediacodec”, };
查看状态,指定使用某种解码器可以使用命令: ffmpeg -hwaccels 来查看硬件的支撑
常用函数
av_hwdevice_ctx_create
av_hwdevice_ctx_alloc
device_ctx->internal->hw_type->device_create
av_hwdevice_ctx_init
av_hwframe_ctx_alloc
av_hwframe_ctx_init
hwframe_ctx_free
//gpu frame和memory freme之间的数据传递
av_hwframe_transfer_data
//分配AVFrame空间
av_hwframe_get_buffer
avformat_alloc_context
avformat_open_input
av_format_inject_global_side_data
av_format_inject_global_side_data
avformat_match_stream_specifier
avformat_match_stream_specifier
av_find_best_stream
stream_component_open
stream_component_open
avcodec_alloc_context3
avcodec_find_decoder
avcodec_find_decoder_by_name
仔细查看这些函数,在硬件的编解码中可以充分利用
关联硬件解码器使用通过hw_device_setup_for_encode/hw_device_setup_for_decode进行设置