openHEVC 編譯 for VS2017+Win10 x64

 編譯暫未成功,有空再次更新php

前期準備:html

yasm下載:http://yasm.tortall.net/Download.htmlgit

1 http://www.tortall.net/projects/yasm/releases/vsyasm-1.3.0-win64.zip (用於集成)
2 http://www.tortall.net/projects/yasm/releases/yasm-1.3.0-win64.exe
3 http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz x

 

openHEVC源碼下載: https://github.com/OpenHEVC/openHEVCgithub

1 https://github.com/OpenHEVC/openHEVC/archive/hevc_rext.zip

 

SDL2.0下載: http://www.libsdl.org/download-2.0.phpwindows

1 http://www.libsdl.org/release/SDL2-2.0.5-win32-x64.zip
2 http://www.libsdl.org/release/SDL2-devel-2.0.5-mingw.tar.gz

 

CMake 3.8app

下載: https://cmake.org/download/ide

1 https://cmake.org/files/v3.8/cmake-3.8.1-win64-x64.zip

 

FFmpeg 下載: https://ffmpeg.org/ 函數

1 http://ffmpeg.org/releases/ffmpeg-3.3.1.tar.bz2  (這個是源碼)
1 http://ffmpeg.zeranoe.com/builds/win64/static/ffmpeg-20170503-a75ef15-win64-static.zip  (已編譯的程序)

 

pthreads-w32-2-9  openHEVC 中用到了線程,所以要下載:ui

1 ftp://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip

 

 環境配置atom

一、解壓源碼

解壓後目錄及文件夾結構:

 1 "D:\dev\Endvlib\cmake-3.8.1-win64-x64"                         【已解壓的目錄】 如下類同
 2 "D:\dev\Endvlib\ffmpeg-3.3.1"
 3 "D:\dev\Endvlib\ffmpeg-20170503-a75ef15-win64-static"
 4 "D:\dev\Endvlib\openHEVC-hevc_rext"
 5 "D:\dev\Endvlib\pthreads-w32-2-9-1-release"
 6 "D:\dev\Endvlib\SDL2-2.0.5-win32-x64"
 7 "D:\dev\Endvlib\vsyasm-1.3.0-win64"
 8 "D:\dev\Endvlib\cmake-3.8.1-win64-x64.zip"                        【已下載的文件】 如下類同
 9 "D:\dev\Endvlib\ffmpeg-3.3.1.tar.bz2"
10 "D:\dev\Endvlib\ffmpeg-20170503-a75ef15-win64-static.zip"
11 "D:\dev\Endvlib\openHEVC-hevc_rext.zip"
12 "D:\dev\Endvlib\pthreads-w32-2-9-1-release.zip"
13 "D:\dev\Endvlib\SDL2-2.0.5-win32-x64.zip"
14 "D:\dev\Endvlib\vsyasm-1.3.0-win64.zip"
15 "D:\dev\Endvlib\yasm-1.3.0-win64.exe"

 

二、取出 pthreadVC2.lib pthreadVC2.dll 這兩個文件放到 build 下,(build在openHEVC文件裏新建一個)

1 "D:\dev\Endvlib\pthreads-w32-2-9-1-release\Pre-built.2\dll\x64\pthreadGC2.dll"
2 "D:\dev\Endvlib\pthreads-w32-2-9-1-release\Pre-built.2\dll\x64\pthreadVC2.dll"

複製上述兩個文件到:

1 "D:\dev\Endvlib\openHEVC-hevc_rext\build\pthreadGC2.dll"
2 "D:\dev\Endvlib\openHEVC-hevc_rext\build\pthreadVC2.dll"

 

從FFmpeg源碼中拷貝如下幾個文件到openHEVC同名字的文件夾下 (提示缺XXX函數在XXX中,引用沒法找到:緣由是缺如下幾個文件: )

libavutil/fifo.c     

libavcodec/frame_thread_encoder.c

1 "D:\dev\Endvlib\ffmpeg-3.3.1\libavutil\fifo.c"
2 "D:\dev\Endvlib\ffmpeg-3.3.1\libavcodec\frame_thread_encoder.c"

複製上述兩個文件到:

1 "D:\dev\Endvlib\openHEVC-hevc_rext\libavutil\fifo.c"
2 "D:\dev\Endvlib\openHEVC-hevc_rext\libavcodec\frame_thread_encoder.c"

這兩個文件能夠放到C:\Windows下

 

打開CMakeLists.txt("D:\dev\Endvlib\openHEVC-hevc_rext\CMakeLists.txt")找到

 

 1 #find_package(CRYPTOPP_FOUND)
 2 find_package(SDL)
 3 find_package(SDL2)
 4 
 5 set(libfilenames
 6     libavutil/avstring.c
 7     libavutil/atomic.c
 8     libavutil/base64.c
 9     libavutil/bprint.c
10     libavutil/buffer.c
11     libavutil/channel_layout.c
12     .............

 

在set命令中添加如下幾條命令:set() 在Cmake中的意思是 將libavutil/avstring.c  libavutil/atomic.c 等賦值給變量libfilenames;

 1 #find_package(CRYPTOPP_FOUND)
 2 find_package(SDL)
 3 find_package(SDL2)
 4 
 5 set(libfilenames
 6     libavutil/avstring.c
 7     libavutil/atomic.c
 8     libavutil/base64.c
 9     libavutil/bprint.c
10     libavutil/buffer.c
11     libavutil/channel_layout.c
12      libavutil/fifo.c
13      libavcodec/frame_thread_encoder.c

 

 

而後在CMakeLists.txt中找到target_link_libraries(LibOpenHevcWrapper m) 這條語句,這條語句的做用是添加m.lib到LibOpenHevcWrapper這一項目的連接器中。然而m.lib是沒有的,找不到,既不是編譯階段能產生的,網上也沒法找到,誰知道!所以註釋掉:Cmake中 「#」是註釋命令!

1 if(CRYPTOPP_FOUND)
2 target_link_libraries(LibOpenHevcWrapper cryptopp)
3 else()
4 # target_link_libraries(LibOpenHevcWrapper m)
5 endif()

  

 你會發現,上述的配置都是按64位的環境來配置的,包括庫

準備工做弄完了,能夠開始編譯了: 

一、在openHEVC文件夾裏新建一個文件夾:習慣命名build (上面已經完成)

二、爲了在別的電腦上(沒安裝SDL2.X)方便用,將準備過程當中下載的SDL包解壓後,放到openHEVC文件夾裏  (可選,此步不執行)

三、將下載的

"D:\dev\Endvlib\yasm-1.3.0-win64.exe"

更名爲 yasm.exe 放在openHEVC文件夾裏(或系統目錄裏,例如C:\windows 其實放哪裏都行,由於看圖,你第一次運行 configure 後,出來的紅色區域,路徑都是能夠改的)

我是直接複製進去重命名爲  yasm.exe

四、(可選,這次不執行)將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})

五、打開Cmake

即 運行 "D:\dev\Endvlib\cmake-3.8.1-win64-x64\bin\cmake-gui.exe"

如圖:

 

 

路徑是你本身的路徑,路徑配好後,點擊configure,出現紅色背景區域,這紅色背景區域的地址均可以改的,特別的是將黃色方框標記的路徑改爲openHEVC裏面的路徑:不懂看圖

第一次configure:

 

Finish

 

 

 1 DEBUG: CMAKE_SYSTEM_PROCESSOR = AMD64
 2 DEBUG: CMAKE_SYSTEM_NAME      = Windows
 3 DEBUG: SIZEOF_VOID_P      = 4
 4 Detected CPU: haswell
 5 Found components for YASM
 6 YASM_ROOT_DIR  = C:/Program Files (x86)/openHEVC
 7 YASM_INCLUDES  = YASM_INCLUDES-NOTFOUND
 8 YASM_LIBRARIES = YASM_LIBRARIES-NOTFOUND
 9 Could NOT find SDL (missing:  SDL_LIBRARY) 
10 Could NOT find SDL2 (missing:  SDL2_LIBRARY) 
11 Configuring done

 

修改紅色部份爲:

 

 

1  SDL_LIBRARY  D:/dev/Endvlib/SDL2-devel-2.0.5-mingw/SDL2-2.0.5/x86_64-w64-mingw32/lib/libSDL2.a
2  SDL2_LIBRARY D:/dev/Endvlib/SDL2-devel-2.0.5-mingw/SDL2-2.0.5/x86_64-w64-mingw32/lib/libSDL2.a
3  SDL2_INCLUDE_DIR D:\dev\Endvlib\SDL2-devel-2.0.5-mingw\SDL2-2.0.5\x86_64-w64-mingw32\include 
4  SDLMAIN_LIBRARY D:/dev/Endvlib/SDL2-devel-2.0.5-mingw/SDL2-2.0.5/x86_64-w64-mingw32/lib/libSDL2.a
5  YASM_EXECUTABLE D:/dev/Endvlib/vsyasm-1.3.0-win64/yasm-1.3.0-win64.exe
6  

 

第二次configure:

搞了半天還有錯誤,不過項目是生成了

6. 點擊Cmake的generate按鈕,vs項目就生成了!

七、打開build文件夾,將裏面沒用的工程刪掉,否則心煩,以下面左圖,刪掉後打開vs工程 後綴名爲.sln的 就是解決方案的簡稱,沒錯打開的就是這個!發現如圖右所示,按圖右,在沒法加載的工程上右擊鼠標,選擇移除。

 

右擊LibOpenHevcWrapper項目,選擇生成,會發現出現如下錯誤:

 

 

 。。。。。。。。。
1
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt\stdio.h(1421): warning C4005: 「vsnprintf」: 宏重定義 2 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt\stdio.h(1421): note: 命令行參數: 參見前面的「vsnprintf」定義 3 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt\stdio.h(1423): fatal error C1189: #error: Macro definition of vsnprintf conflicts with Standard Library function declaration 4 1>idct_sse2_xvid.c 5 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt\stdio.h(1421): warning C4005: 「vsnprintf」: 宏重定義 6 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt\stdio.h(1421): note: 命令行參數: 參見前面的「vsnprintf」定義 7 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt\stdio.h(1423): fatal error C1189: #error: Macro definition of vsnprintf conflicts with Standard Library function declaration 8 1>qpeldsp_init.c 9 1>videodsp_init.c 10 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt\stdio.h(1421): warning C4005: 「vsnprintf」: 宏重定義 11 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt\stdio.h(1421): note: 命令行參數: 參見前面的「vsnprintf」定義 12 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt\stdio.h(1423): fatal error C1189: #error: Macro definition of vsnprintf conflicts with Standard Library function declaration 13 1>strtod.c 14 1>D:\dev\Endvlib\openHEVC-hevc_rext\compat\strtod.c(43): warning C4273: 「strtod」: dll 連接不一致 15 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt\stdlib.h(497): note: 參見「strtod」的前一個定義 16 1>D:\dev\Endvlib\openHEVC-hevc_rext\compat\strtod.c(55): warning C4090: 「=」: 不一樣的「const」限定符 17 1>D:\dev\Endvlib\openHEVC-hevc_rext\compat\strtod.c(58): warning C4090: 「=」: 不一樣的「const」限定符 18 1>D:\dev\Endvlib\openHEVC-hevc_rext\compat\strtod.c(61): warning C4090: 「=」: 不一樣的「const」限定符 19 1>D:\dev\Endvlib\openHEVC-hevc_rext\compat\strtod.c(64): warning C4090: 「=」: 不一樣的「const」限定符 20 1>D:\dev\Endvlib\openHEVC-hevc_rext\compat\strtod.c(67): warning C4090: 「=」: 不一樣的「const」限定符 21 1>D:\dev\Endvlib\openHEVC-hevc_rext\compat\strtod.c(70): warning C4090: 「=」: 不一樣的「const」限定符 22 1>D:\dev\Endvlib\openHEVC-hevc_rext\compat\strtod.c(73): warning C4090: 「函數」: 不一樣的「const」限定符 23 1>D:\dev\Endvlib\openHEVC-hevc_rext\compat\strtod.c(77): warning C4090: 「函數」: 不一樣的「const」限定符 24 1>D:\dev\Endvlib\openHEVC-hevc_rext\compat\strtod.c(84): warning C4244: 「=」: 從「__int64」轉換到「double」,可能丟失數據 25 1>snprintf.c 26 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt\stdio.h(1421): warning C4005: 「vsnprintf」: 宏重定義 27 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt\stdio.h(1421): note: 命令行參數: 參見前面的「vsnprintf」定義 28 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt\stdio.h(1423): fatal error C1189: #error: Macro definition of vsnprintf conflicts with Standard Library function declaration 29 1>正在生成代碼... 30 1>已完成生成項目「LibOpenHevcWrapper.vcxproj」的操做 - 失敗。 31 ========== 生成: 成功 0 個,失敗 1 個,最新 0 個,跳過 0 個 ==========

 

預處理定義

  <PreprocessorDefinitions>WIN32;_WINDOWS;__SSE2__;__SSE3__;__SSSE3__;__SSE4_1__;__SSE4_2__;__AVX__;__SSE2AVX__;snprintf=avpriv_snprintf;vsnprintf=avpriv_vsnprintf;inline=__inline;restrict=__restrict;PIC;USE_SDL;CMAKE_INTDIR="Debug";LibOpenHevcWrapper_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    
   <PreprocessorDefinitions>WIN32;_WINDOWS;__SSE2__;__SSE3__;__SSSE3__;__SSE4_1__;__SSE4_2__;__AVX__;__SSE2AVX__;snprintf=avpriv_snprintf;vsnprintf=avpriv_vsnprintf;inline=__inline;restrict=__restrict;PIC;USE_SDL;CMAKE_INTDIR="Debug";LibOpenHevcWrapper_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
   
  <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;__SSE2__;__SSE3__;__SSSE3__;__SSE4_1__;__SSE4_2__;__AVX__;__SSE2AVX__;snprintf=avpriv_snprintf;vsnprintf=avpriv_vsnprintf;inline=__inline;restrict=__restrict;PIC;USE_SDL;CMAKE_INTDIR=\"Debug\";LibOpenHevcWrapper_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    

 

<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;__SSE2__;__SSE3__;__SSSE3__;__SSE4_1__;__SSE4_2__;__AVX__;__SSE2AVX__;snprintf=avpriv_snprintf;vsnprintf=avpriv_vsnprintf;inline=__inline;restrict=__restrict;PIC;USE_SDL;CMAKE_INTDIR="Release";LibOpenHevcWrapper_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

 

<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;__SSE2__;__SSE3__;__SSSE3__;__SSE4_1__;__SSE4_2__;__AVX__;__SSE2AVX__;snprintf=avpriv_snprintf;vsnprintf=avpriv_vsnprintf;inline=__inline;restrict=__restrict;PIC;USE_SDL;CMAKE_INTDIR=\"Release\";LibOpenHevcWrapper_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

 

<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;__SSE2__;__SSE3__;__SSSE3__;__SSE4_1__;__SSE4_2__;__AVX__;__SSE2AVX__;snprintf=avpriv_snprintf;vsnprintf=avpriv_vsnprintf;inline=__inline;restrict=__restrict;PIC;USE_SDL;CMAKE_INTDIR=\"MinSizeRel\";LibOpenHevcWrapper_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;__SSE2__;__SSE3__;__SSSE3__;__SSE4_1__;__SSE4_2__;__AVX__;__SSE2AVX__;snprintf=avpriv_snprintf;vsnprintf=avpriv_vsnprintf;inline=__inline;restrict=__restrict;PIC;USE_SDL;CMAKE_INTDIR="RelWithDebInfo";LibOpenHevcWrapper_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

 

<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;__SSE2__;__SSE3__;__SSSE3__;__SSE4_1__;__SSE4_2__;__AVX__;__SSE2AVX__;snprintf=avpriv_snprintf;vsnprintf=avpriv_vsnprintf;inline=__inline;restrict=__restrict;PIC;USE_SDL;CMAKE_INTDIR=\"RelWithDebInfo\";LibOpenHevcWrapper_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

 

 

WIN32
_WINDOWS
NDEBUG
__SSE2__
__SSE3__
__SSSE3__
__SSE4_1__
__SSE4_2__
__AVX__
__SSE2AVX__
snprintf=avpriv_snprintf
vsnprintf=avpriv_vsnprintf
inline=__inline
restrict=__restrict
PIC
USE_SDL
CMAKE_INTDIR="MinSizeRel"
LibOpenHevcWrapper_EXPORTS

 

 

 

解決辦法:在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 了!

相關文章
相關標籤/搜索