ffmpeg shell編譯指令碼詳解

2021-10-01 10:06:00 字數 4229 閱讀 8141

編寫ffmpeg編譯指令碼:

ffmpeg-build.sh

#!/bin/bash

source=

"ffmpeg-3.4"

#2、其次:定義".h/.m/.c"檔案編譯的結果目錄

#目錄作用:用於儲存.h/.m/.c檔案編譯後的結果.o檔案

cache=

"cache"

#3、定義".a"靜態庫儲存目錄

#pwd命令:表示獲取當前目錄

staticdir=

`pwd

`/"laimin-ffmpeg-ios"

#4、新增ffmpeg配置選項->預設配置

#toolchain options:工具鏈選項(指定我麼需要編譯平台cpu架構型別,例如:arm64、x86等等…)

# --enable-cross-compile: 交叉編譯

#developer options:開發者選項

# --disable-debug: 禁止使用除錯模式

#program options選項

# --disable-programs:禁用程式(不允許建立命令列程式)

#documentation options:文件選項

# --disable-doc:不需要編譯文件

#toolchain options:工具鏈選項

# --enable-pic:允許建立與位置無關**

configure_flags=

"--enable-cross-compile --disable-debug --disable-programs --disable-doc --enable-pic"

#5、定義預設cpu平台架構型別

#arm64 armv7->真機->cpu架構型別

#x86_64 i386->模擬器->cpu架構型別

archs=

"arm64 armv7 x86_64 i386"

#6、指定我們的這個庫編譯系統版本->ios系統下的7.0以及以上版本使用這個靜態庫

targetversion=

"7.0"

#7、接受命令後輸入引數(執行此指令碼可以不傳引數,直接試用上面的 archs,也可以使用引數執行此指令碼編譯指定的架構型別)

#我是動態接受命令行輸入cpu平台架構型別(輸入引數:編譯指定的cpu庫)if[

"$*"

]then

#存在輸入引數,也就說:外部指定需要編譯cpu架構型別

archs=

"$*"

fi#8、安裝彙編器->yasm

#判斷一下是否存在這個彙編器

#乙個命令就能夠幫助我們完成所有的操作

#錯誤一:`which` yasm

#正確一:`which yasm`if[

!`which yasm`

]then

#homebrew:軟體管理器

#錯誤二:`which` brew

#正確二:`which brew`

#exit 1->安裝失敗了,那麼退出程式if[

!`which brew`

]then

echo

"安裝brew"

ruby -e "$(

curl -fssl "||

exit 1

fiecho

"安裝yasm"

#成功了

#exit 1->安裝失敗了,那麼退出程式

brew install yasm ||

exit 1

fiecho

"正在迴圈編譯不同架構的靜態庫"

#9、for迴圈編譯ffmpeg靜態庫

currentdir=

`pwd

`for arch in

$archs

doecho

"開始編譯"

#9.1、建立目錄

#在編譯結果目錄下-建立對應的平台架構型別

mkdir -p "$cache/$arch"

#9.2、進入這個目錄

cd"$cache/$arch"

#9.3、配置編譯cpu架構型別->指定當前編譯cpu架構型別

#錯誤三:"--arch $arch"

#正確三:"-arch $arch"

archflags=

"-arch $arch"

#9.4、判定一下你到底是編譯的是模擬器.a靜態庫,還是真機.a靜態庫if[

"$arch"

="i386" -o "$arch"

="x86_64"

]then

#模擬器

platform=

"iphonesimulator"

#支援最小系統版本->ios系統

archflags=

"$archflags -mios-simulator-version-min=$targetversion"

else

#真機(mac、ios都支援)

platform=

"iphoneos"

#支援最小系統版本->ios系統

archflags=

"$archflags -mios-version-min=$targetversion -fembed-bitcode"

#注意:優化處理(可有可無)

#如果架構型別是"arm64",那麼if[

"$arch"

="arm64"

]then

#gnu彙編器(gnu assembler),簡稱為gas

#gaspp->彙編器預處理程式

#解決問題:分段錯誤

#通俗一點:就是程式執行時,變數訪問越界一類的問題

export=

"gaspp_fix_xcode5=1"

fifi

#10、正式編譯

#tr命令可以對來自標準輸入的字元進行替換、壓縮和刪除

#'[:upper:]'->將小寫轉成大寫

#'[:lower:]'->將大寫轉成小寫

#將platform->轉成大寫或者小寫

xcrun_sdk=

`echo $platform |

tr'[:upper:]'

'[:lower:]'

` #編譯器->編譯平台

cc="xcrun -sdk $xcrun_sdk clang"

#架構型別->arm64if[

"$arch"

="arm64"

]then

#preprocessor.pl幫助我們編譯ffmpeg->arm64位靜態庫

as="gas-preprocessor.pl -arch aarch64 -- $cc"

else

#預設編譯平台

as="$cc"

fiecho

"執行到了1"

#目錄找到ffmepg編譯源**目錄->設定編譯配置->編譯ffmpeg原始碼

#--target-os:目標系統->darwin(mac系統早起版本名字)

#darwin:是mac系統、ios系統祖宗

#--arch:cpu平台架構型別

#--cc:指定編譯器型別選項

#--as:匯程式設計序

#$configure_flags最初配置

#--extra-cflags

#--prefix:靜態庫輸出目錄

tmpdir=

$$currentdir/$source/configure \

--target-os=darwin \

--arch=

$arch \

--cc=

"$cc" \

--as=

"$as" \

$configure_flags \

--extra-cflags=

"$archflags" \

--extra-ldflags=

"$archflags" \

--prefix=

"$staticdir/$arch" \

||exit 1

echo

"執行了"

#解決問題->分段錯誤問題

#安裝->匯出靜態庫(編譯.a靜態庫)

#執行命令

make -j3 install

$export

||exit 1

#回到了我們的指令碼檔案目錄

cd$currentdir

done

ffmpeg shell指令碼編寫

一 執行.configure disable yasm命令 編譯ffmpeg,編寫shell指令碼之前,要執行.configure disable yasm命令。執行這些命令的主要目的是進行一系列的準備工作,比如說檢查gcc的版本,會生成common.mak等檔案 1 解壓ffmpeg壓縮包 unz...

UDK 指令碼編譯執行

udk基礎學習 1.首先想通過簡單的直接在d udk udk 2012 03 development src utgame classes加入乙個指令碼,實現superjump功能,就是玩家在按跳躍鍵的時候可以高高跳起。我想從解決問題的先後順尋討論下本次udk的學習 a 加入debuggerinte...

mtk modem快速編譯指令碼

公司的modem 一直由驅動維護,分為新編譯方式和傳統編譯方式兩種方法,在編譯時需要手動查詢需要編譯的modem是在新編譯方式的指令碼裡,還是傳統編譯方式的指令碼裡,然後再覆蓋不同編譯指令碼,再執行編譯 整個查詢過程耗時且繁瑣,故重寫編譯指令碼執行快速編譯。明確需求 1.簡化傳統modem查詢編譯過...