一:编译live555给android使用,概况
个人总结两个方法:
一:自己编写 Android.mk 或者是 CMakeLists.txt , 把源码里面的文件都加进来用ndk-build或camek编译。(工作量稍大,另一个问题是如果live555源码有更新,这里升级修改起来也不方便,本人之前即使用这种方式,csdn上有很多都是介绍使用Androd.mk方式编译,主要是live555源码比较少,依赖也不多。)
二: 根据live555 官方自身提供的编译命令,修改配置使其使用ndk交叉编译器编译。(推荐,官方版本,本篇重点介绍)
三:如果源码编译过vlc, 可以去vlc源码里面借鉴一下,vlc有大量的第三方依赖,都在自己的源码中有脚本去对这些三方依赖进行下载,修改配置,然后编译三方依赖库。所以这其实不是一个方法,拿现成的。
二:方法二:makefile 交叉编译
Ubuntu环境,最新版NDK (ndk 21)NDK 下载 | Android NDK | Android Developers
源码:Index of /liveMedia/public
解压后在源码根目录新建一个文件config.android-arm64
文件内容:(这个编译的是arm64)
NDK=/work/Android/android-ndk-r21e
TOOLCHAIN=$(NDK)/toolchains/llvm/prebuilt/linux-x86_64
API=21
SYSROOT=$(NDK)/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$(TOOLCHAIN)/bin/aarch64-linux-android-
DESTDIR=$(shell pwd)/../arm64-v8a
COMPILE_OPTS = $(INCLUDES) -m64 -fPIC -fpic -I$(SYSROOT)/usr/local/include -I. -O2 -DSOCKLEN_T=socklen_t -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -DNO_OPENSSL=1 -DNO_GETIFADDRS=1 --sysroot=$(SYSROOT)
C = c
C_COMPILER = $(TOOLCHAIN)/bin/aarch64-linux-android$(API)-clang
C_FLAGS = $(COMPILE_OPTS)
CPP = cpp
CPLUSPLUS_COMPILER = $(TOOLCHAIN)/bin/aarch64-linux-android$(API)-clang++
CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall -DBSD=1
OBJ = o
LINK = $(CPLUSPLUS_COMPILER) -o
LINK_OPTS = -static-libstdc++
CONSOLE_LINK_OPTS = $(LINK_OPTS)
LIBRARY_LINK = $(CROSS_PREFIX)ar cr
LIBRARY_LINK_OPTS =
LIB_SUFFIX = a
LIBS_FOR_CONSOLE_APPLICATION =
LIBS_FOR_GUI_APPLICATION =
EXE =
2.1需要根据环境调整的参数:
NDK: 下载解压好的NDK路径
API :android api,这里选的21
DESTDIR: 安装目录,这里设置的源码根目录下的arm64-v8a目录,这个变量类似于通常linux 软件configure --prefix 变量。
2.2 编译
然后执行命令:
#./genMakefiles android-arm64 (这一步生成特定makefile文件)
#make
#make install
在当前目录得到 arm64-v8a 目录,./arm64-v8a/usr/local/lib 下有编译好的三个静态库libBasicUsageEnvironment.a libgroupsock.a libliveMedia.a libUsageEnvironment.a(android apk上使用这些库,在另一篇blog记录)
./arm64-v8a/usr/locla/bin 下有编译好的live555 demo可执行文件,可以直接push到android设备 /data 目录下运行。放在sd卡目录下没有执行权限,所以放到/data目录下,需要root权限,如果是虚拟机最好用android6.0及一下的,可以root.
三:在android设备上验证这些demo程序
主要使用两个demo, testH264VideoStreamer 推流服务端, testRTSPClient 拉流客户端
testH264VideoStreamer 从当前目录下的文件 test.264读取数据推流,他会自动确定当前设备的ip地址,同时监听多个ip地址(一个设备可以有几个网卡多个ip),如果正常检测到ip地址运行起来有提示比如:
Play this stream using the URL "rtsp://10.129.48.91:8554/testStream", 本地回环网络是默认在监听的,可以直接 播放:rtsp://127.0.0.1:8554/testStream
同时,他需要一个 test.264文件作为源,可以从live555官方下载这个视频:Index of /liveMedia/public/264 ,或者使用ffmpeg自己重编码出一个不带B帧的视频:
#ffmpeg -i native.mp4 -vcodec libx264 -bf 0 test.264
testRTSPClient 可以拉取rtsp rtp流,给一个url参数。拉到流后会打印相关数据信息。
四 :编译流程详解
当然第一手资料得看一下官方说明,LIVE555 Streaming Media
可以在这里找到源码下载链接,以及build 编译说明等等。
How to configure and build the code on Unix (including Linux, Mac OS X, QNX, and other Posix-compliant systems)
The source code package can be found (as a ".tar.gz" file) here. Use "tar -x" and "gunzip" (or "tar -xz", if available) to extract the package; then cd to the "live" directory. Then run
./genMakefiles <os-platform>where <os-platform> is your target platform - e.g., "linux" or "solaris" - defined by a "config.<os-platform>" file. This will generate a Makefile in the "live" directory and each subdirectory. Then run "make".
- If the "make" fails, you may need to make small modifications to the appropriate "config.<os-platform>" file, and then re-run "genMakefiles <os-platform>". (E.g., you may need to add another "-I<dir>" flag to the COMPILE_OPTS definition.)
不同于一般的linux 编译安装流程,configure, make, make install .这里没有提供configure脚本,而是提供./genMakefiles 来生成makefile. 但是没有提供android的os选择,所以添加了上述自定义的config.
NDK=/work/Android/android-ndk-r21e
TOOLCHAIN=$(NDK)/toolchains/llvm/prebuilt/linux-x86_64
API=21
SYSROOT=$(NDK)/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$(TOOLCHAIN)/bin/aarch64-linux-android-
DESTDIR=$(shell pwd)/../arm64-v8a
COMPILE_OPTS = $(INCLUDES) -m64 -fPIC -fpic -I$(SYSROOT)/usr/local/include -I. -O2 -DSOCKLEN_T=socklen_t -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -DNO_OPENSSL=1 -DNO_GETIFADDRS=1 --sysroot=$(SYSROOT)
# -DNO_OPENSSL=1 这个宏定义如果不配置,会默认使用ssl, 当前环境没有ssl库的情况下就会编译出错,所以屏蔽掉ssl依赖
# -DNO_GETIFADDRS=1 API 21的工具没有相关函数,所以屏蔽
C = c
#c ,指的是.c 文件扩展名,非c编译器
C_COMPILER = $(TOOLCHAIN)/bin/aarch64-linux-android$(API)-clang
#C_COMPILER ,c文件编译器,使用clang
C_FLAGS = $(COMPILE_OPTS)
CPP = cpp
#同样,cpp指的是 .cpp扩展名
CPLUSPLUS_COMPILER = $(TOOLCHAIN)/bin/aarch64-linux-android$(API)-clang++
#c++ 编译器
CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall -DBSD=1
OBJ = o
LINK = $(CPLUSPLUS_COMPILER) -o
#LINK 编译可执行程序demo的命令,编译+连接 -o 后面加可执行程序的名称
LINK_OPTS = -static-libstdc++
#编译连接可执行程序 的选项,对于android 这里 -static-libstdc++ 表示对c++库使用静态的连接,不然默认使用动态库,在设备上运行的时候会 dlopen c++.so erro。
CONSOLE_LINK_OPTS = $(LINK_OPTS)
LIBRARY_LINK = $(CROSS_PREFIX)ar cr
#制作库的命令, ar 命令, cr是参数。
LIBRARY_LINK_OPTS =
LIB_SUFFIX = a
#静态库 .a
LIBS_FOR_CONSOLE_APPLICATION =
LIBS_FOR_GUI_APPLICATION =
EXE =
理解这里,编译armeabi-v7a 也可以修改一下工具链路径制作一个config, 主要是上面的 CROSS_PREFIX=$(TOOLCHAIN)/bin/aarch64-linux-android- 改为32位的路径,更详细的编译流程在make的时候都有打印