《<一 編譯> 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