FFmpeg和OpenSSL的编译与使用

引言

目前在学习FFmpeg的使用,肯定是要从源码编译开始一步步摸啦,编译过程中也是遇到了大大小小很多问题,查到的资料基本也都是比较老旧的版本,经过各种试错吧,终于是编译成功了,现在就来记录一下编译的过程,也希望能帮助到看这篇文章的你。


源码与环境

编译安卓系统使用的库,需要用到NDK的工具链进行交叉编译,我们这里使用的是 r20b 版本。
还有就是需要下载的源码了,包括 FFmpeg 和 OpenSSL 的源代码,我们直接去官网下载最新的版本。
NDK历史版本:https://developer.android.google.cn/ndk/downloads/revision_history
FFmpeg源码:http://www.ffmpeg.org/download.html
OpenSSL源码:https://www.openssl.org/source/snapshot/


准备编译脚本

哎呀,现在还没有时间写详细介绍,就先把脚本直接贴到这里吧。挖个坑,后面有时间再补,放个狗头保命🐶

OpenSSL脚本

当然如果你不需要支持https,就可以跳过openssl,直接去编译ffmpeg。

#!/bin/bash
set -x

# NDK的路径,根据自己的NDK位置进行设置
export ANDROID_NDK_ROOT=/Users/xxx/env/android-sdk/ndk/android-ndk-r20b
# 编译工具链路径
TOOLCHAIN=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/darwin-x86_64
# 编译环境
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源码更目录下,命令行进入文件夹并执行该脚本,成功后会在当前目录下生成如下目录,需要用到的头文件和静态、动态库,就在对应的 include 和 lib 文件夹下。


刚截的图,还热乎.jpg

FFmpeg脚本

#!/bin/bash
set -x

# NDK的路径,根据自己的NDK位置进行设置
NDK=/Users/wwf/Desktop/env/android-sdk/ndk/android-ndk-r20b
# 编译工具链路径
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
# 编译环境
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和执行要链接的头文件和静态库路径。
如果不需要链接编译 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的编译与使用 蟹蟹。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 197,597评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,053评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 144,583评论 0 326
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,888评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,772评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,536评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,922评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,554评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,838评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,861评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,677评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,483评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,928评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,104评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,403评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,945评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,156评论 2 339