ijkplayer中使用librtmp (Android)

本文详细介绍了如何在Ubuntu 16.10环境下,从头开始在ijkplayer中添加和编译librtmp库,包括安装必要软件、编译ijkplayer、添加openssl支持、编译librtmp、将librtmp整合到ffmpeg以及最后的编译过程。通过参考相关文章,可以成功在不同CPU架构上实现librtmp的支持。

本文将从零开始详细讲述怎么在ijkplayer中添加使用librtmp库

编译环境:

ubuntu 16.10


1.安装必要的软件

sudo apt-get install git make yasm

2.下载并编译ijkplayer,确保源码无错

git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android
cd ijkplayer-android
git checkout -B latest k0.7.5
./init-android.sh

cd android/contrib
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all

cd ..
./compile-ijk.sh all


3.添加openssl支持

cd ../..
./init-android-openssl.sh
./android/contrib/compile-openssl.sh all

编译成功后,在ijkplayer-android/android/contrib/build/目录下会有对应cpu架构的ssl静态库

4.编译librtmp生成对应静态库

cd android/contrib
git clone git://git.ffmpeg.org/rtmpdump
cd rtmpdump

进入rtmpdump目录内,新建4个文件:
Android.mk
AndroidManifest.xml
jni/Application.mk
librtmp/Android.mk

其中Android.mk:

LOCAL_PATH := $(call my-dir)

subdirs := $(addprefix $(LOCAL_PATH)/,$(addsuffix /Android.mk, \
        librtmp \
    ))

ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
openssl=openssl-armv7a
endif
ifeq ($(TARGET_ARCH_ABI),armeabi)
openssl=openssl-armv5
endif
ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
openssl=openssl-arm64
endif
ifeq ($(TARGET_ARCH_ABI),x86)
openssl=openssl-x86
endif
ifeq ($(TARGET_ARCH_ABI),x86_64)
openssl=openssl-x86_64
endif
SSL :=$(LOCAL_PATH)/../build/$(openssl)/output
ifndef SSL
$(error "You must define SSL before starting")
endif

include $(subdirs)



AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1"
    android:versionName="0.1" >

    <uses-sdk android:minSdkVersion="9" />

</manifest>



jni/Application.mk:

NDK_TOOLCHAIN_VERSION := 4.9
APP_ABI := armeabi-v7a armeabi arm64-v8a x86 x86_64
APP_PROJECT_PATH := $(shell pwd)
APP_BUILD_SCRIPT := $(APP_PROJECT_PATH)/Android.mk



librtmp/Android.mk:

LOCAL_PATH:= $(call my-dir)
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_CFLAGS += -I$(SSL)/include -DUSE_OPENSSL
LOCAL_LDLIBS += -L$(SSL)/lib
LOCAL_LDLIBS += -lssl -lcrypto -lz
LOCAL_DISABLE_FATAL_LINKER_WARNINGS := true

LOCAL_MODULE := librtmp

#include $(BUILD_SHARED_LIBRARY)
include $(BUILD_STATIC_LIBRARY)



在rtmp目录下执行编译:

ndk-build

成功后会看到目录下多了obj这个文件夹,里面有对应版本的rtmp静态库

5.将librtmp编译到ffmpeg里

A.修改/android/contrib/tools/do-compile-ffmpeg.sh文件
找到

FF_BUILD_ROOT=`pwd`

在其后面添加

RTMP_ROOT="$FF_BUILD_ROOT/rtmpdump"
RTMP_ARCH=



依次在其中添加RTMP_ARCH=”xxx”

if [ "$FF_ARCH" = "armv7a" ]; then
    ...
    RTMP_ARCH="armeabi-v7a"

elif [ "$FF_ARCH" = "armv5" ]; then
    ...
    RTMP_ARCH="armeabi"

elif [ "$FF_ARCH" = "x86" ]; then
    ...
    RTMP_ARCH="x86"

elif [ "$FF_ARCH" = "x86_64" ]; then
    ...
    RTMP_ARCH="x86_64"

elif [ "$FF_ARCH" = "arm64" ]; then
    ...
    RTMP_ARCH="arm64-v8a"

else
    echo "unknown architecture $FF_ARCH";
    exit 1
fi


//找到
FF_CFLAGS="-O3 -Wall -pipe \
    -std=c99 \
    -ffast-math \
    -fstrict-aliasing -Werror=strict-aliasing \
    -Wno-psabi -Wa,--noexecstack \
    -DANDROID -DNDEBUG"
//在其后面添加
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-protocol=librtmp*"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-librtmp"
FF_CFLAGS="$FF_CFLAGS -I${RTMP_ROOT}"
FF_DEP_LIBS="-L${RTMP_ROOT}/obj/local/${RTMP_ARCH} -lrtmp"



B.分别在下面的文件中
/android/contrib/ffmpeg-arm64/configure
/android/contrib/ffmpeg-armv5/configure
/android/contrib/ffmpeg-armv7a/configure
/android/contrib/ffmpeg-x86/configure
/android/contrib/ffmpeg-x86_64/configure
找到并注释掉这行

#enabled librtmp           && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket



C.在/config/module-lite.sh里面查找或插入下面2个值

export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=librtmp*"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-librtmp"

6.最后编译

cd android/contrib
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all
cd ..
./compile-ijk.sh all

这是编译ijk所支持的全部cpu架构的例子,只编译其中一个的话,按需修改一下就ok了








参考文章:

http://blog.csdn.net/lyqaizhy/article/details/49077027
http://zhengxiaoyong.me/2016/11/13/%E5%88%9D%E8%AF%86FFmpeg%E7%BC%96%E8%AF%91%E9%82%A3%E4%BA%9B%E4%BA%8B
http://zhengxiaoyong.me/2016/11/20/%E7%AE%80%E8%BF%B0RTMPDump%E4%B8%8E%E7%BC%96%E8%AF%91%E7%A7%BB%E6%A4%8D/
https://github.com/yixia/librtmp

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值