天天看點

<二:使用,接收端> android NDK使用live555+Mediacodec播放RTSP視訊流

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

<二:使用,接收端> android NDK使用live555+Mediacodec播放RTSP視訊流
<二:使用,接收端> android NDK使用live555+Mediacodec播放RTSP視訊流

代碼結構 

api 調用live555 拉流。 參考demo   testRTSPClient  ,寫了live555.cpp ,将取出的流放到一個queue 環形緩存隊列裡面。

使用NDK 提供的Mediacodec 接口,從上述 queue環形緩存隊列裡面取出資料進行解碼+渲染。

<二:使用,接收端> android NDK使用live555+Mediacodec播放RTSP視訊流

引用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
           

繼續閱讀