LibRtmp编译并导入Android Studio


title: LibRTMP_Demo
date: 2017-06-13 15:40:15
tags: 学习
categories: android


[TOC]

LibRtmp编译并导入Android Studio

简介

做了好久的推流项目,但是没有接触过底层知识,所以只是相当于SDK的使用者。在工作不忙的时候,突然间想学一学LibRtmp。不求能完全学会,只希望能自己编译出一个可以推流的库。

编译环境

  • 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,这里注意:我的系统是32位的,所以这个也是32位的

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

LibRtmp的编译

编译步骤

  1. 保证你虚拟机中搭建了完整的环境,可以先编译NDK中的Demo试试

  2. 编译LibRtmp需要linux中安装了Openssl。

    安装openssl
    sudo apt-get install openssl
    sudo apt-get install libssl-dev
    

需要注意: 我的ubuntu安装完成后,openssl在/var/include/openssl中。执行命令

 : openssl version
  OpenSSL 1.0.2g  1 Mar 2016
  1. 下载librtmp
mkdir librtmp #选择创建自己的目录
git clone git://git.ffmpeg.org/rtmpdump
  1. 配置编译环境。这一步主要是复制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. 设置环境变量。把之前复制的脚本统一加入环境变量中
export PATH=/home/xiaoqiang/workspace/librtmp/utils/bin:$PATH

**
到了这一步,说明你的编译环境已经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. 执行编译命令
make CC=arm-linux-androideabi-gcc APPS=
3. 执行安装命令
make install DESTDIR=/home/xiaoqiang/workspace/librtmp/utils/sysroot

注意

1. 如果提示 arm-linux-androideabi-gcc 命令找不到,重复4,5步骤试试。如果还不行,可以使用绝对路径(其他大神说的。我没有出现这个问题)
2.安装位置,必须是4,5步骤中设定的位置。否则会在编译中提示:
error: cannot find -lpolarssl

我解决第二个问题解决了好久,一直搞不明白
  1. 编译静态库
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的时候出现了问题。并没有成功生成,也没有任何的提示。

可能的原因是:
网上有大神说是需要加入-shared参数
我找到所有的MAKEFILE文件,然后在LD_FLAGS参数后面加入了-shared。
很遗憾没有成功。

通过ndk-build编译共享库

参考大神博客:http://blog.csdn.net/a992036795/article/details/54377892

  • 编写两个Android.mk文件
    1. 在rtmpdump目录中,文件内容如下
    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文件。内容如下
      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文件。内容如下
      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,看看你的环境是不是OK的。在我这边是直接可以运行的。demo中SO也动态替我编译出来了
  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

在手机中运行。很好,没有崩溃!!!!

代码已经上传到github.在后期我可能会进行其他的改动!!

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容