有需要完整demo的可私信我
demo代码包含了D3D11VA/DXVA2的解码 以及上屏,使用QT创建的QWidget,在这个Widget上创建了一个子窗口,用这个子窗口来做渲染。
class QtDxva2 : public QWidget
{
Q_OBJECT
public:
QtDxva2(QWidget *parent = nullptr);
~QtDxva2();
//解码线程实际执行函数
DWORD DecodeRun();
LRESULT WindowProcEx(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
//dxva2函数
int Dxva2Getbuffer(AVCodecContext *s, AVFrame *frame, int flags);
public slots:
//定时器槽函数,用于开启测试的开关
void TimeOut();
private:
/*******************************************D3D11va******************************************/
HRESULT D3D11Init(HWND hWnd);
void D3D11UnInit();
void D3D11vaRenderFrame(AVCodecContext* avctx, AVFrame* frame);
//硬件解码器初始化
int HwDecoderInit(AVCodecContext* ctx, const enum AVHWDeviceType type);
//视频解码一帧数据并渲染
int FFmpegDecodeAndRender(AVCodecContext* avctx, AVPacket* packet);
//创建子窗口,用来渲染,也可以不创建直接用QT的窗口渲染
int CreateChildWindow();
/*************************DXVA2独有函数************************************/
int Dxva2Creat