FFmpeg硬件解码API介绍
Posted 西北老码农
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FFmpeg硬件解码API介绍相关的知识,希望对你有一定的参考价值。
FFMPEG原生支持哪些硬解码类型:
在AVHWDeviceType(libavutil/hwcontext.h)中列举出所有原生支持的硬解码类型:
enum AVHWDeviceType
AV_HWDEVICE_TYPE_NONE,
AV_HWDEVICE_TYPE_VDPAU,
AV_HWDEVICE_TYPE_CUDA,
AV_HWDEVICE_TYPE_VAAPI,
AV_HWDEVICE_TYPE_DXVA2,
AV_HWDEVICE_TYPE_QSV,
AV_HWDEVICE_TYPE_VIDEOTOOLBOX,
AV_HWDEVICE_TYPE_D3D11VA,
AV_HWDEVICE_TYPE_DRM,
AV_HWDEVICE_TYPE_OPENCL,
AV_HWDEVICE_TYPE_MEDIACODEC,
;
上面的AV_HWDEVICE_TYPE_CUDA就是CUDA的一种硬件解码器,是NVIDIA的硬件加速库,AV_HWDEVICE_TYPE_QSV则是QSV是Intel提供的一套集显上的硬件加速方案。
那么,究竟要怎么知道系统当前的FFMPEG究竟支持哪些硬件库?
可以通过命令行查看:ffmpeg -hwaccel。在hardware acceleration methods:下面可以看到当前FFMPEG集成的硬解码库。
AVCodec* avcodec_find_decoder_by_name(const char *name)
通过名字来寻找对应的AVCodec。每一个解码器的名字一定是全局唯一的,在AVCodec头文件中有相应的描述:
在FFMPEG内部每一个解码器codec都是一个结构体,维护了该解码器自己的信息、具体执行的函数等信息。比如Intel的QSV解码器(在libavcodec/qsvdec_h2645.c)是:
AVCodec ff_h264_qsv_decoder =
.name = "h264_qsv",
.long_name = NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (Intel Quick Sync Video acceleration)"),
.priv_data_size = sizeof(QSVH2645Context),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_H264,
.init = qsv_decode_init,
.decode = qsv_decode_frame,
.flush = qsv_decode_flush,
.close = qsv_decode_close,
.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID,
.priv_class = &class,
.pix_fmts = (const enum AVPixelFormat[]) AV_PIX_FMT_NV12,
AV_PIX_FMT_P010,
AV_PIX_FMT_QSV,
AV_PIX_FMT_NONE ,
.hw_configs = ff_qsv_hw_configs,
.bsfs = "h264_mp4toannexb",
.wrapper_name = "qsv",
;
const AVCodecHWConfig * avcodec_get_hw_config (const AVCodec *codec, int index)
紧接着,调用这个函数去获取到该解码器codec的硬件属性,比如可以支持的目标像素格式等。而这个信息就存储在AVCodecHWConfig中:
typedef struct AVCodecHWConfig
/**
* A hardware pixel format which the codec can use. !!!硬解码codec支持的像素格式!!!
*/
enum AVPixelFormat pix_fmt;
/**
* Bit set of AV_CODEC_HW_CONFIG_METHOD_* flags, describing the possible
* setup methods which can be used with this configuration.
*/
int methods;
/**
* The device type associated with the configuration.
*
* Must be set for AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX and
* AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX, otherwise unused.
*/
enum AVHWDeviceType device_type;
AVCodecHWConfig;
以上是关于FFmpeg硬件解码API介绍的主要内容,如果未能解决你的问题,请参考以下文章