你好。
我已经决定,我想从Android的源代码生成FFmpeg库。而且,是的,你可以想象这似乎并不那么容易。但最后我做到了!(至少我没有编译错误),我想和你分享我的方法。
首先是事情
获取Linux和VirtualBox
我使用Linux Mint 18.2“Sonya” -最新版本的VirtualBox上的Cinnamon(64位)。
然后我使用终端在这个Linux上安装了git,命令如下:
1
2
3
|
sudo
apt
-
get
install
git
-
y
|
源代码
当你有git时,你可以用这个命令克隆源代码:
1
2
3
|
git
clone
"/"
ffmpeg
|
现在你需要Android NDK。在我的情况下,这是android-ndk-r15c-linux-x86_64。下载并解压缩android-ndk-r15c-linux-x86_64.zip文件。
建造
当你为Linux构建时,这很容易。只需输入标准./configure,make,make install。在为Android构建时,您需要为配置脚本提供其他设置。这就是为什么像这样创建构建脚本是个好主意:
build_ffmpeg.sh
1
2
3
4
|
.
/
configure
--
cross
-
prefix
=
arm
-
linux
-
androideabi
-
--
sysroot
=
"/home/alien/Desktop/android-ndk-r15c/sysroot"
--
target
-
os
=
linux
--
arch
=
arm
--
cpu
=
cortex
-
a8
--
enable
-
cross
-
compile
--
enable
-
pic
--
enable
-
shared
--
extra
-
cflags
=
"-fpic"
make
|
请记住,你应该在android-ndk-r15c-linux-x86_64中设置--sysroot路径到sysroot文件夹。在我的情况下,路径是:/ home / alien / Desktop / android-ndk-r15c / sysroot。将此脚本放在ffmpeg文件夹中。然后使用chmod + x build_ffmpeg.sh将可执行文件添加到文件中。最后输入:./build_ffmpeg.sh来运行脚本。
问题#1
运行脚本后,我得到这个:
arm-linux-androideabi-gcc无法创建一个可执行文件。
C编译器测试失败。
如果你认为配置出了问题,确保你使用的是Git的最新版本。如果最新版本失败,请将问题报告给上的ffmpeg-user@邮件列表或IRC #ffmpeg。包含由configure生成的日志文件“ffbuild / ”,这将有助于解决问题。
解决方案是通过键入以下命令来安装gcc-arm-linux-androideabi:
1
2
3
|
sudo
apt
install
gcc
-
arm
-
linux
-
androideabi
-
y
|
问题#2
重新运行脚本后,我得到这个:
libavcodec / :函数'search_for_ms':
libavcodec / :803:25:错误:预期的标识符或'('数字常量之前
libavcodec / : 865:28:错误:作为赋值语句
libavcodec / 的左操作数所需的左值:866:25:错误:'B1'未声明(在此函数中首次使用)
libavcodec / :866:25:标识符只报告
ffbuild / 中出现的每个函数一次:60:目标配方libavcodec / 失败
make:[libavcodec / ]错误1
这里是疯狂的东西在中唯一重要的行是803。其余的错误是第一个错误的结果。编译器抱怨的是这样的:
1
2
3
|
int
B0
=
0
,
B1
=
0
;
|
没有看到任何错误?我也是!因为这是正确的。这里的代码是可以的。问题在文件/usr/arm-linux-androideabi/include/asm/中。它在第116行包含丑陋的#define:
1
2
3
|
#define B0 0000000
|
现在,如果我们根据这个#define从重写行,我们会得到这个:
1
2
3
|
int
0000000
=
0
,
B1
=
0
;
|
显然这是错的。这就是为什么编译器预期标识符(但得到号码0000000)。这通过包含头文件的顺序发生:
ffmpeg / libavcodec / 文件包括:
libavcodec / 文件包括:
libavutil / 文件包括:
libavutil / 文件包括:
libavutil / 文件包含:
libavutil / 文件包括:
libavutil / 文件包括:
/usr/arm-linux-androideabi/include/sys/文件包括:
/ usr / arm-linux-androideabi / include / asm / termbits .h
我不知道如何解决这个问题,所以我只是做了很简单的修复。我用B0取代了B0的每一个出现在中键入b0并键入make。它帮助。
问题3
但这还不是全部。同样的问题导致这个错误:
libavcodec / hevc_mvs.c:函数'derive_spatial_merge_candidates':
libavcodec / hevc_mvs.c:368:23:错误:'y0000000'未声明(首次在此函数中使用)
libavcodec / hevc_mvs.c:368:23 :注意:每个未声明的标识符只会在
libavcodec / hevc_mvs.c中显示的每个函数报告一次:368:23:error:'x0000000'未声明(在此函数中首次使用)
libavcodec / hevc_mvs.c:函数'ff_hevc_luma_mv_mvp_mode' :
libavcodec / hevc_mvs.c:683:24:错误:'y0000000'未声明(首次在此函数中使用)
libavcodec / hevc_mvs.c:683:24:错误:'x0000000'未声明(首次在此函数中使用)
ffbuild / :60:目标'libavcodec / hevc_mvs.o'的配方失败
解决方案在这里是一样的。在hevc_mvs.c中用b0代替B0,然后输入make。问题#4 同样的故事在这里:libavcodec / opus_pvq.c:函数'quant_band_template': libavcodec / opus_pvq.c:499:9:错误:期望的标识符或'('数字常量之前 libavcodec / opus_pvq.c:560:12:错误:作为赋值左操作数所需的左值 ffbuild / :60:目标'libavcodec / opus_pvq.o'的配方失败 make:*** [libavcodec / opus_pvq.o]错误1
更换B0由B0在opus_pvq.c和类型做出。
问题#5
跆拳道?!中 ???
doc / print_options.c:26:19:致命错误::没有这样的文件或目录
编译终止。
ffbuild / :152:目标'doc / print_options.o'的配方失败
make:*** [doc / print_options.o]错误1 Ooops
。看来我已经忘记了Linux的构建要领。要安装这种类型:
1
2
3
|
sudo
apt
-
get
install
build
-
essential
-
y
|
而且,当然,再次制造。
有用!
或者,至少看起来如此。没有更多的错误,在ffmpeg的子文件夹中,您可以找到* .a文件,这些文件是像这样的静态库。
如果你发现同样的错误,我希望这篇文章给你至少一个提示如何解决或在哪里寻找问题。