librtmp-Android

原文地址:https://juejin.cn/post/6844904000542736392
RTMPDump 用来处理 RTMP 流媒体的开源工具包。能够单独使用 RTMP 通信,也可以集成到 FFmpeg 中通过 FFmpeg 接口来使用 RTMPDump。

下载地址:http://rtmpdump.mplayerhq.hu/

介绍两种方式引入 RTMPDump 的方式,一种使用 NDK 提供的交叉编译工具来进行编译成静态库再引入,第二种源码集成。实际场景中可自行选择,如果源码不多的情况下推荐使用源码集成的方式。不过有时候我们需要大量引入 C/C++ 库,这个时候还是考虑使用静态库的方式,这样源文件就不显得很多。

....

# 编译工具 gcc, 但是我在用 mac 时会使用 clang 替代,具体看我后面编译脚本。
CC=$(CROSS_COMPILE)gcc
# 链接器
LD=$(CROSS_COMPILE)ld

# 目标系统
SYS=posix
#SYS=mingw

# Openssl 加密,因为 RTMP 流媒体协议支持双向加密
CRYPTO=OPENSSL
#CRYPTO=POLARSSL
#CRYPTO=GNUTLS
LIBZ=-lz
LIB_GNUTLS=-lgnutls -lhogweed -lnettle -lgmp $(LIBZ)
LIB_OPENSSL=-lssl -lcrypto $(LIBZ)
LIB_POLARSSL=-lpolarssl $(LIBZ)
CRYPTO_LIB=$(LIB_$(CRYPTO))
DEF_=-DNO_CRYPTO
CRYPTO_DEF=$(DEF_$(CRYPTO))

DEF=-DRTMPDUMP_VERSION=\"$(VERSION)\" $(CRYPTO_DEF) $(XDEF)
OPT=-O2
# 编译参数 XCFLAGS 会从外部指定.
CFLAGS=-Wall $(XCFLAGS) $(INC) $(DEF) $(OPT)
LDFLAGS=-Wall $(XLDFLAGS)

......

LIBRTMP=librtmp/librtmp.a
INCRTMP=librtmp/rtmp_sys.h librtmp/rtmp.h librtmp/log.h librtmp/amf.h

......

PROGS=rtmpdump rtmpgw rtmpsrv rtmpsuck

# 依赖两个目标:LIBRTMP 和 PROGS, 由于我们生成的是 Android 平台,所以这里我们不关心 PROGS,后面我会删掉这个目标。
all:    $(LIBRTMP) $(PROGS)

$(PROGS): $(LIBRTMP)

# 安装,创建文件、复制文件到指定目录
install:    $(PROGS)
    -mkdir -p $(BINDIR) $(SBINDIR) $(MANDIR)/man1 $(MANDIR)/man8
    cp rtmpdump$(EXT) $(BINDIR)
    cp rtmpgw$(EXT) rtmpsrv$(EXT) rtmpsuck$(EXT) $(SBINDIR)
    cp rtmpdump.1 $(MANDIR)/man1
    cp rtmpgw.8 $(MANDIR)/man8
    @cd librtmp; $(MAKE) install

clean:
    rm -f *.o rtmpdump$(EXT) rtmpgw$(EXT) rtmpsrv$(EXT) rtmpsuck$(EXT)
    @cd librtmp; $(MAKE) clean

FORCE:

# 执行 librtmp 目录下的 Makefile 文件.
$(LIBRTMP): FORCE
    @cd librtmp; $(MAKE) all

# 调用编译器编译生成 rtmpdump.o
rtmpdump: rtmpdump.o
    $(CC) $(LDFLAGS) -o $@$(EXT) [email protected] $(LIBS)

....

librtmp 目录下的 Makefile.

......

# CC 编译器
CC=$(CROSS_COMPILE)gcc
# 链接器
LD=$(CROSS_COMPILE)ld
# ar 打包
AR=$(CROSS_COMPILE)ar

# 目标系统
SYS=posix
# OPENSSL 加密.
CRYPTO=OPENSSL
#CRYPTO=GNUTLS
DEF_POLARSSL=-DUSE_POLARSSL
DEF_OPENSSL=-DUSE_OPENSSL
DEF_GNUTLS=-DUSE_GNUTLS
DEF_=-DNO_CRYPTO
REQ_GNUTLS=gnutls,hogweed,nettle
REQ_OPENSSL=libssl,libcrypto
PUB_GNUTLS=-lgmp
LIBZ=-lz
LIBS_posix=
LIBS_darwin=
LIBS_mingw=-lws2_32 -lwinmm -lgdi32
LIB_GNUTLS=-lgnutls -lhogweed -lnettle -lgmp $(LIBZ)
LIB_OPENSSL=-lssl -lcrypto $(LIBZ)
LIB_POLARSSL=-lpolarssl $(LIBZ)
PRIVATE_LIBS=$(LIBS_$(SYS))
CRYPTO_LIB=$(LIB_$(CRYPTO)) $(PRIVATE_LIBS)
CRYPTO_REQ=$(REQ_$(CRYPTO))
CRYPTO_DEF=$(DEF_$(CRYPTO))
PUBLIC_LIBS=$(PUB_$(CRYPTO))

......

SHARED=yes
......

DEF=-DRTMPDUMP_VERSION=\"$(VERSION)\" $(CRYPTO_DEF) $(XDEF)
OPT=-O2
CFLAGS=-Wall $(XCFLAGS) $(INC) $(DEF) $(OPT) $(SO_DEF)
LDFLAGS=$(XLDFLAGS)


OBJS=rtmp.o log.o amf.o hashswf.o parseurl.o

# 生成 librtmp.a 以及动态库
all:    librtmp.a $(SO_LIB)

clean:
    rm -f *.o *.a *.$(SOX) *$(SO_EXT) librtmp.pc

# 目标依赖于 OBJS
librtmp.a: $(OBJS)
    $(AR) rs $@ $?

librtmp$(SO_EXT): $(OBJS)
    $(CC) $(SO_LDFLAGS) $(LDFLAGS) -o $@ $^ $> $(CRYPTO_LIB)
    ln -sf $@ librtmp.$(SOX)

# 生成目标的规则.
log.o: log.c log.h Makefile
rtmp.o: rtmp.c rtmp.h rtmp_sys.h handshake.h dh.h log.h amf.h Makefile
amf.o: amf.c amf.h bytes.h log.h Makefile
hashswf.o: hashswf.c http.h rtmp.h rtmp_sys.h Makefile
parseurl.o: parseurl.c rtmp.h rtmp_sys.h log.h Makefile

librtmp.pc: librtmp.pc.in Makefile
    sed -e "s;@prefix@;$(prefix);" -e "s;@libdir@;$(libdir);" \
        -e "s;@VERSION@;$(VERSION);" \
        -e "s;@CRYPTO_REQ@;$(CRYPTO_REQ);" \
        -e "s;@PUBLIC_LIBS@;$(PUBLIC_LIBS);" \
        -e "s;@PRIVATE_LIBS@;$(PRIVATE_LIBS);" librtmp.pc.in > $@

install:    install_base $(SO_INST)

install_base:   librtmp.a librtmp.pc
    -mkdir -p $(INCDIR) $(LIBDIR)/pkgconfig $(MANDIR)/man3 $(SODIR)
    cp amf.h http.h log.h rtmp.h $(INCDIR)
    cp librtmp.a $(LIBDIR)
    cp librtmp.pc $(LIBDIR)/pkgconfig
    cp librtmp.3 $(MANDIR)/man3
    
......


整体流程大概分析一下,告诉了我们编译规则和依赖,以及安装目录。那么接下来编写 NDK 交叉编译脚本,基于 Mac 平台编写,linux 更改一下工具链位置。

#!/bin/bash
# 将NDK的路径替换成你自己的NDK路径
NDK_ROOT=/Users/liangchuanfei/Documents/Android/SDK/android-ndk-r16b

# 设置工具链mac苹果电脑的是darwin-x86_64 而如果是linux的话则是linux-x86_64

TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64

CPU=arm-linux-androideabi

export XCFLAGS="-isysroot $NDK_ROOT/sysroot -isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security  -O0 -fPIC"
export XLDFLAGS="--sysroot=${NDK_ROOT}/platforms/android-21/arch-arm "
export CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi-

# XDEF=-DNO_SSL 的意思是不实用SSL,因为rtmp内部使用了SSL,如果开启的话需要编译链接SSL的库
make install SYS=android prefix=`pwd`/install CRYPTO= SHARED=  XDEF=-DNO_SSL

然后增加执行权限:

chmod +x build_rtmp.sh

编译错误:

解: 把rtmpdump.c文件的宏定义 ftello64 和 fseeko64 注释调了


测试

add_library(rtmp STATIC IMPORTED)
set_target_properties(rtmp PROPERTIES IMPORTED_LOCATION /xx/librtmp.a)

CMakeList.txt 添加静态库


你可能感兴趣的:(librtmp-Android)