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介绍的主要内容,如果未能解决你的问题,请参考以下文章

FFmpeg 硬件加速介绍

自定义 h.264 流在某些硬件解码器中中断

FFmpeg库视频解码初探(软硬件解码)

FFmpeg 支持 libstagefright 硬件解码

如何在 ffmpeg 中使用硬件加速

QT软件开发-基于FFMPEG设计视频播放器-支持软解与硬解