开发思路

首先,为什么要用NDK来做,因为自己之前就已经实现过RTMP推流、RTMP播放、RTSP转码等等各种c++实现的流媒体项目,有很成熟的代码模块。既然Android有NDK,可以JNI的方式复用之前的成熟代码,大大拓展和加快项目实现,那为什么不这样去做呢。和其他平台一样,要实现采集摄像头推送直播流,需要实现以下几点

  • 获取Android摄像头数据
  • 对摄像头数据进行h264编码
  • 编码后数据以RTMP协议封装数据并推送

下面分开来讲开发思路:

  1. Android端采集摄像头原始数据,可以在Java层通过Camera2获取数据,也可以用NativeCamera通过NDK来获取,不过后者需要的版本高一些,我考虑了一下,还是决定通过Java层获取数据,然后再交给下层处理。
  2. h264编码,可以通过AndroidMediaCodec进行硬件编码,也可以通过x264进行软件编码,这里因为要复用以前的代码,决定使用软件编码来验证
  3. RTMP协议封装,这部分代码,直接使用之前的C++代码即可,本身就是平台无关的,NDK也是linux环境开发,socket网络通信都是相通的。具体可以参考我之前的文章“C++实现RTMP协议发送H.264编码及AAC编码的音视频”

程序框架

根据上面开发思路,程序框架就显而易见了:

这里省略了部分内容,比如在so动态库之上,有一层封装模块,供Activity调用

  1. Java层的主要做数据采集。对摄像头,通过Camera2接口,获取到更新的Surface,并转交给Opengl.EGL进行绘制,数据被绘制到TextureView的SurfaceTexture上,同时将RGB原始数据回调给Activity,由Activity把数据转交给动态库。 关于Camera2接口获取摄像头数据,这里使用的是自定义的Surface。

  2. C++层实现对原始数据进行编码,并按照RTMP数据包进行封装,然后推送到RTMP服务器。

交叉编译

这部分也是主要工作之一,c++代码要想在Android上使用,必须编译成动态库,然后让APP通过JNI来调用。本质上,Android也是linux嘛,所以跟其他嵌入式arm-linux的交叉编译方式,本质上是差不多的,当然,前提是系统内布置好交叉编译环境。熟悉NDK的应该都知道,Google提供了完整的编译工具链,也包括SDK,下载地址在这里:“NDK Downloads”。我是在Ubuntu Linux上来做的,所以选择“Linux 64-bit(x86)”版本,记得Linux环境必须是64位,不然你什么都编译不了。

解压后其实就可以开始了。不过这里还是有两种编译方式:第一种就是类似其他arm-linux环境,配置好交叉编译工具链环境,然后直接按照普通的linux编译方式进行编译;第二种是编写Android.mk文件,然后用NDK里提供的ndk-build脚本进行编译。

CSDN站内私信我,领取最新最全C++音视频学习提升资料,内容包括(C/C++,Linux 服务器开发,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)

1. 工具链方式

对第一种方式来说其实比较简单,安装好交叉编译工具链之后,配置一下环境,就可以编译了。比如如下配置

这样基本就可以了,当然不同项目可能还需要进一步的修改配置,make之前需要执行configure等,但大致如此。

2. ndk-build方式

对Android.mk来说,跟Makefile差别是很大的,有它自己的语法,它在整个编译过程中的位置,可能更接近于automake工具里Makefile.am。关于它的语法,参见我下面的mk文件,做了一些注释,可以帮助理解,具体的语法可以参考官方网站Android Developer。我在这里把我rtmp_enc_sdk.so动态库的Android.mk的主要内容贴出来,大家可作参考。

模式基本是一样的,按照这个模板,修改成你自己项目里使用并不困难。

关键代码

不管是Java层还是C++层的代码其实都不少,不过之前几篇文章里已经有关于他们的逻辑结构和实现方法的介绍,有兴趣的可以参考,按照文章里写的架构去理解,相信都可以实现。我这里把Java层对摄像头捕获到数据以后的处理逻辑的代码贴一下。

1 当TextureView有效之后,开始创建工作。首先要生成一个OES SurfaceTexture,后面要把它传递给Camera2接口,用于接收摄像头画面,之后开始创建RTMP推流模块调用线程,并创建摄像头捕获模块,和渲染模块

2 当OESTexture画面有效之后,获取摄像头画面的实际分辨率,以及旋转矩阵,画面旋转信息等,封装在一起,交给EGLRender,通知渲染模块进行画面渲染

3 渲染模块绘制完数据后,读取RGB原始数据并回调,在这里交给Rtmp发送线程,调用动态库,完成最后h264编码,并推送到RTMP服务器,这下面就是c++层so动态库做的事情了

运行效果

在手机端RTMP推流画面:

在PC上用flash播放RTMP直播画面:

NDK开发Android端RTMP直播推流程序相关推荐

  1. Android流媒体开发之路二:NDK C++开发Android端RTMP直播推流程序

    经过一番折腾,成功把RTMP直播推流代码,通过NDK交叉编译的方式,移植到了Android下,从而实现了Android端采集摄像头和麦克缝数据,然后进行h264视频编码和aac音频编码,并发送到RTM ...

  2. android的rtmp直播推流(一) nginx服务器的搭建

    Linux操作: 1.下载nginx和nginx rtmp模块 ​ wget http://nginx.org/download/nginx-1.15.3.tar.gzwget https://cod ...

  3. 【Android RTMP】RTMP 直播推流阶段总结 ( 服务器端搭建 | Android 手机端编码推流 | 电脑端观看直播 | 服务器状态查看 )

    文章目录 安卓直播推流专栏博客总结 一. 服务器搭建 二. 手机端推流 三. 电脑端观看直播 四. RTMP 服务器端状态 安卓直播推流专栏博客总结 Android RTMP 直播推流技术专栏 : 0 ...

  4. 【Android RTMP】RTMP 直播推流服务器搭建 ( Ubuntu 18.04.4 虚拟机 )

    文章目录 安卓直播推流专栏博客总结 一. Android RTMP 直播推流简介 二. Nginx.RTMP Module 编译环境源码准备 三. pcre.OpenSSL.zlib 函数库安装 四. ...

  5. 用ffmpeg录制小程序直播开发高清视频并实现直播推流

    导读:用ffmpeg录制小程序直播开发高清视频并实现直播推流,本文用ffmpeg和 screen capture recorder工具实现用命令行方式录制小程序直播开发的高清视频,并将实时录制的高清视 ...

  6. 【Android RTMP】RTMP 直播推流 ( 阿里云服务器购买 | 远程服务器控制 | 搭建 RTMP 服务器 | 服务器配置 | 推流软件配置 | 直播软件配置 | 推流直播效果展示 )

    文章目录 安卓直播推流专栏博客总结 一. 阿里云服务器购买 二. 远程服务器控制软件 三. 配置 Ubuntu 服务器 1 . 更新 apt 源 2 . 安装 pcre.OpenSSL.zlib 库 ...

  7. 用安卓RTMP直播推流进行音频侦听时,出现播放几秒后就无法播放问题的解决方法

    Real Time Messaging Protocol(RTMP)即实时消息传输协议,是 Adobe 公司开发的一个基于 TCP 的应用层协议,目前国内的视频云服务都是以 RTMP 为主要推流协议. ...

  8. 魔坊APP项目-26-直播、docker安装OSSRS流媒体直播服务器、基于APICloud的acLive直播推流模块实现RTMP直播推流、直播流管理

    一.docker安装OSSRS流媒体直播服务器 在外界开发中, 如果要实现直播功能.常用的方式有: 1. 通过第三方接口来实现.可以申请阿里云,腾讯云,网易云,七牛云的直播接口,根据文档,下载集成SD ...

  9. rtmp直播推流 app-livestream v0.0.1.002 发布

    rtmp直播推流 app-livestream 使用说明书 2020-07-14  Win64位版本v0.0.1.002发布    Author: hybase@qq.com  QQ: 2320768 ...

  10. Android实现注册登录头像上传等功能常规开发(Android端,服务器端开发实例)

    Android实现注册登录头像上传等功能常规开发(Android端,服务器端开发实例) 标签: 注册登录Android开发servlet 2017-04-18 20:34  454人阅读  评论(1) ...

最新文章

  1. 网络回溯分析技术八大应用之运维评估 网络运维的真正价值
  2. matlab绘制以Hz为单位的bode图
  3. SAP Spartacus 4.0 deprecation 之一 - i18next-xhr-backend
  4. 支付宝支付同步回调url中携带参数的两种方法
  5. JVM专题之类加载机制
  6. 简述 HTTPS 证书认证
  7. Know more about Oracle Latches
  8. Microsoft® Deployment Toolkit 2010之快速部署Windows 7
  9. win7 优化后的问题
  10. java byte数组与int,long,short,byte转换
  11. APUE 第四章总结
  12. bodymovin导出没有html5,AE脚本-导出json格式的Web动画工具 Bodymovin v5.5.3+使用教程
  13. ICLR 2019 Oral 论文 BigGAN 解读及源代码拆解
  14. Delphi时间戳Unix转换DateTimeToUnix和UnixToDateTime
  15. 黑苹果常用 工具+Kext+ACPI+UEFI驱动 下载
  16. 《西部世界》后续,研究人类学能让AI拥有灵魂?
  17. 【图像识别与处理】构建用于垃圾分类的图像分类器
  18. Navicat迁移表数据 一
  19. 在word文档中,解决求和符号的上下标变成右标.
  20. vue---uedito---135

热门文章

  1. 关于CSS中 用“rem 在谷歌浏览器下的问题
  2. 宝马CIC主机清FSC的方法步骤
  3. Android异步通信:深入剖析Handler机制源码
  4. python提取图像HOG特征
  5. 植被净初级生产力(NPP)的计算
  6. 连载31:软件体系设计新方向:数学抽象、设计模式、系统架构与方案设计(简化版)(袁晓河著)...
  7. 新手如何学习FPGA技术
  8. ECshop新手入门模板制作教程[转载]
  9. 视频+案例 | 钟南山院士谈5G医疗
  10. 理解Resnet18的18的含义