ffmpeg 硬解码
Posted qianbo_insist
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ffmpeg 硬解码相关的知识,希望对你有一定的参考价值。
ffmpeg 硬件解码
由于现在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进行设置
以上是关于ffmpeg 硬解码的主要内容,如果未能解决你的问题,请参考以下文章
FFmpeg 调用 Android MediaCodec 进行硬解码(附源码)