ffmpeg录制H265格式的桌面视频

本文详细介绍了如何从源代码编译libx265库,特别是在Windows环境下使用VS2017。编译完成后,通过pkgconfig路径设置和ffmpeg的configure命令,将libx265集成到ffmpeg中,支持H265编码。此外,还提供了一个录制桌面并编码为H265的示例代码。

ffmpeg本身不支持H265,如果需要支持,需要事先编译出libx265,读者可以到libx265的官方网站https://www.videolan.org/developers/x265.html上找到下载地址,本人下载的是x265_3.5.tar.gz。

编译libx265时,定位到其目录下,有个build文件夹,如下所示,支持的编译方式挺多
在这里插入图片描述

本人用的是vs2017编译,选择的是vc15-x86_64,注意vc15代表的不是vs2015,如下所示,本人vs2017的版本15.9.36,取版本的第一个字段15,所以vc15其实是vs2017,本人编译的是64位版本。
在这里插入图片描述
这里面有个make-solutions.bat,用于生成解决方案sln。但是先不要执行,首先打开cmd,
切换到目录D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build,这也是本人vs2017的安装目录,
该目录下有如下文件
在这里插入图片描述
cmd中执行vcvars64.bat,初始化vs内部环境变量,执行后,诸如编译器cl.exe就能被命令行识别,然后再切换到libx265的build/vc15-x86_64目录,执行make-solutions.bat,然后会生成解决方案x265.sln,打开此解决方案,如下所示:
在这里插入图片描述
直接编译INSTALL工程,就会编译静态库和动态库,编译出的成果物如下所示:
在这里插入图片描述

头文件有两个:x265_config.h和x265.h,其中x265.h的内容是固定的,直接在源码文件中找就可以,而x265_config.h其实是由x265_config.h.in变化而来,不同编译器最终生成的也会不同。
在这里插入图片描述
读者可以看到这里面有两个x265_config.h,其中一个是由msys编译生成。

本人此处用msys也生成一遍,主要是vs编译器生成的不带x265.pc,本人最终在ffmpeg集成进libx265,需要x265.pc;其实这个文件也可以自己写。

本人的x265.pc内容如下:

prefix=/usr/local/x265
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: x265
Description: H.265/HEVC video encoder
Version: 3.5
Libs: -L${exec_prefix}/lib -lx265
Libs.private: 
Cflags: -I${prefix}/include 

很明显本人将x265的成果物拷贝到msys2目录下(本人拷贝的是动态库的引入库,不是静态库)。

然后打开msys2终端,设置x265的pkgconfigpath,如下所示:

export PKG_CONFIG_PATH=/usr/local/x265/lib/pkgconfig:$PKG_CONFIG_PATH

然后进入到ffmpeg的主目录,执行命令:

./configure --toolchain=msvc --arch=x86_64 --disable-debug --enable-gpl --enable-libfreetype --enable-libfontconfig --enable-libx264 --enable-libx265 --extra-cflags=-I/usr/local/x264/include --extra-ldflags='-LIBPATH:/usr/local/x264/lib' --prefix=/home/ffmpeg_x264_x265_vpx_freetype_fontconfig_static --enable-libvpx --enable-encoder=libvpx_vp8 --enable-encoder=libvpx_vp9 --enable-decoder=vp8 --enable-decoder=vp9 --enable-parser=vp8 --enable-parser=vp9

可以看到,本人此次编译ffmpeg,视频格式支持h264,h265,vp8,vp9。
生成makefile文件后,就可以进行编译了。

此处本人事先尝试了使用x265的静态库,但是在configure的时候报错,config.log显示大量的链接错误,本人只好用x265动态库的引入库,从而通过了configure,只是最终应用exe需要依赖libx265.dll,如果是静态库,则最终的成果物不需要libx265.dll,成果物会少一个文件。
关于这个问题,本人后续会研究下。

下面写一个录制桌面的例子:
在这里插入图片描述
其中文件CaptureScreen.h内容如下:

#ifndef _CCAPTURE_SCREEN_HH
#define _CCAPTURE_SCREEN_HH

#include<time.h>
#include <d3d9.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <windows.h>

#include <tchar.h>
#include <winbase.h>
#include <winreg.h>
#include <Strsafe.h>


//
// ---抓屏类----
//
class CCaptureScreen
{
   
   
public:
	CCaptureScreen(void);
	~CCaptureScreen(void);

public:
	/*-----------定义外部调用函数-----------*/
	int Init(int&, int&);//初始化
	BYTE* CaptureImage(); //抓取屏幕

private:
	/*-----------定义内部调用函数-----------*/
	void* CaptureScreenFrame(int, int, int, int);//抓屏
	HCURSOR FetchCursorHandle(); //获取鼠标光标

private:
	/*-----------定义私有变量-----------*/
	int m_width;
	int m_height;
	UINT   wLineLen;
	DWORD  dwSize;
	DWORD  wColSize;

	//设备句柄
	HDC hScreenDC;
	HDC hMemDC;
	//图像RGB内存缓存
	PRGBTRIPLE m_hdib;
	//位图头信息结构体
	BITMAPINFO pbi;

	HBITMAP hbm;
	//鼠标光标
	HCURSOR m_hSavedCursor;


};

#endif //--_CCAPTURE_SCREEN_HH

文件CaptureScreen.cpp内容如下:

//#include "stdafx.h"
#include "CaptureScreen.h"

CCaptureScreen::CCaptureScreen(void)
{
   
   
	m_hdib = NULL;
	m_hSavedCursor = NULL;
	hScreenDC = NULL;
	hMemDC = NULL;
	hbm = NULL;
	m_width = 1920;
	m_height = 1080;
	FetchCursorHandle();
}
//
// 释放资源
//
CCaptureScreen::~CCaptureScreen(void)
{
   
   
	DeleteObject(hbm);
	if (m_hdib){
   
   

		free(m_hdib);
		m_hdib = NULL;
	}
	if (hScreenDC){
   
   

		::ReleaseDC(NULL, hScreenDC);
	}
	if (hMemDC) {
   
   

		DeleteDC(hMemDC);
	}
	if (hbm)
	{
   
   
		DeleteObject(hbm);
	}
}

//
// 初始化
//
int CCaptureScreen::Init(int& src_VideoWidth, int& src_VideoHeight)
{
   
   
	hScreenDC = ::GetDC(GetDesktopWindow());
	if (hScreenDC == NULL) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值