FFmpeg和OpenSSL的編譯與使用

引言

目前在學習FFmpeg的使用较坛,肯定是要從源碼編譯開始一步步摸啦喜命,編譯過程中也是遇到了大大小小很多問題籽腕,查到的資料基本也都是比較老舊的版本爱葵,經(jīng)過各種試錯吧施戴,終于是編譯成功了,現(xiàn)在就來記錄一下編譯的過程萌丈,也希望能幫助到看這篇文章的你赞哗。


源碼與環(huán)境

編譯安卓系統(tǒng)使用的庫,需要用到NDK的工具鏈進行交叉編譯辆雾,我們這里使用的是 r20b 版本肪笋。
還有就是需要下載的源碼了,包括 FFmpeg 和 OpenSSL 的源代碼度迂,我們直接去官網(wǎng)下載最新的版本藤乙。
NDK歷史版本:https://developer.android.google.cn/ndk/downloads/revision_history
FFmpeg源碼:http://www.ffmpeg.org/download.html
OpenSSL源碼:https://www.openssl.org/source/snapshot/


準備編譯腳本

哎呀,現(xiàn)在還沒有時間寫詳細介紹惭墓,就先把腳本直接貼到這里吧坛梁。挖個坑,后面有時間再補腊凶,放個狗頭保命??

OpenSSL腳本

當然如果你不需要支持https划咐,就可以跳過openssl,直接去編譯ffmpeg钧萍。

#!/bin/bash
set -x

# NDK的路徑褐缠,根據(jù)自己的NDK位置進行設置
export ANDROID_NDK_ROOT=/Users/xxx/env/android-sdk/ndk/android-ndk-r20b
# 編譯工具鏈路徑
TOOLCHAIN=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/darwin-x86_64
# 編譯環(huán)境
SYSROOT=$TOOLCHAIN/sysroot

# 目標Android版本
API=21
# 目標指令集
ARCH=NONE
#so庫輸出目錄
OUTPUT_DIR=NONE

function build_armv7a() {
  ARCH=android-arm
  OUTPUT_DIR=$PWD/outputs/armeabi-v7a

  build_one
}

function build_aarch64() {
  ARCH=android-arm64
  OUTPUT_DIR=$PWD/outputs/arm64-v8a

  build_one
}

function build_one() {
  CC=clang
  export PATH=$TOOLCHAIN/bin:$PATH

  ./configure \
  $ARCH \
  -D__ANDROID_API__=$API \
  --prefix=$OUTPUT_DIR

  make clean all
  # 這里是定義用幾個CPU編譯
  make -j12
  make install
}

# 懶,就這么寫吧划煮,編哪個就放開哪個
build_armv7a
#build_aarch64

放在OpenSSL源碼更目錄下送丰,命令行進入文件夾并執(zhí)行該腳本,成功后會在當前目錄下生成如下目錄弛秋,需要用到的頭文件和靜態(tài)器躏、動態(tài)庫俐载,就在對應的 include 和 lib 文件夾下。


剛截的圖登失,還熱乎.jpg

FFmpeg腳本

#!/bin/bash
set -x

# NDK的路徑遏佣,根據(jù)自己的NDK位置進行設置
NDK=/Users/wwf/Desktop/env/android-sdk/ndk/android-ndk-r20b
# 編譯工具鏈路徑
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
# 編譯環(huán)境
SYSROOT=$TOOLCHAIN/sysroot

# 目標Android版本
API=21
# 目標指令集
ARCH=NONE
#so庫輸出目錄
OUTPUT_DIR=NONE
# 交叉編譯命令前綴
CROSS_PREFIX=NONE
CROSS_PREFIX_CLANG=NONE

# 若不添加 openssl 支持,這項不需要配置
OPENSSL_DIR=NONE

function build_armv7a() {
  ARCH=arm
  OUTPUT_DIR=$PWD/outputs/armeabi-v7a
  CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
  CROSS_PREFIX_CLANG=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-

  OPENSSL_DIR=$PWD/openssl/armeabi-v7a

  del_temp_config
  build_one
}

function build_aarch64() {
  ARCH=aarch64
  OUTPUT_DIR=$PWD/outputs/arm64-v8a
  CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
  CROSS_PREFIX_CLANG=$TOOLCHAIN/bin/aarch64-linux-android$API-

  OPENSSL_DIR=$PWD/openssl/arm64-v8a

  del_temp_config
  build_one
}

function del_temp_config {
    rm -rf config_components.h
    rm -rf config.h
}

function build_one() {
  ./configure \
  --prefix=$OUTPUT_DIR \
  --target-os=android \
  --arch=$ARCH \
  --enable-asm \
  --enable-neon \
  --enable-cross-compile \
  --enable-shared \
  --disable-static \
  --disable-doc \
  --disable-ffplay \
  --disable-ffprobe \
  --disable-symver \
  --disable-ffmpeg \
  --sysroot=$SYSROOT \
  --cc=${CROSS_PREFIX_CLANG}clang \
  --cxx=${CROSS_PREFIX_CLANG}clang++ \
  --cross-prefix=$CROSS_PREFIX \
  --enable-openssl \
  --enable-protocols \
  --enable-protocol=https \
  --enable-nonfree \
  --extra-cflags="-I$OPENSSL_DIR/include -fPIC" \
  --extra-ldflags="-L$OPENSSL_DIR/lib -lssl -lcrypto" \
# 若不添加 openssl 支持揽浙,上面幾項不需要配置状婶,替換成下面這句
#  --extra-cflags="-fPIC"

  make clean all
  # 這里是定義用幾個CPU編譯
  make -j12
  make install
}

# 懶,就這么寫吧馅巷,編哪個就放開哪個
build_armv7a
#build_aarch64

其中與openssl相關的部分就是 --enable-openssl 及后面的幾句膛虫,作用是允許使用openssl和執(zhí)行要鏈接的頭文件和靜態(tài)庫路徑。
如果不需要鏈接編譯 openssl 的話钓猬,腳本中的這一部分就是這樣的:

function build_one() {
  ./configure \
  --prefix=$OUTPUT_DIR \
  ...... 忽略部分 ......
  --cross-prefix=$CROSS_PREFIX \
  --extra-cflags="-fPIC" \

  make clean all
  # 這里是定義用幾個CPU編譯
  make -j12
  make install
}

安卓項目使用與 CMakeList 編寫

還是這句話稍刀,直接把腳本貼上吧,有時間在補充詳細說明敞曹。

# 最低版本支持
cmake_minimum_required(VERSION 3.18.1)

# 項目名账月,就是編譯后生成的 so 庫名字
project("ffmpegdemo")

# 支持gnu++11
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")

# 1. 添加頭文件目錄, 定義so庫和頭文件所在目錄
include_directories(${CMAKE_SOURCE_DIR}/ffmpeg/include)
set(lib_dir ${CMAKE_SOURCE_DIR}/ffmpeg/lib/${ANDROID_ABI})

add_library( avcodec
        SHARED
        IMPORTED )
set_target_properties( avcodec
        PROPERTIES IMPORTED_LOCATION
        ${lib_dir}/libavcodec.so )
add_library( avfilter
        SHARED
        IMPORTED )
set_target_properties( avfilter
        PROPERTIES IMPORTED_LOCATION
        ${lib_dir}/libavfilter.so )
add_library( avformat
        SHARED
        IMPORTED )
set_target_properties( avformat
        PROPERTIES IMPORTED_LOCATION
        ${lib_dir}/libavformat.so )
add_library( avutil
        SHARED
        IMPORTED )
set_target_properties( avutil
        PROPERTIES IMPORTED_LOCATION
        ${lib_dir}/libavutil.so )
add_library( swresample
        SHARED
        IMPORTED )
set_target_properties( swresample
        PROPERTIES IMPORTED_LOCATION
        ${lib_dir}/libswresample.so )
add_library( swscale
        SHARED
        IMPORTED )
set_target_properties( swscale
        PROPERTIES IMPORTED_LOCATION
        ${lib_dir}/libswscale.so )
add_library( avdevice
        SHARED
        IMPORTED )
set_target_properties( avdevice
        PROPERTIES IMPORTED_LOCATION
        ${lib_dir}/libavdevice.so )

add_library( ssl
        SHARED
        IMPORTED )
set_target_properties( ssl
        PROPERTIES IMPORTED_LOCATION
        ${lib_dir}/libssl.so )
add_library( crypto
        SHARED
        IMPORTED )
set_target_properties( crypto
        PROPERTIES IMPORTED_LOCATION
        ${lib_dir}/libcrypto.so )

# 當前cmake文件所在目錄下搜索所有源碼文件,命名為 SRC_LIST 供下面使用
aux_source_directory(. SRC_ROOT)
aux_source_directory(./audiosample SRC_AUDIO)
add_library( # Sets the name of the library.
        ffmpegdemo

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        ${SRC_ROOT}
        ${SRC_AUDIO}
        # native-lib.cpp
        )

# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

find_library( # Sets the name of the path variable.
        log-lib

        # Specifies the name of the NDK library that
        # you want CMake to locate.
        log)

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.
        ffmpegdemo

        # ffmpeg
        avcodec
        avfilter
        avformat
        avutil
        swresample
        swscale
        avdevice
        ssl
        crypto

        OpenSLES
        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})

這里再貼一下我的目錄結構吧澳迫,這些東西怎么放其實都無所謂局齿,主要是要跟 gradle 和 cmake 文件中用到的路徑對得上號。


剛截的圖橄登,熱乎.jpg

先寫到這里吧抓歼,沒有詳細說明很是慚愧,后面有時間一定補上拢锹。

轉載請注明出處锭部,@via FFmpeg和OpenSSL的編譯與使用 蟹蟹。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末取胎,一起剝皮案震驚了整個濱河市闻蛀,隨后出現(xiàn)的幾起案子役衡,更是在濱河造成了極大的恐慌榕莺,老刑警劉巖钉鸯,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異岩睁,居然都是意外死亡,警方通過查閱死者的電腦和手機肋层,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門蒲拉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雌团,“玉大人,你說我怎么就攤上這事灵寺。” “怎么了叮称?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵距帅,是天一觀的道長碌秸。 經(jīng)常有香客問我蹂窖,道長,這世上最難降的妖魔是什么月趟? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮婚被,結果婚禮上,老公的妹妹穿的比我還像新娘窜觉。我一直安慰自己是复,他們只是感情好,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布竖螃。 她就那樣靜靜地躺著,像睡著了一般逗余。 火紅的嫁衣襯著肌膚如雪特咆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機與錄音腻格,去河邊找鬼画拾。 笑死,一個胖子當著我的面吹牛菜职,可吹牛的內容都是我干的青抛。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼酬核,長吁一口氣:“原來是場噩夢啊……” “哼蜜另!你這毒婦竟也來了?” 一聲冷哼從身側響起嫡意,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤举瑰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蔬螟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體此迅,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年旧巾,在試婚紗的時候發(fā)現(xiàn)自己被綠了耸序。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡鲁猩,死狀恐怖坎怪,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情绳匀,我是刑警寧澤芋忿,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站疾棵,受9級特大地震影響戈钢,放射性物質發(fā)生泄漏。R本人自食惡果不足惜是尔,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一殉了、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拟枚,春花似錦薪铜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至脚乡,卻和暖如春蜒滩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工俯艰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捡遍,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓竹握,卻偏偏與公主長得像画株,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子啦辐,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350