热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ijkplayer中使用librtmp(Android)

本文将从零开始详细讲述怎么在ijkplayer中添加使用librtmp库编译环境:ubuntu16.101.安装必要的软件sudoapt-getinstallgitmakey

本文将从零开始详细讲述怎么在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.shcd android/contrib
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh allcd ..
./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")
endifinclude $(subdirs)



AndroidManifest.xml:


<manifest xmlns:android&#61;"http://schemas.android.com/apk/res/android"android:versionCode&#61;"1"android:versionName&#61;"0.1" ><uses-sdk android:minSdkVersion&#61;"9" />manifest>



jni/Application.mk:

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



librtmp/Android.mk:

LOCAL_PATH:&#61; $(call my-dir)
include $(CLEAR_VARS)LOCAL_C_INCLUDES &#43;&#61; $(NDK_PROJECT_PATH)/librtmp \$(SSL)/includeLOCAL_SRC_FILES:&#61; \amf.c \hashswf.c \log.c \parseurl.c \rtmp.cLOCAL_CFLAGS &#43;&#61; -I$(SSL)/include -DUSE_OPENSSL
LOCAL_LDLIBS &#43;&#61; -L$(SSL)/lib
LOCAL_LDLIBS &#43;&#61; -lssl -lcrypto -lz
LOCAL_DISABLE_FATAL_LINKER_WARNINGS :&#61; trueLOCAL_MODULE :&#61; 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&#61;&#96;pwd&#96;

在其后面添加

RTMP_ROOT&#61;"$FF_BUILD_ROOT/rtmpdump"
RTMP_ARCH&#61;



依次在其中添加RTMP_ARCH&#61;”xxx”

if [ "$FF_ARCH" &#61; "armv7a" ]; then...RTMP_ARCH&#61;"armeabi-v7a"elif [ "$FF_ARCH" &#61; "armv5" ]; then...RTMP_ARCH&#61;"armeabi"elif [ "$FF_ARCH" &#61; "x86" ]; then...RTMP_ARCH&#61;"x86"elif [ "$FF_ARCH" &#61; "x86_64" ]; then...RTMP_ARCH&#61;"x86_64"elif [ "$FF_ARCH" &#61; "arm64" ]; then...RTMP_ARCH&#61;"arm64-v8a"elseecho "unknown architecture $FF_ARCH";exit 1
fi


//找到
FF_CFLAGS&#61;"-O3 -Wall -pipe \-std&#61;c99 \-ffast-math \-fstrict-aliasing -Werror&#61;strict-aliasing \-Wno-psabi -Wa,--noexecstack \-DANDROID -DNDEBUG"
//在其后面添加
FF_CFG_FLAGS&#61;"$FF_CFG_FLAGS --enable-protocol&#61;librtmp*"
FF_CFG_FLAGS&#61;"$FF_CFG_FLAGS --enable-librtmp"
FF_CFLAGS&#61;"$FF_CFLAGS -I${RTMP_ROOT}"
FF_DEP_LIBS&#61;"-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&#61;"$COMMON_FF_CFG_FLAGS --enable-protocol&#61;librtmp*"
export COMMON_FF_CFG_FLAGS&#61;"$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


推荐阅读
  • 在CentOS 7上部署WebRTC网关Janus
    在CentOS 7上部署WebRTC网关Janus ... [详细]
  • 在 CentOS 7 系统中安装 Scrapy 时遇到了一些挑战。尽管 Scrapy 在 Ubuntu 上安装简便,但在 CentOS 7 上需要额外的配置和步骤。本文总结了常见问题及其解决方案,帮助用户顺利安装并使用 Scrapy 进行网络爬虫开发。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
  • Nginx入门指南:从零开始掌握基础配置与优化技巧
    Nginx入门指南:从零开始掌握基础配置与优化技巧 ... [详细]
  • 在 CentOS 7 上部署和配置 RabbitMQ 消息队列系统时,首先需要安装 Erlang,因为 RabbitMQ 是基于 Erlang 语言开发的。具体步骤包括:安装必要的依赖项,下载 Erlang 源码包(可能需要一些时间,请耐心等待),解压源码包,解决可能出现的错误,验证安装是否成功,并将 Erlang 添加到环境变量中。接下来,下载 RabbitMQ 的 tar.xz 压缩包,并进行解压和安装。确保每一步都按顺序执行,以保证系统的稳定性和可靠性。 ... [详细]
  • PHP预处理常量详解:如何定义与使用常量 ... [详细]
  • 线程能否先以安全方式获取对象,再进行非安全发布? ... [详细]
  • 利用ZFS和Gluster实现分布式存储系统的高效迁移与应用
    本文探讨了在Ubuntu 18.04系统中利用ZFS和Gluster文件系统实现分布式存储系统的高效迁移与应用。通过详细的技术分析和实践案例,展示了这两种文件系统在数据迁移、高可用性和性能优化方面的优势,为分布式存储系统的部署和管理提供了宝贵的参考。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
  • 在Linux环境下编译安装Heartbeat时,常遇到依赖库缺失的问题。为确保顺利安装,建议预先通过yum安装必要的开发库,如glib2-devel、libtool-ltdl-devel、net-snmp-devel、bzip2-devel和ncurses-devel等。这些库是编译过程中不可或缺的组件,能够有效避免编译错误,确保Heartbeat的稳定运行。 ... [详细]
  • 本文详细阐述了如何从源代码编译Apache HTTPD 2.4服务器,涵盖了必要的依赖安装、配置步骤及编译过程。通过本指南,读者可以深入了解HTTPD的内部机制,并掌握在Linux环境下手动构建HTTPD的方法。建议对服务器管理和开发感兴趣的读者仔细阅读,以获取更多实用技巧。例如,使用`yum install gcc pcre-devel`来安装所需的编译工具和库。 ... [详细]
  • 在Linux系统中将Python更新至3.7版本的方法如下:首先,从Python官方网站下载Python 3.7的安装包,例如使用 `wget` 命令下载 `Python-3.7.3.tgz`。其他版本的下载链接也可从Python官网获取。接下来,解压下载的文件并进入解压后的目录,运行配置脚本和编译命令以完成安装。确保在安装过程中添加Python 3.7到系统的环境变量中,以便全局使用。此外,建议检查当前系统的Python版本,以避免冲突。 ... [详细]
  • 在无网络环境下于CentOS 7系统中离线部署Nginx服务器
    nginx背景俄罗斯程序员IgorSysoev创建,于2004年NGINX首次发布,来解决C10K问题(10000并发客户端连接到单个服务器,导致服务器连接数过多崩溃的问题),是一 ... [详细]
author-avatar
莫不静了_660
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有