//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 =
Directx9播放视频
最新推荐文章于 2024-10-10 17:15:23 发布
本文介绍了一个利用Directx9库进行视频播放的C++项目,通过FFmpeg解码视频数据,然后在Directx9环境下渲染显示。源代码可在GitHub上找到。
摘要由CSDN通过智能技术生成