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)

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

被折叠的 条评论
为什么被折叠?



