【Android 音视频开发打怪升级:FFmpeg音视频编解码篇 ...
来源:http://www.tudoupe.com时间:2021-12-25
- 1. 对开放的GLES的基本理解
- 2. 为制作视频图片,使用OpenGL。
- 第三, OpenGL 制作了几部视频,
- 第四,熟悉一下 OpenGL EGL。
- 5. OpenGL 中的 FBO 数据缓冲
- 6个机器人音频视频硬编码: 制作 MP4 文件 。
三. 使用FFmpeg的机器人视频解码
- 1份FFmpeg soku汇编
- FFmpeg现在可用在Android上。
- 3个机器人视频解码 与FFmpeg
- 4个FFmpeg+OpenSL 自动机器人的音频解码
- 5个FFmpeg+OpenGL ES视频
- 基本合成MP4:未封闭和隐蔽屏幕
- 使用 FFmpeg 的7个机器人视频编码
本文你可以了解到
使用
GCC
或CLANG
为了做一个体面的举动, 跨集成 FFmpeg图书馆 为Android平台。FFmpeg
发展的第一步是不仅了解它,而且了解它。不仅要理解如何成功编译,而且要理解为什么。在开始之前,我们建议您阅读整个文本,希望它能为您提供一些洞察力。
一、前言
网络上已经有大量的FFmpeg编集共享,但其中多数只是发表简介。 我相信搜索“如何编译FFmpeg图书馆”的人大多不熟悉交叉编译这一集。
特别是大多数移动终端开发商大多建在爪哇楼层上,很少接触NDK层。 如果你直接看跨编辑设置,它很可能非常出色。
通常,在由 FFmpeg 组合成的项目下, 有好几项评论, 例如“为什么不能按照业主的配置来建?”, 那么为什么我们就不能坐下来写?”
造成这种情况有几个原因,其中多数位于下列地点:
- 祈求一个可以成功编译的愚蠢的配置, 无脑复制;
- FFmpeg和NDK有几种版本,每种版本都有自己的要求。
- 我不知道拥有每一个组合意味着什么, 即使机会在我身边, 但它不能被正确的构建 与微小的调整。
为什么FFmpeg让事情变得如此困难?
我认为,这主要是因为很难迈出第一步,甚至不能迈出索马里的脚步,而其余的则是无稽之谈。
二、什么是交叉编译
定义
根据《英国新闻》,交叉汇编是在一个平台上从另一个平台上生成可执行代码。
更具体地说,在一台计算机上制作一个程序,可以在另一台计算机上操作。栗子:PC产生一个Apk,可以用Android电话运行,这基本上是一个交叉编辑过程。
为什么要交叉编译
我们知道个人电脑的软件是直接在电脑上创建的, 所以为什么不能直接用Android软件 直接编集在Android产品上, 即个人电脑的软件是直接在电脑上创建的, 那么为什么不能直接用Android软件 来编集Android软件呢?
从理论上讲,这是可以想象的,但是Android的手机资源是受到限制的。在计算机上,汇编Apk需要很长的时间。你能理解Android的手机需要多久才能创建Apk吗?
然后我们会想,因为电脑太机智了, 它不能用来开发 可以在手机上操作的软件。
因此,出现了交叉编辑。
交叉编译需要的什么
编译环境
我们知道,个人电脑上的操作环境与移动电话上的操作环境完全不同,如果个人电脑上的环境是直接建造的,汇编的App可能在几分钟内死亡。
交叉汇编的最重要方面是配置汇编过程中使用的环境,即目标计算机(如Android的电话)正在运行的环境。
编译工具链
C/C++/汇编一般有两种工具。GCC
和CLANG
。
GCC
如你所知,这是一个古老的汇编工具,不仅汇编C/C++,而且还汇编爪哇语、对象C语、Go语和其他语言。
CLANG
是一个与海合会兼容的更有效率的C/C++/汇编工具,鼓励谷歌使用叮当进行早期编辑。ndk 17
以后,把GCC
删除,充分利用。CLANG
。
三. 如何在交叉组合中使用FFmpeg
FFmpeg是什么
甚至连不制作视听录像的制作人, 也只对著名的FFmpeg小耳熟能详, 更别提是视听舞台上的闪电。
官方简介
A complete, cross-platform solution to record, convert and stream audio and video.
翻译为:FFmpeg是用于音像汇编、转换和处理的完整跨平台解决方案。
从本摘要可明显看出,FFmpeg具有以下特点:
- 能够记录、解码、编码、编辑、推力和其他任务。
- 跨平台
编译流程
以下是基于上一个介绍的FFmepg汇编过程的概述:
- 选择编译工具
- 配置交叉编译环境
- 设定汇编参数(例如,排除所有不需要的例行程序)
- 启动编译
仅此而已,我们再试一次 看看情况如何CLANG
和GCC
两种方式来编译。
四. FFembeg的相互协调
注:撰写这篇文章的平台是Mac, 建议使用Mac或Linux来汇编, 因为Windows声称有许多洞。
安装Android NDK。
Android 的NDK
有几种不同的情况。r17c
谷歌稍后将删除。GCC
,不再支持GCC
,新版本的NDK
都是使用CLANG
进行编译。
这是最新版本NDK r20b
版本来编译。
NDK
Android-NDK是下载的 URL 。
NDK 目录
最关键的是以下两条道路:
编译工具链目录:
toolchains/llvm/prebuilt/darwin-x86_64/bin
交叉编译环境目录:
toolchains/llvm/prebuilt/darwin-x86_64/sysroot
- 编译工具路径
不同的CPU建筑领域和安多尔德不同版本不同,因此,各种叮当工具各有不同,最好根据自己的需要来选择。
对于此内容, 请选择 CPU 结构 。armv7a
Android 的版本21
:
armv7a-linux-androideabi21-clang
armv7a-linux-androideabi21-clang++
- 编译环境路径
在toolchains/llvm/prebuilt/darwin-x86_64/sysroot
目录下有两个目录 :usr/include
,usr/lib
,分别对应了头文件
和库文件
。
下载 FFmpeg 源代码
FFmpeg 在线下载可立即下载。
这是目前可用的最新版本。ffmpeg-4.2.2
。
下载一个固态源, 导航到根目录, 并查找一个名称 。congfigure
这是用于创建特定数据的 shell 脚本 。FFmpeg
汇编必要的配置文件 。
这个文件非常重要,
FFmpeg
这就是它的方式做。
我们稍后再讨论这些关键点,这是公认的FFmpeg
编译配置的关键。
FFmpeg可能建在这个基地上。
配置脚本
- 更改未来脚本
- 新增
cross_prefix_clang
参数
(注:不要双击运行)ffmpeg-4.2.2
根目录下的configure
文件,搜索CMDLINE_SET
,您可以找到下面的代码,然后添加一个新的命令行选项:cross_prefix_clang
CMDLINE_SET="
$PATHS_LIST
ar
arch
as
assert_level
build_suffix
cc
objcc
cpu
cross_prefix
新增命令行参数
cross_prefix_clang
custom_allocator
cxx
dep_cc
省略其他…
"
- 更改汇编工具的路径参数 。
搜索ar_default="${cross_prefix}${ar_default}"
, 找到以下代码
ar_default="
c
r
o
s
s
p
r
e
f
i
x
{cross_prefix}
c
r
o
s
s
p
r
e
f
i
x
{ar_default}"
cc_default="
c
r
o
s
s
p
r
e
f
i
x
{cross_prefix}
c
r
o
s
s
p
r
e
f
i
x
{cc_default}"
cxx_default="
c
r
o
s
s
p
r
e
f
i
x
{cross_prefix}
c
r
o
s
s
p
r
e
f
i
x
{cxx_default}"
nm_default="
c
r
o
s
s
p
r
e
f
i
x
{cross_prefix}
c
r
o
s
s
p
r
e
f
i
x
{nm_default}"
pkg_config_default="
c
r
o
s
s
p
r
e
f
i
x
{cross_prefix}
c
r
o
s
s
p
r
e
f
i
x
{pkg_config_default}"
将中间两行修改为
ar_default="
c
r
o
s
s
p
r
e
f
i
x
{cross_prefix}
c
r
o
s
s
p
r
e
f
i
x
{ar_default}"
#------------------------------------------------
cc_default="
c
r
o
s
s
p
r
e
f
i
x
c
l
a
n
g
{cross_prefix_clang}
c
r
o
s
s
p
r
e
f
i
x
c
l
a
n
g
{cc_default}"
cxx_default="
c
r
o
s
s
p
r
e
f
i
x
c
l
a
n
g
{cross_prefix_clang}
c
r
o
s
s
p
r
e
f
i
x
c
l
a
n
g
{cxx_default}"
#------------------------------------------------
nm_default="
c
r
o
s
s
p
r
e
f
i
x
{cross_prefix}
c
r
o
s
s
p
r
e
f
i
x
{nm_default}"
pkg_config_default="
c
r
o
s
s
p
r
e
f
i
x
{cross_prefix}
c
r
o
s
s
p
r
e
f
i
x
{pkg_config_default}"
它会在后面被排泄出来 说明它为什么变了configure
分析中详细讲解
- 新建编译配置脚本
在ffmpeg-4.2.2
根目录下新建shell
脚本,命名为:build_android_clang.sh
#!/bin/bash
set -x
A. A. A. A. A. 用于
API=21
CPU=armv7-a
#so库输出目录
OUTPUT=/Users/cxp/Desktop/FFmpeg/ffmpeg-4.2.2/android/$CPU
NDK 路径, 根据您的 NDK 位置配置
NDK=/Users/cxp/Desktop/FFmpeg/android-ndk-r20b
编译工具链路径
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
编译环境
SYSROOT=$TOOLCHAIN/sysroot
function build
{
./configure
–prefix=$OUTPU
“机器人研究笔记摘要+新鲜移动结构视频+Andre访谈王国+保理工程实时调查”
[Docs.]我不知道,qq.http://t.co/doc/DSkLaerkbnFoS0ZF
T
–target-os=android
–arch=arm
–cpu=armv7-a
–enable-asm
–enable-neon
–enable-cross-compile
–enable-shared
–disable-static
–disable-doc
–disable-ffplay
–disable-ffprobe
–disable-symver
–disable-ffmpeg
–sysroot=KaTeX parse error: Undefined control sequence: at position 9: SYSROOT ̲ ̲--cross-prefix=TOOLCHAIN/bin/arm-linux-androideabi-
–cross-prefix-clang=
T
O
O
L
C
H
A
I
N
/
b
i
n
/
a
r
m
v
7
a
−
l
i
n
u
x
−
a
n
d
r
o
i
d
e
a
b
i
TOOLCHAIN/bin/armv7a-linux-androideabi
T
O
O
L
C
H
A
I
N
/
b
i
n
/
a
r
m
v
7
a
−
l
i
n
u
x
−
a
n
d
r
o
i
d
e
a
b
i
API-
–extra-cflags="-fPIC"
make clean all
下面是关于如何使用几个处理器来编译它的细数。
make -j12
make install
}
build
例如,这种外壳脚本很容易理解。
--disabble-static
--enable-shared
禁止静态图书馆出口和动态图书馆出口;
--arch
--cpu
用于配置输出的所谓“局”是什么?
--prefix
用于配置 so-bureau 输出的存储路径 。
让我着重谈几个可能性:
- target-os
--target-os=android
:在旧版本的FFmpeg
缺乏对Android平台的支持。android
正如前面一些条款所指出的,这一目标要求安卓尔德平台的所谓主席团。configure
如果你不作出必要的调整, 你会变成这样:linux
出口所谓主席团的典型方法与Android没有相同名称,不能装载。
SLIBNAME_WITH_VERSION=’
(
S
L
I
B
N
A
M
E
)
.
(SLIBNAME).
(
S
L
I
B
N
A
M
E
)
.
(LIBVERSION)’
SLIBNAME_WITH_MAJOR=’
(
S
L
I
B
N
A
M
E
)
.
(SLIBNAME).
(
S
L
I
B
N
A
M
E
)
.
(LIBMAJOR)’
LIB_INSTALL_EXTRA_CMD=’?(RANLIB) “
(
L
I
B
D
I
R
)
/
(LIBDIR)/
(
L
I
B
D
I
R
)
/
(LIBNAME)”’
SLIB_INSTALL_NAME=’
(
S
L
I
B
N
A
M
E
W
I
T
H
V
E
R
S
I
O
N
)
′
S
L
I
B
I
N
S
T
A
L
L
L
I
N
K
S
=
′
(SLIBNAME_WITH_VERSION)' SLIB_INSTALL_LINKS='
(
S
L
I
B
N
A
M
E
W
I
T
H
V
E
R
S
I
O
N
)
′
S
L
I
B
I
N
S
T
A
L
L
L
I
N
K
S
=
′
(SLIBNAME_WITH_MAJOR) $(SLIBNAME)’
修改为:
SLIBNAME_WITH_VERSION=’
(
S
L
I
B
N
A
M
E
)
.
(SLIBNAME).
(
S
L
I
B
N
A
M
E
)
.
(LIBVERSION)’
SLIBNAME_WITH_MAJOR=’
(
S
L
I
B
P
R
E
F
)
(SLIBPREF)
(
S
L
I
B
P
R
E
F
)
(FULLNAME)-
(
L
I
B
M
A
J
O
R
)
(LIBMAJOR)
(
L
I
B
M
A
J
O
R
)
(SLIBSUF)’
LIB_INSTALL_EXTRA_CMD=’?(RANLIB)"
(
L
I
B
D
I
R
)
/
(LIBDIR)/
(
L
I
B
D
I
R
)
/
(LIBNAME)"’
SLIB_INSTALL_NAME=’
(
S
L
I
B
N
A
M
E
W
I
T
H
M
A
J
O
R
)
′
S
L
I
B
I
N
S
T
A
L
L
L
I
N
K
S
=
′
(SLIBNAME_WITH_MAJOR)' SLIB_INSTALL_LINKS='
(
S
L
I
B
N
A
M
E
W
I
T
H
M
A
J
O
R
)
′
S
L
I
B
I
N
S
T
A
L
L
L
I
N
K
S
=
′
(SLIBNAME)’
然而,该问题在最新版本的FFmpeg中得到了成功解决。 FFmpeg加入了其中。android
这个target
。
因此,我们不再需要人工改变。
。
- sysroot
--sysroot=$SYSROOT
用于建立交叉汇编环境根路径
代码编译后, 将默认从此路径进行搜索 。usr/include
usr/lib
这两种办法导致发现相关的主文件和图书馆文件。
r20b
版本的NDK
该系统的头条新闻和图书馆档案现已在线提供。$SYSYROOT/usr/include
和$SYSYROOT/usr/lib
中。
从根本上说,许多新兵在建造时将无法找到所有头条文件,导致汇编失败,因此,当没有头条时,首先检查的是这条路线。
一点疑问
在使用最新的
ndk r20b
即使一个版本没有配置,它还是被构建了。sysroot
或者你可以把它编成正确的, 作为Android嫌疑人。clang
工具是否已经处理过, 它会寻找匹配的路径 。 尚未 。configure
文件中找到原因。
如果有人知道这件事 他们会告诉你的
说到sysroot
我必须加上另一个变数。-isysyroot
这一参数长期以来也使我感到困惑,因为讨论这两个参数之间联系和差异的文件很少,然而,它也造成了无法理解的汇编失败。
- extra-cflags
介绍-isysroot
之前,先看看这个extra-cflags
选项。
此选项导致编译器推出一个例外 。sysroot
对于信头以外的文件,请使用以下搜索路径:
–extra-cflags="-I$SYSROOT/usr/include"
-I 用于区分多个路径
而-isysroot
这个选项的设置是什么?
–extra-cflags="-isysroot $SYSROOT"
-isysroot
函数使后路路径成为默认页眉搜索路径。sysroot
配置路径就不再作为头文件
尽管如此,这是默认的搜索路径。库文件
默认的搜索路径。
可以看出,这两组情况相似:
–extra-cflags="-I$SYSROOT/usr/include"
约等于
–extra-cflags="-isysroot $SYSROOT"
- extra-ldflags
这个和上面的extra-cflags
可比的,只是特别定制的库文件
搜索路径,如
–extra-ldflags="-L$SYSROOT/usr/lib"
-L 用于区分多个路径的 -L
可以看到extra-cflags
extra-ldflags
结合起来可以替代sysroot
。
- cross-prefix
这个选项直译为交叉编译前缀
,表示交叉汇编工具的前缀。
经常使用此选项和另一个选项。cc
一起出现搭配使用。
这意味着什么?cc
此选项通常以两种方式配置 :
一种是只配置cross-prefix
,没有配置cc
,比如本文。
另一种是既配置cross-prefix
,又配置cc
。
比如:
–cc=KaTeX parse error: Undefined control sequence: at position 41: …ndroideabi-gcc ̲ ̲--cross-prefix=TOOLCHAIN/bin/arm-linux-androideabi-
这是两个完全不同的构件, 但它令人着迷的是,有时它们能够成功建造, 有时由于无法找到汇编链的工具而失败。
为了搞明白cross-prefix
cc
这两种选择的设置与如何使用这些选择究竟有什么关系?FFmpeg
根目录下的configure
配置脚本并查找提示。
检查未来配置脚本
注:以下分析基于ffmpeg-4. 2.Verion 2;其他版本可能改变,但逻辑不变。
- 获取用户配置选项
(注:不要双击运行)configure
首先,运行一个 shell 脚本, 以了解用户可配置的编译选项 。
搜索for opt do
,可以找到以下代码
for opt do
optval=“KaTeX parse error: Expected '}', got '#' at position 5: {opt#̲*=}" case "opt” in
–extra-ldflags=)
add_ldflags $optval
;;
–extra-ldexeflags=)
add_ldexeflags $optval
;;
–extra-ldsoflags=)
add_ldsoflags $optval
;;
–extra-ldlibflags=)
warn “The --extra-ldlibflags option is only provided for compatibility and will ben”
“removed in the future. Use --extra-ldsoflags instead.”
add_ldsoflags $optval
;;
–extra-libs=*)
add_extralibs $optval
;;
–disable-devices)
disable $INDEV_LIST
O
U
T
D
E
V
L
I
S
T
;
;
−
−
e
n
a
b
l
e
−
d
e
b
u
g
=
∗
)
d
e
b
u
g
l
e
v
e
l
=
"
OUTDEV_LIST ;; --enable-debug=*) debuglevel="
O
U
T
D
E
V
L
I
S
T
;
;
−
−
e
n
a
b
l
e
−
d
e
b
u
g
=
∗
)
d
e
b
u
g
l
e
v
e
l
=
"
optval"
;;
省略中间一些代码…
*)
optname="KaTeX parse error: Expected '}', got 'EOF' at end of input: …%=*}" optname="{optname#–}"
optname=
(
e
c
h
o
"
(echo "
(
e
c
h
o
"
optname" | sed ‘s/-/_/g’)
if is_in $optname $CMDLINE_SET; then
eval
o
p
t
n
a
m
e
=
′
optname='
o
p
t
n
a
m
e
=
′
optval’
elif is_in $optname $CMDLINE_APPEND; then
append
o
p
t
n
a
m
e
"
optname "
o
p
t
n
a
m
e
"
optval"
else
die_unknown $opt
fi
;;
esac
done
外壳脚本代码包含几种语法, 不需要挖掘, 所以可能很简单。
通过拆分循环的第一行=
无法关闭临时文件夹:%s。optval
。
除了一些不寻常的替代品, 让我们来看看最后的通配符。*)
代码的目的是连接用户配置设置和值。
比如--cpu=armv7-a
,前面三行就是把cpu
分割出来,赋值给optname
,再把optval
赋值给cpu
它完成启动。cpu
这个变量为armv7-a
。
- Android 的配置
搜索android
关键词可在以下代码中找到:
ffmpeg-4.2.2/configure
if test “$target_os” = android; then
cc_default=“clang”
fi
ar_default="
c
r
o
s
s
p
r
e
f
i
x
{cross_prefix}
c
r
o
s
s
p
r
e
f
i
x
{ar_default}"
cc_default="
c
r
o
s
s
p
r
e
f
i
x
{cross_prefix}
c
r
o
s
s
p
r
e
f
i
x
{cc_default}"
cxx_default="
c
r
o
s
s
p
r
e
f
i
x
{cross_prefix}
c
r
o
s
s
p
r
e
f
i
x
{cxx_default}"
nm_default="
c
r
o
s
s
p
r
e
f
i
x
{cross_prefix}
c
r
o
s
s
p
r
e
f
i
x
{nm_default}"
pkg_config_default="
c
r
o
s
s
p
r
e
f
i
x
{cross_prefix}
c
r
o
s
s
p
r
e
f
i
x
{pkg_config_default}"
当你配置了--target-os=android
,默认的 FFmpeg 编译器是clang
。
cc_default
其实就是配置项cc
的默认值,可以看到cc_default
在这里和cross_prefix
进行拼贴,这就是我们来这里的原因cross_prefix
是交叉兼容工具的前缀。
拼接完是这样的:
cc_defalut= T O O L C H A I N / b i n / a r m − l i n u x − a n d r o i d e a b i − TOOLCHAIN/bin/arm-linux-androideabi- T O O L C H A I N / b i n / a r m − l i n u x − a n d r o i d e a b i − cc
看下ar_default
cc_default
cxx_default
这些默认值是什么。
搜索cc_default
可以找到以下代码
ffmpeg-4.2.2/configure
ar_default=“ar”
cc_default=“gcc”
cxx_default=“g++”
host_cc_default=“gcc”
可以看到,默认的 FFmpeg 编译器是GCC
。
当你编辑Android平台的图书馆时, 因为configure
强制设置cc_default="clang"
,所以:
当你使用
GCC
您必须同时配置一个编译工具 。cc
选项,或修改configure
中的cc_default="clang"
为cc_default="gcc"
;当你使用
CLANG
您无法配置编译工具 。cc
选项。
如果你考虑一下,你会明白的cc
如果设置为低值, 它是否正确编译?
–cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc
这时cc_defalut
不就等于
cc_defalut= T O O L C H A I N / b i n / a r m − l i n u x − a n d r o i d e a b i − TOOLCHAIN/bin/arm-linux-androideabi- T O O L C H A I N / b i n / a r m − l i n u x − a n d r o i d e a b i − TOOLCHAIN/bin/arm-linux-androideabi-gcc
这条路线一定不正确!
这就要来看到底cc_default
是怎么使用的了。
cc"
可以看到,默认的 FFmpeg 编译器是GCC
。
当你编辑Android平台的图书馆时, 因为configure
强制设置cc_default="clang"
,所以:
当你使用
GCC
您必须同时配置一个编译工具 。cc
选项,或修改configure
中的cc_default="clang"
为cc_default="gcc"
;当你使用
CLANG
您无法配置编译工具 。cc
选项。
如果你考虑一下,你会明白的cc
如果设置为低值, 它是否正确编译?
–cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc
这时cc_defalut
不就等于
cc_defalut= T O O L C H A I N / b i n / a r m − l i n u x − a n d r o i d e a b i − TOOLCHAIN/bin/arm-linux-androideabi- T O O L C H A I N / b i n / a r m − l i n u x − a n d r o i d e a b i − TOOLCHAIN/bin/arm-linux-androideabi-gcc
这条路线一定不正确!
这就要来看到底cc_default
是怎么使用的了。
上一篇:u盘引导启动系统制作
相关新闻
- 2023-05-06 微pe怎么初始化U盘(微pe怎么恢复初
- 2023-05-06 Xp系统boot 进入pe(boot manager 怎么进入
- 2023-05-06 win pe修复bcdboot(pe修复系统)
- 2023-05-06 win7更新失败 pe(win7更新失败还原更
- 2023-05-06 u盘装了pe读取不了(u盘能进pe读取不
- 2023-05-06 u盘pe 发热(u盘发热烫手)
- 2023-05-06 u盘pe下看不到硬盘(u盘启动pe看不到
- 2023-05-06 pe盘 ntfs(u盘ntfs格式)
- 2023-05-06 sony笔记本进入pe模式(联想笔记本怎
- 2023-05-06 pe启动盘进不去(pe启动盘进不去系统
|
|
|
|
|
|
|
|
|
|