LibRtmp編譯并導入Android Studio


title: LibRTMP_Demo
date: 2017-06-13 15:40:15
tags: 學習
categories: android


[TOC]

LibRtmp編譯并導入Android Studio

簡介

做了好久的推流項目,但是沒有接觸過底層知識湿刽,所以只是相當于SDK的使用者。在工作不忙的時候银择,突然間想學一學LibRtmp郊丛。不求能完全學會博投,只希望能自己編譯出一個可以推流的庫损离。

編譯環(huán)境

  • LibRtmp編譯
    1. Ubuntu 虛擬機:36~16.04.1-Ubuntu SMP Sun Feb 5 09:39:41 UTC 2017 i686 i686 i686 GNU/Linux

    2. Android NDK:android-ndk-r10e哼审,這里注意:我的系統(tǒng)是32位的碘耳,所以這個也是32位的

  • 導入Android Studio
    1. Android Studio:版本2.3
    2. 需要下載SDK Tools中的 CMake,LLDB,NDK.

LibRtmp的編譯

編譯步驟

  1. 保證你虛擬機中搭建了完整的環(huán)境显设,可以先編譯NDK中的Demo試試

  2. 編譯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
  1. 下載librtmp
mkdir librtmp #選擇創(chuàng)建自己的目錄
git clone git://git.ffmpeg.org/rtmpdump
  1. 配置編譯環(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
  1. 設置環(huán)境變量指攒。把之前復制的腳本統(tǒng)一加入環(huán)境變量中
export PATH=/home/xiaoqiang/workspace/librtmp/utils/bin:$PATH

**
到了這一步,說明你的編譯環(huán)境已經(jīng)OK了僻焚。接下來開始編譯工作允悦。

編譯LibRtmp需要先編譯polarssl,所以我們開始polarssl的下載和編譯工作
**

  1. 下載polarssl并且做一個小改動
tar -zxvf polarssl-1.2.14-gpl.tgz #我下載的版本是1.2.14。
#改動

cd include/polarssl/config.h
#去掉 POLARSSL_HAVEGE_C 的注釋

#define POLARSSL_HAVEGE_C
  1. 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

我解決第二個問題解決了好久,一直搞不明白
  1. 編譯靜態(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文件
    1. 在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)
    
    1. 在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)
    
    1. 新建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

  1. 新建一個Android項目系吩,注意選擇include c++ support。
  2. 運行demo,看看你的環(huán)境是不是OK的妒蔚。在我這邊是直接可以運行的穿挨。demo中SO也動態(tài)替我編譯出來了
  3. 復制編譯出來的librtmp.so到libs目錄下。
在build.gradle中增加如下配置肴盏。
   sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
  1. 在cpp目錄下新建一個include目錄科盛。并吧需要用到的rtmp頭文件拷貝進去。最終目錄結構如下圖


    image
  2. 打開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} )
  1. 在build.gradle中增加ndk的設定
defaultConfig {
      XXXXXXXX
        ndk {
            abiFilters 'armeabi-v7a'
        }
    }

8.增加測試代碼


image

在手機中運行常侣。很好蜡饵,沒有崩潰!8焓K莼觥!

代碼已經(jīng)上傳到github.在后期我可能會進行其他的改動N杷痢焦辅!

代碼位置:https://github.com/wang12/RTMPDemo.git

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市椿胯,隨后出現(xiàn)的幾起案子筷登,更是在濱河造成了極大的恐慌,老刑警劉巖哩盲,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件前方,死亡現(xiàn)場離奇詭異狈醉,居然都是意外死亡,警方通過查閱死者的電腦和手機惠险,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門苗傅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人班巩,你說我怎么就攤上這事渣慕。” “怎么了抱慌?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵逊桦,是天一觀的道長。 經(jīng)常有香客問我抑进,道長强经,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任单匣,我火速辦了婚禮,結果婚禮上宝穗,老公的妹妹穿的比我還像新娘户秤。我一直安慰自己,他們只是感情好逮矛,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布鸡号。 她就那樣靜靜地躺著,像睡著了一般须鼎。 火紅的嫁衣襯著肌膚如雪鲸伴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天晋控,我揣著相機與錄音汞窗,去河邊找鬼。 笑死赡译,一個胖子當著我的面吹牛仲吏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蝌焚,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼裹唆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了只洒?” 一聲冷哼從身側響起许帐,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎毕谴,沒想到半個月后成畦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體距芬,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年羡鸥,在試婚紗的時候發(fā)現(xiàn)自己被綠了蔑穴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡惧浴,死狀恐怖存和,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情衷旅,我是刑警寧澤捐腿,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站柿顶,受9級特大地震影響茄袖,放射性物質發(fā)生泄漏。R本人自食惡果不足惜嘁锯,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一宪祥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧家乘,春花似錦蝗羊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至业崖,卻和暖如春野芒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背双炕。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工狞悲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人妇斤。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓效诅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親趟济。 傳聞我的和親對象是個殘疾皇子乱投,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容