1. 程式人生 > 其它 >FFMPEG arm64靜態庫構建(MAC)

FFMPEG arm64靜態庫構建(MAC)

 

  {

https://www.jianshu.com/p/8356c536957b

}

 

 

  首頁下載APP會員IT技術

FFMPEG arm64靜態庫構建(MAC)

山已幾孑      

FFMPEG arm64靜態庫構建(MAC)

山已幾孑 2020.07.02 11:16:56字數 630閱讀 747

目前網路上的FFMPEG構建的帖子十分的多,整合到iOS專案中的例子也比比皆是,但是,一方面網路上FFMPEG的教程大多數都是基本庫的構建,FFMPEG庫可以使用很多的第三方庫,這方面相關的內容幾乎沒有;另一方面,iOS使用FFMPEG大多數還是通過命令列使用,在FFMPEG的交流群裡,大多還是純FFMPEG開發,我們的問題too LOW

,沒人管。。。

FFMPEG安裝和無元件構建。

網上相關的例子太多了,我就不一一列舉了,有需要的同學直接搜尋就好了,我這裡主要說下arm64框架下的有元件的靜態庫的構建。

freetype 、Libpng構建

這裡做了一個加文字水印的功能,網上相關命令有很多,只有很少才告訴了你需要用freetype,但是freetype怎麼打包卻沒人說。
水印命令:

 
ffmpeg -i input.MP4 -s "540x720" -vf "drawtext=fontfile=FZHTJW.TTF:text=技術是第一生產力:fontsize=28:[email protected]:shadowy=2[text];[in][text]overlay=main_w-overlay_w-10:main_h-overlay_h-10[out]" -y output.mp4
//使用字型庫FZHTJW.TTF新增水印,文字為“技術是第一生產力”,位置是左下角

水印功能使用drawtext 濾鏡,drawtext需要Freetype支援,freetype打包的時候,需要libpng庫的支援

libpng

下載壓縮包地址:libpng 地址

libpng 構建相對簡單,在libpng-1.6.34/scripts 目錄下存在一大批的makeFile開頭的檔案。我們可以找到makefile.darwin檔案,修改該檔案,並複製到根目錄,命名為Makefile,makefile中改動如下,多餘程式碼已註釋一部分,各位根據情況各自去替換

 
# where "make install" puts libpng.a, libpng16.dylib, png.h, pngconf.h,
# and pnglibconf.h
# 設定庫的最終輸出路徑,這裡我使用了絕對路徑,各位自己改吧
prefix=/Users/kyang/Downloads/libpng-1.6.34/atmp/arm64

# Where the zlib library and include files are located
#這裡設定依賴庫的路徑和標頭檔案路徑,個人使用的XCode的SDK版本是13.2,各位根據自己的情況,修改對應的SDK版本。
ZLIBLIB=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/lib
ZLIBINC=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include
# 下面這兩個是編譯模擬器版本的路徑,就是x86_64框架
# ZLIBLIB=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulatorS13.2.sdk/usr/lib
# ZLIBINC=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.2.sdk/usr/include

# Utilities:
# 這裡修改了預設的編譯器,使用的是真機的編譯器。
CC=xcrun -sdk iphoneos clang
# CC=clang

# 這裡設定了庫的版本是arm64,如果修改其他框架,此處倆設定也改掉
CPPFLAGS=-arch arm64 -I$(ZLIBINC) 
# CFLAGS=-W -Wall -O3 -funroll-loops

$(LIBSOMAJ): $(OBJSDLL)
    $(CC) -arch arm64 -dynamiclib \
     -install_name $(LIBPATH)/$(LIBSOMAJ) \
     -current_version 16 -compatibility_version 16 \
     -o $(LIBSOMAJ) \
     $(OBJSDLL) -L$(ZLIBLIB) -lz

此時在終端執行make install,一切順利的話,輸出:

 
xcrun -sdk iphoneos clang -arch arm64 -dynamiclib \
     -install_name /Users/kyang/Downloads/libpng-1.6.34/atmp/arm64/lib/libpng16.16.dylib \
     -current_version 16 -compatibility_version 16 \
     -o libpng16.16.dylib \
     png.pic.o pngset.pic.o pngget.pic.o pngrutil.pic.o pngtrans.pic.o pngwutil.pic.o pngread.pic.o pngrio.pic.o pngwio.pic.o pngwrite.pic.o pngrtran.pic.o pngwtran.pic.o pngmem.pic.o pngerror.pic.o pngpread.pic.o -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/lib -lz
cat scripts/libpng.pc.in | sed -e s!@prefix@!/Users/kyang/Downloads/libpng-1.6.34/atmp/arm64! \
    -e s!@exec_prefix@!/Users/kyang/Downloads/libpng-1.6.34/atmp/arm64! \
    -e s!@libdir@!/Users/kyang/Downloads/libpng-1.6.34/atmp/arm64/lib! \
    -e s!@includedir@!/Users/kyang/Downloads/libpng-1.6.34/atmp/arm64/include! \
    -e s!-lpng16!-lpng16\ -lz! > libpng.pc
cp libpng16.16.dylib /Users/kyang/Downloads/libpng-1.6.34/atmp/arm64/lib
chmod 755 /Users/kyang/Downloads/libpng-1.6.34/atmp/arm64/lib/libpng16.16.dylib
(cd /Users/kyang/Downloads/libpng-1.6.34/atmp/arm64/lib; \
    ln -sf libpng16.16..dylib libpng16.dylib; \
    ln -sf libpng16.dylib libpng.dylib)
cp libpng.pc /Users/kyang/Downloads/libpng-1.6.34/atmp/arm64/lib/pkgconfig/libpng16.pc
chmod 644 /Users/kyang/Downloads/libpng-1.6.34/atmp/arm64/lib/pkgconfig/libpng16.pc
(cd /Users/kyang/Downloads/libpng-1.6.34/atmp/arm64/lib/pkgconfig; ln -sf libpng16.pc libpng.pc)
cp libpng.3 /Users/kyang/Downloads/libpng-1.6.34/atmp/arm64/man/man3
cp libpngpf.3 /Users/kyang/Downloads/libpng-1.6.34/atmp/arm64/man/man3
cp png.5 /Users/kyang/Downloads/libpng-1.6.34/atmp/arm64/man/man5
( cat scripts/libpng-config-head.in; \
    echo prefix=\"/Users/kyang/Downloads/libpng-1.6.34/atmp/arm64\"; \
    echo I_opts=\"-I/Users/kyang/Downloads/libpng-1.6.34/atmp/arm64/include/libpng16\"; \
    echo L_opts=\"-L/Users/kyang/Downloads/libpng-1.6.34/atmp/arm64/lib\"; \
    echo libs=\"-lpng16 -lz\"; \
    cat scripts/libpng-config-body.in ) > libpng-config
chmod +x libpng-config
cp libpng-config /Users/kyang/Downloads/libpng-1.6.34/atmp/arm64/bin/libpng16-config
chmod 755 /Users/kyang/Downloads/libpng-1.6.34/atmp/arm64/bin/libpng16-config
(cd /Users/kyang/Downloads/libpng-1.6.34/atmp/arm64/bin; ln -sf libpng16-config libpng-config)
  image.png

輸出庫支援的框架資訊:

 
localhost:lib kyang$ lipo libpng16.a -info
Non-fat file: libpng16.a is architecture: arm64

freetype

freetype 編譯的shell如下:

 
export SDKPATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk"
export PNGLIB="/Users/kyang/Downloads/libpng-1.6.34/atmp/arm64/lib"
export PNGINCLUDE="/Users/kyang/Downloads/libpng-1.6.34/atmp/arm64/include"
export CC=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc  
export CFLAGS="-arch arm64 -I${PNGINCLUDE} -pipe -std=c99 -Wno-invalid-offsetof -Wno-trigraphs -fpascal-strings -O2 -Wreturn-type -Wunused-variable -fmessage-length=0 -fvisibility=hidden -miphoneos-version-min=8.0 -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk" 
export AR=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar 
export LDFLAGS="-arch arm64 -L${PNGLIB} -isysroot $SDKPATH -miphoneos-version-min=8.0"  
./configure --prefix=/Users/kyang/Downloads/freetype-2.10.2/atmp --host=arm-apple-darwin --without-harfbuzz 
unset SDKPATH PNGLIB PNGINCLUDE CC CFLAGS AR LDFLAGS

上面shell中設定了libpng的路徑-L${PNGLIB} 和 -I${PNGINCLUDE},當我們不設定該路徑,去make,會提示如下錯誤

 
ld: warning: ignoring file /usr/local/Cellar/libpng/1.6.37/lib/libpng16.dylib, building for iOS-arm64 but attempting to link with file built for macOS-x86_64
Undefined symbols for architecture arm64:
  "_png_create_info_struct", referenced from:
      _Load_SBit_Png in sfnt.o
  "_png_create_read_struct", referenced from:
      _Load_SBit_Png in sfnt.o
  "_png_destroy_read_struct", referenced from:
      _Load_SBit_Png in sfnt.o
  "_png_error", referenced from:
      _read_data_from_FT_Stream in sfnt.o
  .
  .
  .
  "_png_set_read_fn", referenced from:
      _Load_SBit_Png in sfnt.o
  "_png_set_read_user_transform_fn", referenced from:
      _Load_SBit_Png in sfnt.o
  "_png_set_strip_16", referenced from:
      _Load_SBit_Png in sfnt.o
  "_png_set_tRNS_to_alpha", referenced from:
      _Load_SBit_Png in sfnt.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [/Users/kyang/Downloads/freetype-2.10.2/objs/libfreetype.la] Error 1

設定libpng路徑之後成功make成功,輸出如下:

 
。
。
。
mv builds/unix/freetype-config.tmp builds/unix/freetype-config
rm -f builds/unix/freetype2.pc builds/unix/freetype2.pc.tmp
sed -e 's|%REQUIRES_PRIVATE%|zlib, libpng|'     \
        -e 's|%LIBS_PRIVATE%|-lbz2|'             \
        -e 's|%build_libtool_libs%||' \
        -e 's|%exec_prefix%|/Users/kyang/Downloads/freetype-2.10.2/atmp|'             \
        -e 's|%ft_version%|23.2.17|'                 \
        -e 's|%includedir%|/Users/kyang/Downloads/freetype-2.10.2/atmp/include|'               \
        -e 's|%libdir%|/Users/kyang/Downloads/freetype-2.10.2/atmp/lib|'                       \
        -e 's|%prefix%|/Users/kyang/Downloads/freetype-2.10.2/atmp|'                       \
        /Users/kyang/Downloads/freetype-2.10.2/builds/unix/freetype2.in                                                 \
        > builds/unix/freetype2.pc.tmp
chmod a-w builds/unix/freetype2.pc.tmp
mv builds/unix/freetype2.pc.tmp builds/unix/freetype2.pc

構建成功之後,庫存放路徑如下圖所示:

 

  image.png

FFMPEG

FFMPEG 構建使用build-ffmpeg.sh,
1.在CONFIGURE_FLAGS中設定開啟libfreetype
2.設定編譯環境是arm64
3.修改CFLAGS LDFLAGS設定freetype的路徑

 
CONFIGURE_FLAGS="--enable-cross-compile --disable-debug --disable-programs \
                 --disable-doc --enable-pic\
                 --enable-libfreetype\
                 "
# 設定僅編譯arm64
ARCHS="arm64"

# 大概在108行左右,已識別出是arm64環境,
PLATFORM="iPhoneOS"
CFLAGS="$CFLAGS -mios-version-min=$DEPLOYMENT_TARGET"
# -fembed-bitcode"
if [ "$ARCH" = "arm64" ]
then
EXPORT="GASPP_FIX_XCODE5=1"
echo "設定arm64下的 CFLAGS,設定freetype依賴的路徑和zlib的依賴路徑"
CFLAGS="$CFLAGS -I/Users/kyang/local/arm64/freetype/include/"
LDFLAGS="$LDFLAGS -L/Users/kyang/local/arm64/freetype/lib/ -lfreetype"

執行./build-ffmpeg.sh,結果如下

  ffmeeg構建結果   ffmpeg靜態庫檔案

整合FFMpeg到專案中

這部分有很多文章可看,需要注意的是,如果我們使用了單獨編譯的第三方庫,則需要把這些庫都匯入到專案中進行使用,包括各自的靜態庫標頭檔案

  匯入到xcode

 

    更多精彩內容,就在簡書APP       "小禮物走一走,來簡書關注我" 還沒有人讚賞,支援一下 山已幾孑 總資產7共寫了3.1W字獲得59個贊共14個粉絲       山已幾孑 總資產7   富文字計算最適字型大小 閱讀 14 一個controller中多個tableView的代理的封裝 閱讀 264 Canvas>Image.src>Webpack(image-loader) 閱讀 42

熱門故事

一個女網紅試睡員的自白:一覺醒來我口吐芬芳 果然,沒有一個女人能笑著走出老公的手機 男子深夜點外賣備註內容詭異,外賣小哥嚇傻 愛情沒有先來後到,但做人要有禮義廉恥

推薦閱讀

使用conda安裝RepeatMasker 閱讀 197 安卓逆向:環境搭建及工具安裝過程記錄 閱讀 302 linux中--prefix命令是什麼意思? 閱讀 799 Debian Linux下增加php對curl擴充套件的支援 閱讀 88 Android-Gradle打包設定 閱讀 526