《<一 编译> ndk 编译live555 for android》
《<二:使用,接收端> android NDK使用live555+Mediacodec播放RTSP视频流》
《<三:使用,接收端>live555--接收端 testRTSPClient.cpp 源码分析-读取rtsp流demo》
《<二:使用 ,接收端>live555 拉流 udp 重排序》
《<三:使用,推流端>live555-从buffer读取h264推流》
《修改live555支持从缓冲区读取h264帧 (纠正下是 h264 slice)》
《<三:使用,推流端>live555源码分析——RTSP服务端发送数据流程》
=========================================================================
将上传到github:https://github.com/Canok7/openScreen
这里做个简短的说明:
以前有写过一篇 《android播放rtsp视频流app, demo app .使用live555+MediaCodec》,用的是 vlc里面编译出来的 live555库,然后将数据拷贝到java层,在java层用mediacode 解码渲染。
现有空给优化下,自行编译的最新版live555库+ndk native层使用mediacode直接解码渲染。
效果
用之前编译得到的 testH264VideoStreamer 作为推流端,该app作为拉流播放端,同一个设备上 127.0.0.1做测试

代码结构
api 调用live555 拉流。 参考demo testRTSPClient ,写了live555.cpp ,将取出的流放到一个queue 环形缓存队列里面。
使用NDK 提供的Mediacodec 接口,从上述 queue环形缓存队列里面取出数据进行解码+渲染。
引用live555库
用的Android.mk (CMake没用过,Android.mk用着挺好,要不知道google整这么多编译方式出来是为了解决啥问题,那天非要用的时候再look look ),先对.a文件prebuild一下。
然后一个关键点,因为使用的是c++的库,需要添加Application.mk 并在里面加上:APP_STL:c++_shared
不然各种 undefined reference,比如:
live555/arm64-v8a/usr/local/lib/libgroupsock.a(Groupsock.o):(.data.rel.ro+0xa0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info'
live555/app/src/main/jni/././live555/arm64-v8a/usr/local/lib/libgroupsock.a(Groupsock.o):(.data.rel.ro+0xb8): undefined reference to `vtable for __cxxabiv1::__class_type_info'
/data/nishome/td/xiancan.wang/share_can/AndroidStudio_demo/live555/app/src/main/jni/././live555/arm64-v8a/usr/local/lib/libgroupsock.a(Groupsock.o):(.data.rel.ro+0xc8): undefined reference to `vtable for __cxxabiv1::__si_class_type_info'
live555/app/src/main/jni/././live555/arm64-v8a/usr/local/lib/libliveMedia.a(Media.o): In function `__clang_call_terminate':
Media.cpp:(.text.__clang_call_terminate[__clang_call_terminate]+0x4): undefined reference to `__cxa_begin_catch'
Media.cpp:(.text.__clang_call_terminate[__clang_call_terminate]+0x8): undefined reference to `std::terminate()'
/live555/app/src/main/jni/././live555/arm64-v8a/usr/local/lib/libliveMedia.a(Media.o):(.data.rel.ro+0x98): undefined reference to `vtable for __cxxabiv1::__class_type_info'
/live555/app/src/main/jni/././live555/arm64-v8a/usr/local/lib/libliveMedia.a(Media.o):(.data.rel.ro+0xa8): undefined reference to `vtable for __cxxabiv1::__class_type_info'
live555/app/src/main/jni/././live555/arm64-v8a/usr/local/lib/libliveMedia.a(Media.o):(.data.rel.ro+0xb8): undefined reference to `vtable for __cxxabiv1::__class_type_info'
live555/app/src/main/jni/././live555/arm64-v8a/usr/local/lib/libliveMedia.a(Media.o):
然后逼得人在Android.mk 里面各种添加 -lc++ -lm -lz -ldl等等,又是一堆的错误。简直是,fuck android ,fuck google
AndroidStudio NDK开发【dlopen failed: library "libc++_shared.so" not found】报错解决
Android.mk:
LOCAL_PATH := $(call my-dir)
LIVE555DIR = ./live555
include $(CLEAR_VARS)
LOCAL_MODULE := live_BasicUsageEnvironment
LOCAL_SRC_FILES := ./$(LIVE555DIR)/$(TARGET_ARCH_ABI)/usr/local/lib/libBasicUsageEnvironment.a
MY_ABSULATION_DIR=$(LOCAL_PATH)/$(LIVE555DIR)
LOCAL_EXPORT_C_INCLUDES := $(MY_ABSULATION_DIR)/ \
$(MY_ABSULATION_DIR)/$(TARGET_ARCH_ABI)/usr/local/include \
$(MY_ABSULATION_DIR)/$(TARGET_ARCH_ABI)/usr/local/include/BasicUsageEnvironment \
$(MY_ABSULATION_DIR)/$(TARGET_ARCH_ABI)/usr/local/include/groupsock \
$(MY_ABSULATION_DIR)/$(TARGET_ARCH_ABI)/usr/local/include/liveMedia \
$(MY_ABSULATION_DIR)/$(TARGET_ARCH_ABI)/usr/local/include/UsageEnvironment
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := live_groupsock
LOCAL_SRC_FILES := ./$(LIVE555DIR)/$(TARGET_ARCH_ABI)/usr/local/lib/libgroupsock.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := live_liveMedia
LOCAL_SRC_FILES := ./$(LIVE555DIR)/$(TARGET_ARCH_ABI)/usr/local/lib/libliveMedia.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := live_UsageEnvironment
LOCAL_SRC_FILES := ./$(LIVE555DIR)/$(TARGET_ARCH_ABI)/usr/local/lib/libUsageEnvironment.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := live555player
LOCAL_SRC_FILES := live555player_jni.cpp
LOCAL_SRC_FILES += queue.cpp
LOCAL_SRC_FILES += live555/live555.cpp
LOCAL_SRC_FILES += mediacodec/Decoder.cpp
LOCAL_CFLAGS += -DNO_OPENSSL=1
LOCAL_STATIC_LIBRARIES := live_liveMedia live_groupsock live_UsageEnvironment live_BasicUsageEnvironment
#LOCAL_LDLIBS := -lmediandk -llog -landroid -static-libstdc++ #报错,libstdc++.a 里面又有未定义的符号
#LOCAL_LDLIBS := -lmediandk -llog -landroid -static-libc++ #报错,不支持这个参数
#LOCAL_LDLIBS := -lmediandk -llog -landroid -lc++ #运行起来后 无法加载libc++.so
#LOCAL_LDLIBS := -Wl,-Bdynamic -lmediandk -llog -landroid -Wl,-Bstatic -lc++ -lc -Wl,/data/nishome/td/xiancan.wang/Android/Sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/21/crtbegin_static.o
#LOCAL_LDLIBS := -Wl,-Bdynamic -lmediandk -llog -landroid
#LOCAL_LDLIBS += -Wl,-Bstatic -lc++ -lc -lcompiler_rt-extras -ldl -lm -lz
LOCAL_LDLIBS := -lmediandk -llog -landroid
LOCAL_MODULE_TAGS := optional
include $(BUILD_SHARED_LIBRARY)
Application.mk
APP_PLATFORM := android-21
#下面这个配置非常重要,不然由于c++库的问题,各种标准库链接符号问题。。。
APP_STL := c++_shared
APP_ABI :=arm64-v8a
#APP_ABI +=armeabi
#APP_ABI +=armeabi-v7a
APP_CPPFLAGS += -Wno-error=format-security