build OBS VS2017
這篇是記錄我編譯產生OBS Studio時的過程,如果你要找的是我做的OBS版本
http://craftwarblog.blogspot.com/2017/09/chatty-obs-by-craftwar.html
nvenc的支援在750上,如果header用8.2版本,2018/11/12
OBS的nvenc會無法啟動,改成8.1就ok了
[NVENC encoder: 'streaming_h264'] Failed to open NVENC codec: Function not implemented
1080據說沒有問題,看來是ffmpeg沒做好能力的檢測
作者prebuild的dependencies檔常忘記更新
試著自己更新後發現一些問題
OBS會link到 libx264-*.dll
FFmpeg也會link到 libx264-*.dll
如果只compile更新 libx264,就會變成OBS link到新的
FFmpeg官方版會用舊的 libx264
都需要重build才比較不會有問題
ffmpeg不能用 /GL ,否則會出錯 (Dead-code elimination MSVC問題)
即使下了--disable-runtime-cpudetect,也會在最後失敗
https://trac.ffmpeg.org/ticket/2610
-FORCE:UNRESOLVED也沒辦法過,放棄/GL
因為 libavutil/cpu.c 判斷cpu的長這樣,應該要用 #if 直接濾掉 (x264是這樣做)
提問題的人也是這樣建議,結果ffmpeg拒絕修改,說這是M$的錯
static int get_cpu_flags(void)
{
if (ARCH_AARCH64)
return ff_get_cpu_flags_aarch64();
if (ARCH_ARM)
return ff_get_cpu_flags_arm();
if (ARCH_PPC)
return ff_get_cpu_flags_ppc();
if (ARCH_X86)
return ff_get_cpu_flags_x86();
return 0;
}
M$說這不是bug...是設計,你要去修正code
https://developercommunity.visualstudio.com/content/problem/290625/gl-does-not-remove-dead-code.html
正常code不該那樣寫,可以理解M$為何不想修
preprocessor不濾掉arch specific code,還丟給compiler浪費時間處理
dep分三個部份,可各別設path,實際上Cmake也只會檢查這三個
FFmpeg 任何多媒體處理 (顯示圖,播放音樂,畫面任何效果)
x264 用來即時壓縮實況
Curl 下載相關,自動更新程式和service設定 (和實況效能無關)
要提高效能重點就是前兩個,猜測是透過FFmpeg的介面去使用x264,才能抽象化壓成不同格式
一堆dll是FFmpeg要用到
FFmpeg和x264程式碼有用asm寫的,新的CPU比較會有感覺
作者Jim的版本是用mingw cross build,他下的參數中固定有
LDFLAGS="-static-libgcc",所以檔會大的多
基本上我做的版本都是用VS2017,效能會不會比較好不知道
檔案一定比較小,ram用量應該也是 (因為VC runtime幾乎都被半強迫裝進去了)
比VS2015做的檔案小
zlib 和 x264 基本沒啥參數可以調,dll拿去蓋過能運作,應該也不會有問題
其他檔不確定,這方面不夠熟
印象中會有問題的是c lib同時有static和shared混用,我猜是沒問題吧?
FFmpeg主要是沒開 libvpx (這東西有bug在mingw不能build懶得自己套patch)
某些格式的檔加進obs會不能解吧,用其他軟體放的不影響
webp的圖會無法用
FFmpeg預設是用static ling其他lib,所像libpng不用放就能看png
除非你設定改過才會用dll
configure
Note: When building a static binary, add --pkg-config-flags=\"--static\"."
--pkg-config-flags="--static" 不太懂,有空再看
稍微試過和官方版本混用,exe和Qt lib會有衝突而已,全用同一版本就ok
Qt不同版本通常不相容
只是測試啟動,沒實際使用,api沒變的情況下我覺得不會有問題
可能是cmake舊版不支援VS2017,似乎已無問題 (不用自己改版本號)
如果你要用VS2017 build,你得把solution和project file內含的工具版本拿掉,否則會出錯
改完後產生的檔案像這樣 (如果直接點開solution/project檔應該會有提示修改)
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PlatformToolset>v141</PlatformToolset>
VS2017是 VS15,ToolsVersion是15,PlatformToolset是v141
MSVCP140.DLL C runtime libary的名字
VS2015 VS14, PlatformToolset v140
關於OBS版本號
obs-studio\build64\config\obsconfig.h
obs-studio\cmake\Modules\ObsCpack.cmake
http://craftwarblog.blogspot.com/2017/09/chatty-obs-by-craftwar.html
nvenc的支援在750上,如果header用8.2版本,2018/11/12
OBS的nvenc會無法啟動,改成8.1就ok了
[NVENC encoder: 'streaming_h264'] Failed to open NVENC codec: Function not implemented
1080據說沒有問題,看來是ffmpeg沒做好能力的檢測
作者prebuild的dependencies檔常忘記更新
試著自己更新後發現一些問題
OBS會link到 libx264-*.dll
FFmpeg也會link到 libx264-*.dll
如果只compile更新 libx264,就會變成OBS link到新的
FFmpeg官方版會用舊的 libx264
都需要重build才比較不會有問題
ffmpeg不能用 /GL ,否則會出錯 (Dead-code elimination MSVC問題)
即使下了--disable-runtime-cpudetect,也會在最後失敗
https://trac.ffmpeg.org/ticket/2610
-FORCE:UNRESOLVED也沒辦法過,放棄/GL
因為 libavutil/cpu.c 判斷cpu的長這樣,應該要用 #if 直接濾掉 (x264是這樣做)
提問題的人也是這樣建議,結果ffmpeg拒絕修改,說這是M$的錯
static int get_cpu_flags(void)
{
if (ARCH_AARCH64)
return ff_get_cpu_flags_aarch64();
if (ARCH_ARM)
return ff_get_cpu_flags_arm();
if (ARCH_PPC)
return ff_get_cpu_flags_ppc();
if (ARCH_X86)
return ff_get_cpu_flags_x86();
return 0;
}
M$說這不是bug...是設計,你要去修正code
https://developercommunity.visualstudio.com/content/problem/290625/gl-does-not-remove-dead-code.html
正常code不該那樣寫,可以理解M$為何不想修
preprocessor不濾掉arch specific code,還丟給compiler浪費時間處理
dep分三個部份,可各別設path,實際上Cmake也只會檢查這三個
FFmpeg 任何多媒體處理 (顯示圖,播放音樂,畫面任何效果)
x264 用來即時壓縮實況
Curl 下載相關,自動更新程式和service設定 (和實況效能無關)
要提高效能重點就是前兩個,猜測是透過FFmpeg的介面去使用x264,才能抽象化壓成不同格式
一堆dll是FFmpeg要用到
FFmpeg和x264程式碼有用asm寫的,新的CPU比較會有感覺
作者Jim的版本是用mingw cross build,他下的參數中固定有
LDFLAGS="-static-libgcc",所以檔會大的多
基本上我做的版本都是用VS2017,效能會不會比較好不知道
檔案一定比較小,ram用量應該也是 (因為VC runtime幾乎都被半強迫裝進去了)
比VS2015做的檔案小
zlib 和 x264 基本沒啥參數可以調,dll拿去蓋過能運作,應該也不會有問題
其他檔不確定,這方面不夠熟
印象中會有問題的是c lib同時有static和shared混用,我猜是沒問題吧?
FFmpeg主要是沒開 libvpx (這東西有bug在mingw不能build懶得自己套patch)
某些格式的檔加進obs會不能解吧,用其他軟體放的不影響
webp的圖會無法用
FFmpeg預設是用static ling其他lib,所像libpng不用放就能看png
除非你設定改過才會用dll
configure
Note: When building a static binary, add --pkg-config-flags=\"--static\"."
--pkg-config-flags="--static" 不太懂,有空再看
稍微試過和官方版本混用,exe和Qt lib會有衝突而已,全用同一版本就ok
Qt不同版本通常不相容
只是測試啟動,沒實際使用,api沒變的情況下我覺得不會有問題
可能是cmake舊版不支援VS2017,似乎已無問題 (不用自己改版本號)
如果你要用VS2017 build,你得把solution和project file內含的工具版本拿掉,否則會出錯
改完後產生的檔案像這樣 (如果直接點開solution/project檔應該會有提示修改)
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PlatformToolset>v141</PlatformToolset>
VS2017是 VS15,ToolsVersion是15,PlatformToolset是v141
MSVCP140.DLL C runtime libary的名字
VS2015 VS14, PlatformToolset v140
關於OBS版本號
obs-studio\build64\config\obsconfig.h
obs-studio\cmake\Modules\ObsCpack.cmake
留言
張貼留言