libass编译以及cjk自动换行—— win+mac
libass
24年9月26更新:
注:本文用于解决(使用libass或ffmpeg的)中日韩语言字幕的自动换行问题。然ffmpeg已于6.1更新libass版本解决该问题(需要自行编译支持unibreak的libass)。下图截自vf_subtitles.c。
1.源代码链接
(libass与依赖库,必需)https://github.com/ShiftMediaProject
(cjk换行,可选)https://github.com/adah1972/libunibreak
2.各库间部分依赖关系
zlib。无
liblzma:无
libconv :无
libfreetype2: 无
libfribidi:无
libxml2: libiconv,zlib,liblzma
libfontconfig:[libconv],libxml2,libfreetype2
libharfbuzz:libfreetype2
libass:[libiconv],[libxml2],[libfreetype2],libfontconfig,libfribidi,libharfbuzz,libunibreak
3.libunibreak编译
1.win平台使用VS命令行工具。来自官方readme:
cd src
nmake -f Makefile.msvc
nmake -f Makefile.msvc CFG="libunibreak - Win32 Release"
命令行工具选择可参考 https://blog.csdn.net/liolafer1/article/details/127052237
3.cjk(中日韩)语言换行问题
1、libass与1.7.0版本引入libunibreak开源库用以解决cjk换行问题。编译时启用宏CONFIG_UNIBREAK即可。
2、win平台使用VS编译在 c++->预处理器 处增加预处理器定义即可,如下图:
4.编译失败
win:VS无法解析的外部符号 __imp_XXXX
检查libass与依赖库的运行库链接方式是否一致,推荐使用动态链接(/MD),c/c++->代码生成->运行库,如下图:
。
mac下编译包含libunibreak的libass
为了减少最终使用libass需要包含的文件,本次mac下编译libass为动态库。
pkgconfig
编译过程中,pkgconfig用于提供外部库的链接信息,包括库目录与头文件包含(搜索)目录。为保证将外部库符号全部编进libass动态库中,最好保证pkgconfig提供的外部库(libass需要的)的链接路径下只有静态库(.a),若存在动态库,可手动删除。
命令:
export PKG_CONFIG_PATH=/platform_build/lib/pkgconfig
export PKG_CONFIG_LIBDIR=/platform_build/lib/pkgconfig
MAC
1.pkg-config配置.
export PKG_CONFIG_PATH=/XXXXXX/buildEnv/new_Env/lib/pkgconfig
export PKG_CONFIG_LIBDIR=/XXXXXX/buildEnv/new_Env/lib/pkgconfig
mac环境下编译,需要pkg-config帮助链接第三方库,通常只需要设置PKG_CONFIG_PATH,保险起见,我们设置两个环境变量PKG_CONFIG_PATH和PKG_CONFIG_LIBDIR,避免pkg-config找不到库。
接下来,/XXXXXX/buildEnv/new_Env/lib/pkgconfig将成为我们编译第三方库的安装位置。(如已有第三方库需要被链接,也可将.pc文件所在目录添加进来)
2.交叉编译(指定编译架构与支持的最低系统版本)
x86_64:
./configure CFLAGS="-mmacosx-version-min=10.13 -arch x86_64" CXXFLAGS="-mmacosx-version-min=10.13 -arch x86_64" LDFLAGS="-mmacosx-version-min=10.13 -arch x86_64"
cmake -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_OSX_DEPLOYMENT_TARGET="10.13"
arm64:
./configure CFLAGS="-mmacosx-version-min=11.0 -arch arm64" CXXFLAGS="-mmacosx-version-min=11.0 -arch arm64" LDFLAGS="-mmacosx-version-min=11.0 -arch arm64"
cmake -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_DEPLOYMENT_TARGET="11.0"
其他命令
#1.
pwd -P
#当前物理工作路径,并解释/展开所有软链接
#2.
mkdir -p
#创建目录,-P递归参数
#3.
lipo -create build_x86/libXXX.dylib build_arm/libXXX.dylib -output libXXX.dylib
#合并x86_64与arm64库文件为双架构库文件
#4.
pkg-config --list-all
#5.
pkg-config [--cflags] --libs XXX
编译
1.权限
在需要编译的代码根目录执行,避免权限问题。
chmod -R 777 ./*
2.pkg-config设置
export PKG_CONFIG_PATH=/Users/Desktop/buildEnv/new_Env/lib/pkgconfig
export PKG_CONFIG_LIBDIR=/Users/Desktop/buildEnv/new_Env/lib/pkgconfig
3.编译
- libiconv:
#编译arm64架构,支持系统最低版本11.0
./configure --prefix=/Users/Desktop/buildEnv/new_Env_arm64 --enable-static --disable-shared CFLAGS="-mmacosx-version-min=11.0 -arch arm64" CXXFLAGS="-mmacosx-version-min=11.0 -arch arm64" LDFLAGS="-mmacosx-version-min=11.0 -arch arm64"
make -j 12
make install
#编译x86_64架构,支持系统最低版本10.13 -- 后续省略该命令。
./configure --prefix=/Users/Desktop/buildEnv/new_Env_arm64 --enable-static --disable-shared CFLAGS="-mmacosx-version-min=10.13 -arch x86_64" CXXFLAGS="-mmacosx-version-min=10.13 -arch x86_64" LDFLAGS="-mmacosx-version-min=10.13 -arch x86_64"
make -i 12
make install
- zlib
cmake -DCMAKE_INSTALL_PREFIX="${PREFIX_DIR}" \
-DCMAKE_BUILD_TYPE=Release \
-DZLIB_BUILD_EXAMPLES=OFF \
-DCMAKE_OSX_ARCHITECTURES=x86_64 \
-DCMAKE_OSX_DEPLOYMENT_TARGET="10.13" \
-S . -B tmp
cmake --build tmp
cmake --install tmp
#x86_64:
./configure --prefix=/Users/Desktop/buildEnv/build/xz-5.4.3/build_x86_64 --with-libiconv-prefix=/Users/zhoubin/Desktop/buildEnv/new_Env --disable-xz --disable-xzdec --disable-shared --enable-static CFLAGS="-mmacosx-version-min=10.13 -arch x86_64" CXXFLAGS="-mmacosx-version-min=10.13 -arch x86_64" LDFLAGS="-mmacosx-version-min=10.13 -arch x86_64"
#Arm64:
./configure --prefix=/Users/Desktop/buildEnv/new_Env_arm64 --with-libiconv-prefix=/Users/zhoubin/Desktop/buildEnv/new_Env_arm64 --disable-xz --disable-xzdec --disable-shared --enable-static CFLAGS="-mmacosx-version-min=11.0 -arch arm64" CXXFLAGS="-mmacosx-version-min=11.0 -arch arm64" LDFLAGS="-mmacosx-version-min=11.0 -arch arm64"
- harfbuzz
./configure --prefix=/Users/Desktop/buildEnv/build/harfbuzz-7.3.0/build_x86_64 --enable-static --disable-shared CFLAGS="-mmacosx-version-min=10.13 -arch x86_64" CXXFLAGS="-mmacosx-version-min=10.13 -arch x86_64" LDFLAGS="-mmacosx-version-min=10.13 -arch x86_64"
#Arm64
./configure --prefix=/Users/Desktop/buildEnv/build/harfbuzz-7.3.0/build_x86_64 --enable-static --disable-shared CFLAGS="-mmacosx-version-min=11.0 -arch arm64" CXXFLAGS="-mmacosx-version-min=11.0 -arch arm64" LDFLAGS="-mmacosx-version-min=11.0 -arch arm64"
- freetype
ps:freetype最好使用git clone,下载压缩包可能导致编译时出现问题(反正我是遇上了)。
./configure --prefix=/Users/zhoubin/Desktop/buildEnv/build/freetype/build_x86_64 --enable-static --disable-shared --with-brotli=no --with-bzip2=no CFLAGS="-mmacosx-version-min=10.13 -arch x86_64" CXXFLAGS="-mmacosx-version-min=10.13 -arch x86_64" LDFLAGS="-mmacosx-version-min=10.13 -arch x86_64"
#Arm64:
./configure --prefix= --enable-static --disable-shared --with-brotli=no CFLAGS="-mmacosx-version-min=11.0 -arch arm64" CXXFLAGS="-mmacosx-version-min=11.0 -arch arm64" LDFLAGS="-mmacosx-version-min=11.0 -arch arm64"
- Libxml2
./configure --prefix=/Users/zhoubin/Desktop/buildEnv/build/libxml2/build_x86_64 --with-iconv=/Users/zhoubin/Desktop/buildEnv/new_Env --without-python --enable-static --disable-shared CFLAGS="-mmacosx-version-min=10.13 -arch x86_64" CXXFLAGS="-mmacosx-version-min=10.13 -arch x86_64" LDFLAGS="-mmacosx-version-min=10.13 -arch x86_64"
./configure --prefix=[prefixValue] --with-iconv=/Users/zhoubin/Desktop/buildEnv/new_Env --without-python --enable-static --disable-shared CFLAGS="-mmacosx-version-min=11.0 -arch arm64" CXXFLAGS="-mmacosx-version-min=11.0 -arch arm64" LDFLAGS="-mmacosx-version-min=11.0 -arch arm64"
./configure --prefix=/Users/zhoubin/Desktop/buildEnv/build/fontconfig-2.14.1/build_x86_64 --enable-iconv --enable-libxml2 --with-libiconv-prefix=/Users/zhoubin/Desktop/buildEnv/new_Env -enable-static --disable-shared CFLAGS="-mmacosx-version-min=10.13 -arch x86_64" CXXFLAGS="-mmacosx-version-min=10.13 -arch x86_64" LDFLAGS="-mmacosx-version-min=10.13 -arch x86_64"
./configure --prefix= --enable-iconv --enable-libxml2 --with-libiconv-prefix= -enable-static --disable-shared CFLAGS="-mmacosx-version-min=11.0 -arch arm64" CXXFLAGS="-mmacosx-version-min=11.0 -arch arm64" LDFLAGS="-mmacosx-version-min=11.0 -arch arm64"
- Fribidi
./configure --prefix=/Users/zhoubin/Desktop/buildEnv/ --enable-static --disable-shared CFLAGS="-mmacosx-version-min=10.13 -arch x86_64" CXXFLAGS="-mmacosx-version-min=10.13 -arch x86_64" LDFLAGS="-mmacosx-version-min=10.13 -arch x86_64"
./configure --prefix= --enable-static --disable-shared CFLAGS="-mmacosx-version-min=11.0 -arch arm64" CXXFLAGS="-mmacosx-version-min=11.0 -arch arm64" LDFLAGS="-mmacosx-version-min=11.0 -arch arm64"
- Libunibreak
./configure -prefix=/Users/zhoubin/Desktop/buildEnv/new_Env_arm64 --enable-static --disable-shared CFLAGS="-mmacosx-version-min=11.0 -arch arm64" CXXFLAGS="-mmacosx-version-min=11.0 -arch arm64" LDFLAGS="-mmacosx-version-min=11.0 -arch arm64"
#x86_64略
- Libass
#--disable-libunibreak disable libunibreak support [default=check]
#arm64
./configure --prefix=/Users/zhoubin/Desktop/buildEnv/build/libass-0.17.1/build_arm64 --enable-shared --disable-static --enable-libunibreak CFLAGS="-mmacosx-version-min=11.0 -arch arm64" CXXFLAGS="-mmacosx-version-min=11.0 -arch arm64" LDFLAGS="-mmacosx-version-min=11.0 -arch arm64"
#x86_64
./configure --prefix=/Users/zhoubin/Desktop/buildEnv/build/libass-0.17.1/build_x86_64 --enable-shared --disable-static --enable-libunibreak CFLAGS="-mmacosx-version-min=10.13 -arch x86_64" CXXFLAGS="-mmacosx-version-min=10.13 -arch x86_64" LDFLAGS="-mmacosx-version-min=10.13 -arch x86_64"
ps1:不要将需要链接静态库的对应动态库编译安装到pkg-config链接目录.
ps2:otool -L 发现存在libbz2.1.0.dylib依赖.不影响使用,若需要去除,在存放freetype2等库的统一目录的lib目录下,存放libbz2.a,版本无所谓,注意对齐架构。然后重新编译libass即可。
(该库仅在本人代码测试无问题。建议重编并引入兼容的libbz2)
分割线