Directx9播放视频

本文介绍了一个利用Directx9库进行视频播放的C++项目,通过FFmpeg解码视频数据,然后在Directx9环境下渲染显示。源代码可在GitHub上找到。
摘要由CSDN通过智能技术生成
//D3dPlay.cpp: 定义应用程序的入口点。
//

#include "stdafx.h"
#include "D3dPlay.h"

#include<d3d9.h>
#include <process.h>

extern "C"
{
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
#include "libavutil/imgutils.h"
}

//D3D9相关参数
static LPDIRECT3DSURFACE9  g_pDirectSurface9 = NULL;
static LPDIRECT3D9		   g_pD3d;
static LPDIRECT3DDEVICE9   g_pD3dDev;
static D3DPRESENT_PARAMETERS g_D3dParam;
static RECT                g_rcWin = { 0 };
static HWND			       g_pPlayWnd = NULL;
static D3DFORMAT           g_D3dFmt;

//ffmpeg相关参数
static AVFormatContext *g_pAvFmtCtx = NULL;
static AVCodecContext  *g_pAvCodecCtx = NULL;
static int              g_VideoIndex = -1;
static AVCodec         *g_pAvCodec = NULL;
static HANDLE           g_hVideoRenderThread = NULL;
static AVPixelFormat    g_AVFix;


#define MAX_LOADSTRING 100

// 全局变量: 
HINSTANCE hInst;                                // 当前实例
WCHAR szTitle[MAX_LOADSTRING];                  // 标题栏文本
WCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名

// 此代码模块中包含的函数的前向声明: 
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
static unsigned int CALLBACK VideoRenderThread(LPVOID p);

void Play()
{

	//初始化libavformat并且注册所有的复用和解复用协议
	av_register_all();

	//分配一个AVFormatContext
	g_pAvFmtCtx = avformat_alloc_context();	

	if (avformat_open_input(&g_pAvFmtCtx, "./说散就散.mp4", NULL, NULL) < 0)
	{
		//打开输入文件失败
		return;
	}

	if (avformat_find_stream_info(g_pAvFmtCtx, NULL) < 0)
	{
		//找不到流的相关信息
		return;
	}

	for (unsigned int i = 0; i < g_pAvFmtCtx->nb_streams; i++)
	{
		if (g_pAvFmtCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
		{
			g_VideoIndex = i;
		}
	}

	//分配一个AVCodecContext并且给字段填充默认的值
	g_pAvCodecCtx = avcodec_alloc_context3(NULL);

	//填充编解码器上下字段值基于提供的编解码器参数
	if (avcodec_parameters_to_context(g_pAvCodecCtx,
		g_pAvFmtCtx->streams[g_VideoIndex]->codecpar) < 0)
	{
		//填充参数出错
		return;
	}

	//找到一个与编码器Id匹配并且已注册的解码器
	g_pAvCodec = 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值