文章目录

  • 安卓直播推流专栏博客总结
  • 一、 RTMP 协议
  • 二、 RTMP 协议使用
  • 三、 RTMPDump 源码下载
  • 四、 RTMPDump 源码交叉编译
  • 五、 RTMPDump 源码导入 Android Studio
  • 六、 Android Studio 配置 RTMPDump 源码 CMakeList.txt
  • 七、 关闭 RTMP 加密功能
  • 八、 GitHub 项目地址

安卓直播推流专栏博客总结


Android RTMP 直播推流技术专栏 :

0 . 资源和源码地址 :

  • 资源下载地址 : 资源下载地址 , 服务器搭建 , x264 , faac , RTMPDump , 源码及交叉编译库 , 本专栏 Android 直播推流源码 ;
  • GitHub 源码地址 : han1202012 / RTMP_Pusher

1. 搭建 RTMP 服务器 : 下面的博客中讲解了如何在 VMWare 虚拟机中搭建 RTMP 直播推流服务器 ;

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

2. 准备视频编码的 x264 编码器开源库 , 和 RTMP 数据包封装开源库 :

  • 【Android RTMP】RTMPDumb 源码导入 Android Studio ( 交叉编译 | 配置 CMakeList.txt 构建脚本 )

  • 【Android RTMP】Android Studio 集成 x264 开源库 ( Ubuntu 交叉编译 | Android Studio 导入函数库 )

3. 讲解 RTMP 数据包封装格式 :

  • 【Android RTMP】RTMP 数据格式 ( FLV 视频格式分析 | 文件头 Header 分析 | 标签 Tag 分析 | 视频标签 Tag 数据分析 )

  • 【Android RTMP】RTMP 数据格式 ( FLV 视频格式分析 | AVC 序列头格式解析 )

4. 图像数据采集 : 从 Camera 摄像头中采集 NV21 格式的图像数据 , 并预览该数据 ;

  • 【Android RTMP】Android Camera 视频数据采集预览 ( 视频采集相关概念 | 摄像头预览参数设置 | 摄像头预览数据回调接口 )

  • 【Android RTMP】Android Camera 视频数据采集预览 ( NV21 图像格式 | I420 图像格式 | NV21 与 I420 格式对比 | NV21 转 I420 算法 )

  • 【Android RTMP】Android Camera 视频数据采集预览 ( 图像传感器方向设置 | Camera 使用流程 | 动态权限申请 )

5. NV21 格式的图像数据编码成 H.264 格式的视频数据 :

  • 【Android RTMP】x264 编码器初始化及设置 ( 获取 x264 编码参数 | 编码规格 | 码率 | 帧率 | B帧个数 | 关键帧间隔 | 关键帧解码数据 SPS PPS )

  • 【Android RTMP】x264 图像数据编码 ( Camera 图像数据采集 | NV21 图像数据传到 Native 处理 | JNI 传输字节数组 | 局部引用变量处理 | 线程互斥 )

  • 【Android RTMP】x264 图像数据编码 ( NV21 格式中的 YUV 数据排列 | Y 灰度数据拷贝 | U 色彩值数据拷贝 | V 饱和度数据拷贝 | 图像编码操作 )

6. 将 H.264 格式的视频数据封装到 RTMP 数据包中 :

  • 【Android RTMP】RTMPDump 封装 RTMPPacket 数据包 ( 封装 SPS / PPS 数据包 )

  • 【Android RTMP】RTMPDump 封装 RTMPPacket 数据包 ( 关键帧数据格式 | 非关键帧数据格式 | x264 编码后的数据处理 | 封装 H.264 视频数据帧 )

  • 【Android RTMP】RTMPDump 推流过程 ( 独立线程推流 | 创建推流器 | 初始化操作 | 设置推流地址 | 启用写出 | 连接 RTMP 服务器 | 发送 RTMP 数据包 )

7. 阶段总结 : 阿里云服务器中搭建 RTMP 服务器 , 并使用电脑软件推流和观看直播内容 ;

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

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

8. 处理 Camera 图像传感器导致的 NV21 格式图像旋转问题 :

  • 【Android RTMP】NV21 图像旋转处理 ( 问题描述 | 图像顺时针旋转 90 度方案 | YUV 图像旋转细节 | 手机屏幕旋转方向 )

  • 【Android RTMP】NV21 图像旋转处理 ( 图像旋转算法 | 后置摄像头顺时针旋转 90 度 | 前置摄像头顺时针旋转 90 度 )

9. 下面这篇博客比较重要 , 里面有一个快速搭建 RTMP 服务器的脚本 , 强烈建议使用 ;

  • 【Android RTMP】NV21 图像旋转处理 ( 快速搭建 RTMP 服务器 Shell 脚本 | 创建 RTMP 服务器镜像 | 浏览器观看直播 | 前置 / 后置摄像头图像旋转效果展示 )

10. 编码 AAC 音频数据的开源库 FAAC 交叉编译与 Android Studio 环境搭建 :

  • 【Android RTMP】音频数据采集编码 ( 音频数据采集编码 | AAC 高级音频编码 | FAAC 编码器 | Ubuntu 交叉编译 FAAC 编码器 )

  • 【Android RTMP】音频数据采集编码 ( FAAC 头文件与静态库拷贝到 AS | CMakeList.txt 配置 FAAC | AudioRecord 音频采样 PCM 格式 )

11. 解析 AAC 音频格式 :

  • 【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )

12 . 将麦克风采集的 PCM 音频采样编码成 AAC 格式音频 , 并封装到 RTMP 包中 , 推流到客户端 :

  • 【Android RTMP】音频数据采集编码 ( FAAC 音频编码参数设置 | FAAC 编码器创建 | 获取编码器参数 | 设置 AAC 编码规格 | 设置编码器输入输出参数 )

  • 【Android RTMP】音频数据采集编码 ( FAAC 编码器编码 AAC 音频解码信息 | 封装 RTMP 音频数据头 | 设置 AAC 音频数据类型 | 封装 RTMP 数据包 )

  • 【Android RTMP】音频数据采集编码 ( FAAC 编码器编码 AAC 音频采样数据 | 封装 RTMP 音频数据头 | 设置 AAC 音频数据类型 | 封装 RTMP 数据包 )


一、 RTMP 协议


RTMP 协议 : RTMP 协议是基于 TCP 协议的实时消息传输协议 ( Real Time Messaging Protocol ) ;

① 协议层级 :

  • 应用层协议 : RTMP 协议与 HTTP 协议都是 TCP/IP 四层网络协议中的应用层协议 ;
  • 传输层协议 : TCP 和 UDP 是传输层协议 ;

② 协议传输数据类型 : 该协议可以传输音频 , 视频 , 数据 , 是开放性的协议 ;

③ 协议端口 : RTMP 协议默认端口 1935 , HTTP 协议默认端口 80 ;

④ 协议应用场景 : 国内的斗鱼 , 虎牙 , 等直播平台都使用该协议 ;

⑤ 协议开发者 : RTMP 是 Adobe 公司开发的 , 感谢 Adobe 公司对公益事业的支持 ;

二、 RTMP 协议使用


RTMP 协议使用 :

① RTMP 协议报文 : 该协议有规定的报文格式 , 传输时先按照格式打包 , 使用时先解包 , 再使用 ;

② 自己开发 RTMP 协议 ( 不推荐 ) : 可以自己根据报文格式 , 自己封装 RTMP 包数据 , 然后使用 TCP 协议进行传输 ;

③ 使用 RTMPDump 库 : 该库是使用 C 语言开发的处理 RTMP 数据的开源工具包 ;

三、 RTMPDump 源码下载


RTMPDump 下载 :

① 下载地址 : RTMPDump 可以在 RTMPDump 主页 查看该项目的情况 , 也可以在 RTMP下载界面 进行下载 ; 我整理了所有 RTMP 相关的资源 , 也可以在 CSDN 下载中下载 ;

② 源码下载地址 : 这里推荐下载最后一个 rtmpdump-2.3.tgz ;

③ 使用方法 : 目前的开发方法是将上述源码放在 AndroidStudio 的 cpp 目录下 , 然后进行交叉编译 , 在 NDK 中调用先关函数 ;

④ 关于 Android 库的说明 : 其中有 rtmpdump-2.3-android.zip 中只有相关的库 , 没有源码 , 不推荐使用 ;

四、 RTMPDump 源码交叉编译


1 . RTMPDump 交叉编译函数库 : 使用 make CROSS_COMPILE=arm-none-linux- INC=-I/my/cross/includes 命令 , 可以交叉编译出 ARM 架构的函数库 ( a 静态库 / so 动态库 )

INC 参数 : 指的是传递给 gcc 编译器的参数 ,

# 这是
You can cross-compile for other platforms using the CROSS_COMPILE variable:$ make CROSS_COMPILE=arm-none-linux- INC=-I/my/cross/includes

五、 RTMPDump 源码导入 Android Studio


1 . 将源码导入 Android Studio 项目 : 这里不使用导入上上述函数库的方式 , 而是直接将源码导入 AS 项目中 ;

① 拷贝源码 : RTMPDump 的源码在 rtmpdump-2.3/librtmp 目录中 , 将 rtmpdump-2.3/librtmp 目录中的文件拷贝到 Android Studio 中即可;

② Android Studio 中直接添加源码注意点 : 这里注意 , 不是所有的开源库源码都可以导入到 Android Studio 项目中的 , 开源库源码不能太大 , 如 FFMPEG , 在 Ubuntu 上编译一次很长时间 , 如果将 FFMPEG 源码放在 AS 工程中 , 估计编译一次半小时起步了 , 因此之前的博客中 , 将 FFMPEG 交叉编译成 静态库 , 然后导入到 AS 项目中 ;

③ 文件展示 : 下面截图中是该目录的文件 , 直接将 rtmpdump-2.3/librtmp 整个目录拷贝到 Android Studio 项目中 ;

2 . 拷贝后的 Android Studio 工程 : rtmpdump-2.3/librtmp 拷贝到 src/main/cpp 目录下 ;

六、 Android Studio 配置 RTMPDump 源码 CMakeList.txt


1 . 配置 RTMPDump 源码独立构建脚本 : 导入的 RTMPDump 是一个完整的项目 , 因此这里为 src/main/cpp/librtmp/ 下的 RTMPDump 源码单独配置一个 CMakeList.txt 构建脚本 ;

cmake_minimum_required(VERSION 3.4.1)set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNO_CRYPTO")add_library( # 编译的库的名称是 rtmprtmp# 编译的 rtmp 库是静态库STATIC# rtmp 库的源文件amf.chashswf.clog.cparseurl.crtmp.c )

2 . 配置 整体的 CMakeList.txt 构建脚本 :

cmake_minimum_required(VERSION 3.4.1)# 链接 src/main/cpp/librtmp 目录下的构建脚本
add_subdirectory(librtmp)add_library( # 函数库名称native-lib# 动态库类型SHARED# 源文件native-lib.cpp )find_library( # 日志库log-liblog )target_link_libraries( # 链接动态库native-lib# 编译的 rtmp 静态库rtmp${log-lib} )

七、 关闭 RTMP 加密功能


1 . 编译时遇到 fatal error: ‘openssl/ssl.h’ file not found 处理方案 : 点击查看源码 , 发现没有导入 openssl 库 , 宏定义最终进入该分支 , 需要使用 openssl 库 , 现在定义宏定义 , 使当前的宏定义不进入该分支 ;

2 . 关闭 RTMP 加密方法 : 在 rtmp.h 文件中有以下宏定义 , 如果没有定义 NO_CRYPTO 和 CRYPTO 宏 , 就会定义 CRYPTO 宏 , 这里我们定义 NO_CRYPTO 宏 , 即设置不加密 , 就可以屏蔽 openssl 头文件加载了 ;

#if !defined(NO_CRYPTO) && !defined(CRYPTO)
#define CRYPTO
#endif

3 . 屏蔽整个 CRYPTO 宏定义分支 : 即不定义 CRYPTO 宏 , 不进入整个分支 , 在 CMakeList.txt 中定义

# 取消宏定义
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNO_CRYPTO")

4 . 编译选项设置 : 只要源文件中存在 cpp 文件 , 就必须使用 CMAKE_CXX_FLAGS , 如果源文件都是 c 文件 , 可以使用 CMAKE_C_FLAGS , 这里 RTMPDump 的源文件都是 C 文件 , 使用 CMAKE_C_FLAGS ;

八、 GitHub 项目地址


GitHub 地址 : han1202012 / RTMP_Pusher

【Android RTMP】RTMPDumb 源码导入 Android Studio ( 交叉编译 | 配置 CMakeList.txt 构建脚本 )相关推荐

  1. 【Android 高性能音频】hello-oboe 示例解析 ( Oboe 源代码依赖 | CMakeList.txt 构建脚本分析 | Oboe 源代码构建脚本分析 )

    文章目录 一.Oboe 源码路径 二.阅读 CMakeList.txt 查看依赖 三.hello-oboe 中 NDK 的 CMakeList.txt 构建脚本 四.Oboe 源码 的 CMakeLi ...

  2. 【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )

    文章目录 一.修改 7zr 交叉编译脚本 Android.mk 二.完整的 7zr 交叉编译脚本 Android.mk 三.交叉编译 lib7zr.a 静态库 四.Android Studio 导入 ...

  3. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程中 | 配置 CMakeLists.txt 构建脚本 )

    文章目录 一.拷贝 p7zip 源码中的头文件到 Android Studio 项目中 二.配置 CMakeLists.txt 构建脚本 1.导入动态库 2.导入头文件 三.完整 CMakeLists ...

  4. Android系统源码导入Android studio

    1,下载Android源码 网上很多文章,多半都是在清华或者某个大学的镜像地址下载,repo init...巴拉巴拉的,这里repo就是git的封装,怎么下载怎么运行,不多说了,百度一下.下载哪个版本 ...

  5. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库到 Android Studio 工程 | 配置 build.gradle 构建脚本 )

    文章目录 一.拷贝 lib7zr.so 动态库到 Android Studio 工程 二.配置 Module 下的 build.gradle 构建脚本 三.参考资料 一.拷贝 lib7zr.so 动态 ...

  6. android 混音 源码,FFmpegAndroid android 端基于 FFmpeg 实现音频剪切、拼接、转码、混音、编解码;视频剪切、水印、截图、转码、编 @codeKK c开源站...

    android 端基于 FFmpeg 库的使用 添加编译 ffmpeg.shine.mp3lame.x264 源码的参考脚本 目前音视频相关处理: 音频剪切.拼接 音频混音 音频转码 音视频合成 音频 ...

  7. android 微信分享 源码,记录Android微信分享功能的吐槽与思考

    在App内潜入分享到微信好友或朋友圈的功能想必大家已经屡见不鲜了,比如Android分享一个网页信息(URL)到微信客户端的代码: /** * 微信分享:分享网页 * @param context * ...

  8. android 4.4 源码编译,Android 4.4源码编译过程

    Android源码下载完后的目录如下: 整个代码的大小为:25.559GB. 一.构建系统 如下用于构建Android源码树的指令应用于所有的代码分支,包括master分支.喎?http://www. ...

  9. android 3d城市源码,[转载]android Gallery3D源码分析

    一.布局 gallery3d的界面生成和普通的应用程序不一样.普通程序一般一个界面就是一个activity,布局用xml或代码都可以实现,界面切换是activity的切换方式:而gallery3d没有 ...

最新文章

  1. Windows Virtual PC RC 发布
  2. 非常不错的一款html5【404页面】,不含js脚本可以左右摆动,原生JavaScript实现日历功能代码实例(无引用Jq)...
  3. mysql2014安装文档_hive安装文档
  4. CPU启动计算机,如何加快双核CPU计算机win7启动速度
  5. 客户需求分析工具-$APPEALS
  6. Python语音识别终极指南(收藏)
  7. mysql经纬度查范围内_sql语句查询经纬度范围
  8. php jquery 时间轴,关于jQuery插件Timelinr 实现时间轴特效
  9. 大数据解读:穹顶之下,谁在关注雾霾
  10. 【UCIe】UCIe D2D Adapter 介绍
  11. 让Windows2000飞起来(转)
  12. 【已解决】ORB_SLAM2 编译 ./build_ros.h错误
  13. 关于未来人工智能时代的一点感想
  14. 干货来袭:抖音定位的重要性及抖音四步曲丨国仁网络资讯
  15. 计算机主题科技小报,《主题电脑小报制作》教案
  16. 基于c#条码打印软件源代码 可选择打印机,可选择标签
  17. 用C语言做见缝插针游戏
  18. 求解极大似然估计,一共有几步?
  19. 将Openwrt路由器配置为无线交换机,实现同网段无线中继功能
  20. 海运整柜出口操作流程有哪些注意事项?

热门文章

  1. 如何让你的SQL运行得更快
  2. 三. python面向对象(私有属性和私有方法 私有静态方法 私有类方法)
  3. kvm热添加和热迁移
  4. oracle数据库数据导入导出步骤(入门)
  5. 【loj6342】跳一跳 期望dp
  6. Android nDrawer
  7. xcode编译Undefined symbols for architecture i386问题解决
  8. centos6.9下php7安装zip扩展
  9. 对人工智能问题的提问
  10. sqlserver 循环赋值变量