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)


分割线


posted @ 2024-09-11 17:44  愤怒的蒲公英  阅读(32)  评论(0编辑  收藏  举报