title: LibRTMP_Demo
date: 2017-06-13 15:40:15
tags: 學習
categories: android
[TOC]
LibRtmp編譯并導入Android Studio
簡介
做了好久的推流項目,但是沒有接觸過底層知識湿刽,所以只是相當于SDK的使用者。在工作不忙的時候银择,突然間想學一學LibRtmp郊丛。不求能完全學會博投,只希望能自己編譯出一個可以推流的庫损离。
編譯環(huán)境
- LibRtmp編譯
Ubuntu 虛擬機:36~16.04.1-Ubuntu SMP Sun Feb 5 09:39:41 UTC 2017 i686 i686 i686 GNU/Linux
Android NDK:android-ndk-r10e哼审,這里注意:我的系統(tǒng)是32位的碘耳,所以這個也是32位的
- 導入Android Studio
- Android Studio:版本2.3
- 需要下載SDK Tools中的 CMake,LLDB,NDK.
LibRtmp的編譯
編譯步驟
保證你虛擬機中搭建了完整的環(huán)境显设,可以先編譯NDK中的Demo試試
-
編譯LibRtmp需要linux中安裝了Openssl。
安裝openssl sudo apt-get install openssl sudo apt-get install libssl-dev
需要注意: 我的ubuntu安裝完成后辛辨,openssl在/var/include/openssl中捕捂。執(zhí)行命令
: openssl version
OpenSSL 1.0.2g 1 Mar 2016
- 下載librtmp
mkdir librtmp #選擇創(chuàng)建自己的目錄
git clone git://git.ffmpeg.org/rtmpdump
- 配置編譯環(huán)境。這一步主要是復制NDK中一些編譯腳本到特定的位置斗搞。
/home/xiaoqiang/android-ndk-r10e/build/tools/make-standalone-toolchain.sh
--toolchain=arm-linux-androideabi-4.9 --platform=android-14
--install-dir=/home/xiaoqiang/workspace/librtmp/utils
- 設置環(huán)境變量指攒。把之前復制的腳本統(tǒng)一加入環(huán)境變量中
export PATH=/home/xiaoqiang/workspace/librtmp/utils/bin:$PATH
**
到了這一步,說明你的編譯環(huán)境已經(jīng)OK了僻焚。接下來開始編譯工作允悦。
編譯LibRtmp需要先編譯polarssl,所以我們開始polarssl的下載和編譯工作
**
- 下載polarssl并且做一個小改動
tar -zxvf polarssl-1.2.14-gpl.tgz #我下載的版本是1.2.14。
#改動
cd include/polarssl/config.h
#去掉 POLARSSL_HAVEGE_C 的注釋
#define POLARSSL_HAVEGE_C
- polarssl編譯
1. 首先進入polarssl的目錄中
2. 執(zhí)行編譯命令
make CC=arm-linux-androideabi-gcc APPS=
3. 執(zhí)行安裝命令
make install DESTDIR=/home/xiaoqiang/workspace/librtmp/utils/sysroot
注意
1. 如果提示 arm-linux-androideabi-gcc 命令找不到虑啤,重復4隙弛,5步驟試試。如果還不行狞山,可以使用絕對路徑(其他大神說的驶鹉。我沒有出現(xiàn)這個問題)
2.安裝位置,必須是4铣墨,5步驟中設定的位置室埋。否則會在編譯中提示:
error: cannot find -lpolarssl
我解決第二個問題解決了好久,一直搞不明白
- 編譯靜態(tài)庫
make SYS=android CROSS_COMPILE=arm-linux-androideabi- INC="-I/home/xiaoqiang/workspace/librtmp/utils/sysroot/include" CRYPTO=POLARSSL
9.編譯共享庫
make SYS=android CROSS_COMPILE=arm-linux-androideabi- INC="-I/home/xiaoqiang/workspace/librtmp/utils/sysroot/include" CRYPTO=POLARSSL SHARED=
注意
1.我成功編譯出了librtmp.a文件。但是在編譯.so的時候出現(xiàn)了問題姚淆。并沒有成功生成孕蝉,也沒有任何的提示。
可能的原因是:
網(wǎng)上有大神說是需要加入-shared參數(shù)
我找到所有的MAKEFILE文件腌逢,然后在LD_FLAGS參數(shù)后面加入了-shared降淮。
很遺憾沒有成功。
通過ndk-build編譯共享庫
參考大神博客:http://blog.csdn.net/a992036795/article/details/54377892
- 編寫兩個Android.mk文件
- 在rtmpdump目錄中搏讶,文件內(nèi)容如下
LOCAL_PATH := $(call my-dir) subdirs := $(addprefix $(LOCAL_PATH)/,$(addsuffix /Android.mk, \ librtmp \ )) SSL := /home/blueberry/developer/android_tools/armeabi-4.9/sysroot ifndef SSL $(error "You must define SSL before starting") endif include $(subdirs)
- 在rtmpdump/librtmp目錄中佳鳖,新建一個Android.md文件。內(nèi)容如下
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := polarssl LOCAL_EXPORT_C_INCLUDES := $(SSL)/include LOCAL_SRC_FILES := $(SSL)/lib/libpolarssl.a include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_C_INCLUDES += $(NDK_PROJECT_PATH)/librtmp \ $(SSL)/include LOCAL_SRC_FILES:= \ amf.c \ hashswf.c \ log.c \ parseurl.c \ rtmp.c LOCAL_STATIC_LIBRARIES = polarssl LOCAL_CFLAGS += -I$(SSL)/include -DUSE_POLARSSL LOCAL_LDLIBS += -L$(SSL)/lib -L$(SSL)/usr/lib LOCAL_LDLIBS += -lz LOCAL_MODULE := librtmp include $(BUILD_SHARED_LIBRARY)
- 新建jni/Application.mk文件媒惕。內(nèi)容如下
NDK_TOOLCHAIN_VERSION := 4.9 APP_PLATFORM := android-21 APP_CPPFLAGS += -DANDROID APP_ABI := armeabi-v7a APP_PROJECT_PATH := $(shell pwd) APP_BUILD_SCRIPT := $(APP_PROJECT_PATH)/Android.mk
導入Android Studio
- 新建一個Android項目系吩,注意選擇include c++ support。
- 運行demo,看看你的環(huán)境是不是OK的妒蔚。在我這邊是直接可以運行的穿挨。demo中SO也動態(tài)替我編譯出來了
- 復制編譯出來的librtmp.so到libs目錄下。
在build.gradle中增加如下配置肴盏。
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
-
在cpp目錄下新建一個include目錄科盛。并吧需要用到的rtmp頭文件拷貝進去。最終目錄結構如下圖
image 打開CMakeLists.txt文件菜皂,增加關于librtmp的配置
1.add RTMP庫
add_library( rtmp-lib
SHARED
IMPORTED)
2. 設置RTMP庫位置
set_target_properties( # Specifies the target library.
rtmp-lib
# Specifies the parameter you want to define.
PROPERTIES IMPORTED_LOCATION
# Provides the path to the library you want to import.
/Users/xiaoqiang/workspace/codec/workspace/RtmpDemo/app/libs/${ANDROID_ABI}/librtmp.so )
3. 增加頭文件位置贞绵。這樣就可以代碼提示,如果沒有代碼提示真的寫不習慣程序
include_directories( src/main/cpp/include )
注意:第二部設定的位置恍飘,必須是絕對路徑但壮,不能是相對路徑,負責會報錯
6.引用librtmp庫
target_link_libraries( # Specifies the target library.
native-lib
rtmp-lib # 這里就是使用libRTMP
# Links the target library to the log library
# included in the NDK.
${log-lib} )
- 在build.gradle中增加ndk的設定
defaultConfig {
XXXXXXXX
ndk {
abiFilters 'armeabi-v7a'
}
}
8.增加測試代碼
在手機中運行常侣。很好蜡饵,沒有崩潰!8焓K莼觥!
代碼已經(jīng)上傳到github.在后期我可能會進行其他的改動N杷痢焦辅!