前期准备:
yasm下载:http://yasm.tortall.net/Download.html
openHEVC源码下载: https://github.com/OpenHEVC/openHEVC
SDL2.0下载: http://www.libsdl.org/
CMake下载: https://cmake.org/
FFmpeg下载: https://ffmpeg.org/
注意: 可能由于openHEVC在github上,便于协作开发,但有点小问题,可能大牛们在提交源码的时,漏了点代码,导致在编译的过程中出现各种问题:
1、提示缺XXX函数在XXX中,引用无法找到:原因是缺以下几个文件:
首先从FFmpeg源码中拷贝以下几个文件到openHEVC同名字的文件夹下
libavutil/fifo.c
libavcodec/frame_thread_encoder.c
在打开CMakeLists.txt,找到
find_package(SDL)
find_package(SDL2)
set(libfilenames
libavutil/avstring.c
libavutil/atomic.c
libavutil/base64.c
libavutil/bprint.c
............................
)
在set命令中添加以下几条命令:
libavutil/fifo.c
libavcodec/frame_thread_encoder.c
然后在CMakeLists.txt中找到target_link_libraries(LibOpenHevcWrapper m) 这条语句,这条语句的作用是添加m.lib到LibOpenHevcWrapper这一项目的链接器中。然而m.lib是没有的,找不到,既不是编译阶段能产生的,网上也无法找到,谁知道!因此注释掉:Cmake中 “#”是注释命令!
set()在Cmake中的意思是 将libavutil/avstring.c libavutil/atomic.c 等赋值给变量libfilenames;
然而openHEVC中用到了线程:因此你还需下载:
pthread 这东西网上很多下载地方:ftp://sources.redhat.com/pub/pthreads-win32/pthreads-w32-2-7-0-release.exe
解压后,只需要pthreadVC2.lib pthreadVC2.dll这两个文件就可以了;这两个文件可以放到C:\Windows下;还可以放到build下,(build在openHEVC文件里新建一个)
--------------------------------------------分割线----------------------------------
准备工作弄完了,可以开始编译了:如果电脑是64位的 最好所有的配置都用x64!包括库
1、在openHEVC文件夹里新建一个文件夹:习惯命名build
2、为了在别的电脑上(没安装SDL2.X)方便用,将准备过程中下载的SDL包解压后,放到openHEVC文件夹里
3、将下载的yasm2x.exe改名为yasm.exe,放在openHEVC文件夹里(或系统目录里,例如C:\windows 其实放哪里都行,因为看图,你第一次configure后,出来的红色区域,路径都是可以改的)
4、将pthreadVC2.lib pthreadVC2.dll这两个文件放到build文件夹下(目的是为了等项目的解决方案即xxx.sln生成后,在链接器中加入pthreadVC2.lib)。也可以放在openHEVC文件夹里,通过在CMakeLists.txt加入以下红色语句:
add_library (LibOpenHevcWrapper ${libfilenames} ${YASM_OBJECTS}) //可以通过这条语句在CMakeLists.txt中定位要加的位置
#target_link_libraries(LibOpenHevcWrapper m)
set(pthreadPATH ../pthreadVC2)
target_link_libraries(LibOpenHevcWrapper ${LINK_LIBRARIES_LIST} ${pthreadPATH})
5、打开Cmake
如图:
路径是你自己的路径,路径配好后,点击configure,出现红色背景区域,这红色背景区域的地址都可以改的,特别的是将黄色方框标记的路径改成openHEVC里面的路径:不懂看图
第一次configure:
第二次configure:
6. 点击Cmake的generate按钮,vs项目就生成了!
7、打开build文件夹,将里面没用的工程删掉,不然心烦,如下面左图,删掉后打开vs工程 后缀名为.sln的 就是解决方案的简称,没错打开的就是这个!发现如图右所示,按图右,在无法加载的工程上右击鼠标,选择移除。
右击LibOpenHevcWrapper项目,选择生成,会发现出现以下错误:
解决办法:在libavcodec/avcodec.h 里面#include "version.h" 后面,其实随便。添加:
#define AV_CODEC_CAP_INTRA_ONLY 0x40000000
#define AV_CODEC_FLAG_QSCALE (1 << 1)
#define AV_CODEC_FLAG_PASS1 (1 << 9)
以上三条语句,根据这个错误在FFmpeg的文件夹libavcodec/avcodec.h里面去ctrl+f 查找,复制到openHEVC的libavcodec/avcodec.h里面
在运行,发现还是错误:如图中注释,总共有三处。
在运行,还是出现错误,如:还是注释掉这条语句,总共二处
在运行,还是出现错误:如:这里的错误,
可以这么解决,将pthreadVC2.lib pthreadVC2.dll拷贝到build文件夹下,然后在项目的链接器中加入pthreadVC2.lib。如
在运行,还是有错误:如:找到这些错误,注释掉,这个错误跟机器有关,我们只用到了x86.
在运行,相信会是对了。注意上面说的运行,只运行LibOpenHevcWrapper 项目
现在,将hevc_sdl2设置 为启动项,启动项的设置是右击hevc_sdl2,在填出菜单中,选择设置为启动项。
然后运行,OK,完美!!
最后,可能还出现一个问题,可能你在编译的时候在D盘进行,你突然想拷贝到E盘去运行,那么你可能还要做一步工作,如果出现了错误就按如下做:
用UltraEdit打开build文件夹下类似hevc_sdl2.vcxproj 这个带有.vcxpro后缀名的文件,然后ctrl+f 查找D:\openHEVC-hevc_rext\ ,统一都替换为../ 就ok 了!