<一 编译> ndk 编译live555 for android

一:编译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的时候都有打印

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值