Android 音視頻開發(fā)之自己動手編譯 FFmpeg

前言

ffmpeg 一套可以用來記錄冷溃、轉(zhuǎn)換數(shù)字音頻浴骂、視頻乓土,并能將其轉(zhuǎn)化為流的開源計算機程序,對于音視頻領域溯警,有著極為重要的地位趣苏。作為一名 Android developer,如要涉足音視頻領域梯轻,編譯使用 ffmpeg 是不可少的進階旅程食磕。下面帶你一步步實現(xiàn) ffmpeg 的編譯,在此之前喳挑,需要準備具有 Linux 環(huán)境的系統(tǒng)彬伦,如 Ubuntu、Mac伊诵,可以弄一個云服務器单绑,也可以裝個虛擬機,讀者自行斟酌曹宴。編譯使用到的 ndk 和 ffmpeg搂橙,ndk 使用的版本是 android-ndk-r16b,ffmpeg 使用的版本是 ffmpeg-3.3.9笛坦。在此建議讀者使用上述文中使用的版本份氧,其他版本會遇到其他問題唯袄,編譯流程也本文不同。

1. 配置環(huán)境變量

下載好了 ndk 和 ffmpeg linux 版本后蜗帜,將解壓后的 ffmpeg 放置于 /lib 目錄下恋拷,在 /lib 下新建目錄 ndk,將 ndk 解壓到 /lib/ndk 目錄下厅缺,然后配置 ndk 環(huán)境變量蔬顾。

ndk 和 ffmpeg 路徑

配置 ndk 環(huán)境變量,需要在 /etc/profile 文件中進行配置

vegen@vegen-virtual-machine:/lib/ndk/android-ndk-r16b$ sudo vim /etc/profile
[sudo] vegen 的密碼:

開啟文件編輯模式湘捎,在最末端進行 ndk 路徑的配置

/etc/profile

# 最末端配置 ndk 路徑
export NDK_PATH=/lib/ndk/android-ndk-r16b
export PATH=$NDKPATH:$PATH

編輯后 按 Esc 鍵 輸入 :wq保存

然后刷新系統(tǒng)環(huán)境诀豁,使用 echo $NDK_PATH 命令查看 ndk 路徑,若輸出結(jié)果如下窥妇,則配置成功

vegen@vegen-virtual-machine:/lib/ndk/android-ndk-r16b$ source /etc/profile
vegen@vegen-virtual-machine:/lib/ndk/android-ndk-r16b$ echo $NDK_PATH
/lib/ndk/android-ndk-r16b

2. 編寫 ffmpeg 配置腳本

vegen@vegen-virtual-machine:/lib/ffmpeg-3.3.9$ vim ffmpeg_build.sh

ffmpeg_build.sh

# 用于編譯 android 平臺的腳本
#!/bin/bash
. /etc/profile

# 定義幾個變量
ARCH=arm
CPU=armv7-a
PREFIX=$(pwd)/android/$ARCH/$CPU
ANDROID_TOOLCHAINS_PATH=$NDK_PATH/android-toolchains/android-19/arch-arm
CROSS_PREFIX=$ANDROID_TOOLCHAINS_PATH/bin/arm-linux-androideabi-
SYSROOT=$ANDROID_TOOLCHAINS_PATH/sysroot

 build(){
        # 執(zhí)行 .configure 文件
        ./configure --prefix=${PREFIX} \
        --enable-gpl \
        --disable-static \
        --enable-shared \
        --enable-small \
        --disable-programs \
        --disable-ffmpeg \
        --disable-ffplay \
        --disable-ffprobe \
        --disable-ffserver \
        --disable-doc \
        --arch=$ARCH \
        --cpu=$CPU \
        --cross-prefix=${CROSS_PREFIX} \
        --enable-cross-compile \
        --sysroot=$SYSROOT \
        --target-os=linux \
        --extra-cflags="-fpic" \

        # makefile 清除舷胜,就是執(zhí)行了 makefile 文件里面的 clean 命令
        make clean
        # 運行 Makefile
        make
        # 安裝到指定 prefix 目錄下
        make install
        # make clean
}


# 執(zhí)行 build 函數(shù)
build

ffmpeg 工程代碼量很多,有時候我們只需要一些不太復雜的音視頻處理活翩,這時就可以有針對性需求地選擇編譯烹骨。

3. 修改 ffmpeg 的 configure 文件

vegen@vegen-virtual-machine:/lib/ffmpeg-3.3.9$ vim configure

在 configure 輸入 /SLIBNAME_WITH_MAJOR= 進行搜索,按 n 查找到下面的代碼段

SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'

將上面的代碼段修改成如下代碼段

# SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
# LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
# SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
# SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'

SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'

保存退出后材泄,需要安裝 gcc 和 yasm

vegen@vegen-virtual-machine:/lib/ffmpeg-3.3.9$ sudo apt install gcc
vegen@vegen-virtual-machine:/lib/ffmpeg-3.3.9$ sudo apt install yasm

待安裝完成之后沮焕,執(zhí)行 如下命令

vegen@vegen-virtual-machine:/lib/ffmpeg-3.3.9$ sudo ./configure

4. 執(zhí)行編譯腳本

vegen@vegen-virtual-machine:/lib/ffmpeg-3.3.9$ ./ffmpeg_build.sh

至此,編譯 ffmpeg 完成拉宗,若成功峦树,你將看到 android 目錄和如下 so 庫,然后我們將需要的 so 庫和 include 文件引入到我們的項目中就可以愉快地開發(fā)啦旦事。

android 目錄
so 庫

5. 后話

編譯 ffmpeg 過程中魁巩,可能會遇到很多問題,讀者需要檢查代碼有沒有敲錯姐浮,相關的程序有沒有安裝谷遂,如 Linux 基礎欠缺的,需要讀者自行去學習单料。如有疑問,可在下方評論反饋点楼,后面將推出一些機遇 ffmpeg 的音視頻處理文章扫尖,敬請期待。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掠廓,一起剝皮案震驚了整個濱河市换怖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蟀瞧,老刑警劉巖沉颂,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件条摸,死亡現(xiàn)場離奇詭異,居然都是意外死亡铸屉,警方通過查閱死者的電腦和手機钉蒲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來彻坛,“玉大人顷啼,你說我怎么就攤上這事〔耄” “怎么了钙蒙?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長间驮。 經(jīng)常有香客問我躬厌,道長,這世上最難降的妖魔是什么竞帽? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任扛施,我火速辦了婚禮,結(jié)果婚禮上抢呆,老公的妹妹穿的比我還像新娘煮嫌。我一直安慰自己,他們只是感情好抱虐,可當我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布昌阿。 她就那樣靜靜地躺著,像睡著了一般恳邀。 火紅的嫁衣襯著肌膚如雪懦冰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天谣沸,我揣著相機與錄音刷钢,去河邊找鬼。 笑死乳附,一個胖子當著我的面吹牛内地,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赋除,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼阱缓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了举农?” 一聲冷哼從身側(cè)響起荆针,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后航背,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喉悴,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年玖媚,在試婚紗的時候發(fā)現(xiàn)自己被綠了箕肃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡最盅,死狀恐怖突雪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涡贱,我是刑警寧澤咏删,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站问词,受9級特大地震影響督函,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜激挪,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一辰狡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧垄分,春花似錦宛篇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至豺瘤,卻和暖如春吆倦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坐求。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工蚕泽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人桥嗤。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓须妻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親泛领。 傳聞我的和親對象是個殘疾皇子荒吏,可洞房花燭夜當晚...
    茶點故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內(nèi)容