ゼロ、準備完了
- コンパイラ環境:
Ubuntu16.0.4
- NDK バージョン:
android-ndk-r21c-linux-x86_64
- ffmpeg バージョン: 4.4.1
- fdk-aac: fdk-aac-2.0.2
- ラメ: ラメ-3.100
1. 理論的根拠
1.1. シェルの環境変数
環境変数を設定するには、次の 3 つの方法があります。
- The first is NDKROOT=your actual path. これは一時的な環境変数で、現在のターミナルでのみ表示および使用でき、変数がシェルのこの層で使用されることが明確にわかっていない限り、より深いコンパイルでは表示されません。
- 2 つ目は export CC=YOUR_CC で、これも一時的な環境変数ですが、その可視性は最初のものよりも広く、サブレベルまたはさらに深いディレクトリで有効になったり、使用されたりする可能性があります。控えめに言って、いくつかのシステム環境変数を再割り当てするとき、追加します
export
- 3 つ目はシステム レベルの環境変数構成で、端末の初期化時に設定される NDKROOT パスです。共通ファイルパスを定数として定義するなど、シェルを作成するときに一部のコンテンツを単純化する必要があるため、これを理解する必要があります。後で定数を引用するだけで済みます。これは、変更にも非常に便利です。システム自体の一部の環境変数では、環境変数を設定するとその値が上書きされるため、環境変数を定義するときは、その値を上書きするか、すべての環境変数を表示できる新しい環境変数を作成するかに注意してください。ターミナルの下
envprint
。
1.2、GCC 関連のコンパイル手順
Android 側で利用可能なコードをコンパイルするときは、まずCC
ツールを C 言語コンパイラに指定する必要があります.Linux でデフォルトの CC を使用することを指定しない場合、コンパイルされたプログラムは Linux でしか使用できず、 Android プラットフォームでは利用できません.結局、両者にはまだ違いがあるため、CC を指定する必要があります. CC パスは NDK パスの下にあります. NDK には、各アーキテクチャのコンパイル ツールと、もちろんCXX
C++ 言語コンパイラが含まれています。以下で詳しくお話しします。次に、ライブラリを指定する必要があります. コンパイルした ffmpeg が fdk-aac と他のサードパーティ ライブラリを統合したい場合は、サードパーティ ライブラリのダイナミック リンク ライブラリとヘッダー ファイルをインポートする必要があります. ) , CFLAGS
( -I三方库的头文件路径
コマンドLDFLAGS
ラインリンカーへの引数)-L三方库的库文件路径(动态或静态库)
2.NDK を構成する
- 対応する NDK バージョンをダウンロードして、コンピューターに展開します。
中国語を使わないようにし、NDK のバージョンに注意してください.コンパイルに解決できない奇妙な問題がある場合は、別の NDK バージョンを試してみてください.古すぎる場合は使用しないでください.
- NDK パスを環境変数に設定する
環境変数ファイルを開きます
vim ~/.bashrc
最後に NDK のパスを追加し、PATH を再割り当てします。PATH はシステムのデフォルトの環境変数です。それに基づいて追加する必要があります。そうしないと、元の環境変数が使用できなくなります。
export NDKROOT=/home/zhoubin/Documents/android-ndk-r21c
export PATH=$NDKROOT:$PATH
環境変数を有効にする
source ~/.bashrc
3.前菜をコンパイルする
3.1 lame.so をコンパイルする
- lameソースコード圧縮パッケージをダウンロードして解凍
- シェル スクリプトを記述します (例として 32 ビット V7 を取り上げます)。
解凍されたソース パスの下に build_v7.sh を書き込みます (任意の名前を付けます)。
#NDKROOT我们已经配置环境变量了所以可以直接用,TOOLCHAIN我们在这设置一个零时变量
TOOLCHAIN="$NDKROOT/toolchains/llvm/prebuilt/linux-x86_64"
#重新赋值我们的CC和CXX,用我们Android自己的C编译器,而且会有32和64之分
#32位V7的我们用armv7a-linux-androideabi
#64位V8的我们用aarch64-linux-android
HOST=armv7a-linux-androideabi
V=21
#至于这个21你可以自己选版本号,看你的目录下有哪些版本
export CC=$TOOLCHAIN/bin/$HOST$V-clang
export CXX=$TOOLCHAIN/bin/$HOST$V-clang++
echo $CC
#PREFIX定义我们的编译输出目录,这里指的是上级目录下新建armeabi-v7a文件夹存放
PREFIX=$(dirname $(pwd))/armeabi-v7a
#最简版本 指定编译动态链接库不编译静态库
#其它参数配置可以在lame源码根目录下执行./configure -h查看默认和支持的配置
function build_config
{
./configure \
--enable-static=no \
--host=$HOST \ #我们代码需要运行的平台
--disable-frontend \ #不编译可执行的命令程序
--prefix=$PREFIX
}
build_config
make clean
make -j8 #8是线程数 数字越大编译速度越快,前提是你电脑支持
make install
このように直接コンパイルすると、問題が発生します. 問題は ./fdk-aac-2.0.2/libSBRdec/src/lpp_tran.cpp ファイルにあります. 見つからないヘッダー ファイルを参照しています"log/log.h"
.に置き換え"android/log.h"
、 android_errorWriteLog
同時にメソッドをコメントアウトします. このログを非常に大切にする場合は、独自のログに置き換えることができます (可能ですが、必須ではありません). 実際、3 つの段落をパッケージでコメントアウトすることもでき__ANDROID__
ます. しばらくして問題がなければ、設定した PREFIX パスに .so ライブラリとヘッダー ファイルが表示されます。
3.2 ffd-aac.so のコンパイル
--disable-frontend
実際は lame と手順は同じですが、fdk-aac にはこの設定がないのと違い、./configure -h
ヘルプでどのような設定項目があるかを知ることができます。
4. ffmpeg をコンパイルする
- ffmpeg ソースコードをダウンロード
ダウンロードには多くの方法があります。圧縮されたパッケージをダウンロードするか、git clone で取得できます。
- ダイナミック リンク ライブラリの出力名を変更する
ダイナミック リンク ライブラリの名前を変更しない場合、元の外観は libavutils.56.so. この形式は、通常の命名の習慣とは異なり、ネチズンは Android をロードできないと言っています (ここには改ざんはありません。少し意味があります)、安全のために、名前を変更しましょう。のソース コードのルート ディレクトリにある構成ファイルを変更します。
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)'
- シェルを書く
以前の経験では、それらのほとんどはほとんど同じです. 違いは、ffd-aac と lame のコンパイル済みパッケージをインポートする必要があるため、それらを構成する必要があることです. ffd-aac と lame のヘッダー ファイルを構成できます.ライブラリファイルのパスと同じパスに配置することもできますCFLAGS
. LDFLAGS
その他はffmpegの構成設定で、これも渡すことができます
./configure -h
ffmpeg のオプションおよびデフォルト構成を確認してください。以下は私のシェルスクリプトです. 私たちは自分のニーズに応じて特定のコンパイラを設定して有効にすることができます. 例えば, オーディオ編集のみを行う場合, オーディオコーデックのみを有効にし, ビデオコーデックを削除することができます.もちろん、パッケージのサイズを気にしなければ、一部のコーデックで構成が失われるのではないかと心配することになります. また、ffd-aac とラメパッケージです。もちろん, 一部の構成では 3 部構成のパッケージが必要です. たとえば, ffplay は SDL 3 部構成のパッケージをインポートする必要があります. 再生には SDL に依存しています. X264 にも 3 部構成のパッケージが必要です. デフォルトでは, X264 は含まれていません. これらの 3 部構成のパッケージをインポートすることは, 実際にはここでは、それらについて 1 つずつ説明しません。次のシェル スクリプトでコメントするいくつかの構成は、シェル スクリプトの v8 バージョンです。
#!/bin/bash
NDK=$NDKROOT
#我编译的ffd-aac和lame动态链接库生成的位置
EXTC=$(pwd)/libextern
lib_cflag="-I$EXTC/armeabi-v8a/include"
lib_ldflags="-L$EXTC/armeabi-v8a/lib"
#arm
CPU=arm
#版本号,可自选
V=21
#armv7a 和 aarch64
ARCH=aarch64
#32位V7的我们用armv7a-linux-androideabi
#64位V8的我们用aarch64-linux-android
HOST=aarch64-linux-android
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin
CROSS_PREFIX=$TOOLCHAIN/aarch64-linux-android-
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
PREFIX=$(pwd)/android/$ARCH
configure()
{
./configure \
--prefix=$PREFIX \
--enable-cross-compile \#交叉编译所需配置 使能交叉编译
--cross-prefix=$CROSS_PREFIX \#交叉编译所需配置,在这个路径下自动去找到nm ar等这些编译工具
--target-os=android \#交叉编译所需配置 指定代码运行环境
--arch=$ARCH \#交叉编译所需配置 指定架构(指令集)
--extra-cflags=$lib_cflag \ #引入外部头文件
--extra-ldflags=$lib_ldflags \ #引入外部链接库文件
--cc=$TOOLCHAIN/$HOST$V-clang \
--cxx=$TOOLCHAIN/$HOS$V-clang++ \
--disable-static \
--enable-shared \
--disable-doc \#禁用文档编译
--disable-programs \#禁用编译命令行程序
--disable-avdevice \
--disable-network \#禁用了网络加载音视频
--disable-symver \
--enable-gpl \#开源代码所需
--enable-pic \#编译位置无关代码
--enable-jni \#适配Android的jni
--enable-pthreads \
--enable-libfdk-aac \
--enable-neon \#开源代码所需 fdk-aac和lame需要,毕竟别人开源的东西
--enable-nonfree \#开源代码所需
--enable-libmp3lame
}
build()
{
configure
make clean
make -j8
make install
}
build
上記を読んだ後、いくつかの質問があるかもしれません:
- 位置独立コードとは
- nmarとは
ar コマンドと nm コマンドの使い方_Liuzi のコラム - CSDN
ブログ
V. まとめ
現在はオーディオ編集に力を入れているので、インポートするのはオーディオ ライブラリだけですが、学生が x264 や opencv を導入したい場合、これらはすべて可能であり、ffmpeg は非常に再生可能です。私も現在初心者です。この記事を書いた理由は、ネット上でコンパイルの方法を教えているところはたくさんあるのに、なぜこのような構成になっているのかを語る人は少なく、おそらくどこからともなくコピペされているものもあると思うので、コンパイルはできるものの、まだわからないことがたくさんあります。それで、最初は理解できなかった多くのことを整理するために少し時間を費やしたので、この記事を思いつきました. 最初に、理解できるプロセスを書きました. 次に、私も願っています.他の人を助けるために。間違いがあれば、批判して訂正してください。コンパイル済みのダイナミック リンク ライブラリが必要な場合は、個人的にチャットしたり、メールを送ったりすることもできます。