文章目录

  • 安卓直播推流专栏博客总结
  • 一、 AAC 音频格式解析
  • 二、 FLV 音频数据标签解析
    • 1. 分析 FLV 格式中的 AAC 音频格式数据
    • 2. AAC 音频特殊配置
    • 3. AAC 音频数据标签
  • 三、 FLV 音频数据标签头
  • 四、 音频解码配置信息
    • 1. AAC 音频数据
    • 2. 第 111 字节 AF 数据解析
    • 3. 音频数据类型

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


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 数据包 )


Android 直播推流流程 : 手机采集视频 / 音频数据 , 视频数据使用 H.264 编码 , 音频数据使用 AAC 编码 , 最后将音视频数据都打包到 RTMP 数据包中 , 使用 RTMP 协议上传到 RTMP 服务器中 ;

视频推流 : 之前的一系列博客中完成手机端采集视频数据操作 , 并将视频数据传递给 JNI , 在 NDK 中使用 x264 将图像转为 H.264 格式的视频 , 最后将 H.264 格式的视频打包到 RTMP 数据包中 , 上传到 RTMP 服务器中 ;

音频推流 : 开始进行音频直播推流操作 , 先采集音频 , 将音频编码为 AAC 格式 , 将编码后的音频打包成 RTMP 包 , 然后推流到服务器中 ;

一、 AAC 音频格式解析


1 . AAC 音频文件格式 :

① ADIF 格式 : 音频数据交换格式 ( Audio Data Interchange Format ) , 只有一份音频解码信息 , 存储在文件开头 , 这种格式适合存储音频文件 , 节省空间 , 但是必须从开始播放才可以 , 从中间位置无法播放 ;

② ADTS 格式 : 音频数据传输流格式 ( Audio Data Transport Stream ) , 每隔一段音频数据 , 就会有一份音频解码信息 , 这种格式适合音频流传输 , 可以在任何位置开始解码播放 ;

2 . 推流数据分析 : 当前的需求是需要将 FAAC 编码后的 AAC 数据推流到 RTMP 服务器中 , 推流时 , 需要推流的 AAC 格式不是上述两种格式 , 而是纯 AAC 裸数据 ;

3 . 音频帧数据必须完整 : 音频帧与视频帧存储机制不同 , 视频帧分为关键帧和非关键帧 , 音频采样都是关键帧 , 少一个采样都会有问题产生 , 如电流 , 卡顿等问题 ;

二、 FLV 音频数据标签解析


1. 分析 FLV 格式中的 AAC 音频格式数据

分析 FLV 格式中的 AAC 音频格式数据 : 下图中的第 222 个音频数据标签 , 存储了音频特殊配置 , 之后的 AAC 音频数据标签都是普通的音频采样数据 ;

① 视频解码数据配置 : 视频的第一个视频标签数据是 H.264 , AVC 序列头数据 ( H.264 : AVC Sequence Header ) , 指导后续视频帧如何解码 ;

② 音频解码数据配置 : 音频的第一个音频标签数据是 AAC , 音频特殊配置数据 ( AAC : Audio Specific config ) , 指导后续音频采样如何解码 ;

2. AAC 音频特殊配置

打开第 222 个音频数据标签 : 内容如下 , 这是完整的音频标签数据 ;

0x000001bf   :   08 00 00 07 00 00 00 00
0x000001c7  :   00 00 00 AF 00 12 10 56
0x000001cf  :   E5 00 00 00 00 12

3. AAC 音频数据标签

AAC 音频数据标签 : 该标签中封装实际的音频采样 , AAC 格式的 ;

0x00017494   :   08 00 00 13 00 00 85 00
0x0001749c  :   00 00 00 AF 01 21 1A 93
0x000174a4  :   40 7D 6B 94 64 A0 9A 03
0x000174ac  :   EB 5C A3 25 05 C0 00 00
0x000174b4  :   00 1E

三、 FLV 音频数据标签头


音频标签数据标签头解析 : 前 11 个字节时标签头信息 ; 这 111111 个字节仅做参考 , 在 RTMP 中是不封装这个标签头的 ;

0x000001bf   :   08 00 00 07 00 00 00 00
0x000001c7  :   00 00 00

① 标签类型 ( tag type ) : 111 字节 , 索引区间 [0][0][0] , 08 代表音频 , 09 代表视频 , 12 代表脚本信息 , 这里是 08 , 代表音频数据 ;

② 标签数据大小 ( data size ) : 333 字节 , 索引区间 [1,3][1,3][1,3] , 除了包头之外的数据大小 , 包头一般是 111111 字节, 整个标签大小是该 标签数据大小 ( data size ) + 11 , 本标签的数据大小是 777 字节, 总的数据大小是 181818 字节, 十六进制对应 0x121212

③ 时间戳 ( time stamp ) : 333 字节 , 索引区间 [4,6][4,6][4,6] , 表示从开始播放到当前时刻的播放时间 , 单位毫秒 , 也就是当前标签的时间与第一个标签时间的差值 ; 一般是 00 00 00 ;

④ 时间戳扩展位 ( time stamp ext ) : 111 字节 , 索引区间 [7][7][7] , 如果时间戳较大 , 333 位装不下 , 扩展一位 ; 一般是 00 ;

⑤ 流编号 ( stream id ) : 333 字节 , 索引区间 [8,10][8,10][8,10] , 一般都是 00 00 00 ;

组装 RTMP 包的时候 , 是不需要封装标签头的 , 直接将 AAC 裸数据 , 也就是这 777 个字节封装到 RTMP 包中 ;

四、 音频解码配置信息


1. AAC 音频数据

AAC 音频数据 : 分为两类 , 解码配置数据, 音频采样数据 ;

① AAC 格式音频解码配置信息 : 下面的 777 个字节时音频解码配置信息 ;


0x000001bf  :
0x000001c7  :            AF 00 12 10 56
0x000001cf  :   E5

② AAC 音频数据标签数据采样信息 :

0x0001749c   :            AF 01 21 1A 93
0x000174a4  :   40 7D 6B 94 64 A0 9A 03
0x000174ac  :   EB 5C A3 25 05 C0

2. 第 111 字节 AF 数据解析

第 111 字节 AF 数据解析 : 前 444 位表示音频格式 , 之后的 222 位表示采样率 , 之后的 111 位表示采样长度 , 最后一位表示音频类型 ;

① 0xAF 使用二进制表示为 0b‭1010 1111‬ ;

② 音频格式 : 444 位 [ 7 : 4 ] : 0b1010 = 10 , 值为 10 , 表示 AAC 格式 ;

③ 采样率 : 222 位 [ 3 : 2 ] : 0b11 = 3 , 代表 44000 Hz 采样率 , AAC 格式一般都是 44000 采样率

采样率
0 5500Hz
1 11000Hz
2 22000Hz
3 44000Hz

④ 采样位数 : 111 位 [ 1 ] : 0b1 = 1 , 代表采样长度 16 位 ;

采样位数
0 8 位 / 1 字节
1 16 位 / 2字节

⑤ 音频通道 : 111 位 [ 0 ] : 0b1 = 1 , 代表立体声 ;

音频通道
0 单声道
1 立体声

该位一般也就是声道不同 , 其它参数基本都是默认的值 , 立体声 AF , 单声道 AE ;

3. 音频数据类型

音频数据类型 :

① 音频解码配置信息 : 前两位是 AF 00 , 指导 AAC 数据如何解码 ;

② 音频采样信息 : 前两位是 AF 01 , 实际的 AAC 音频采样数据 ;

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

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

    文章目录 安卓直播推流专栏博客总结 一. FAAC 编码器编码 AAC 音频采样数据 二. 封装 RTMP 音频数据头 三. 封装 RTMP 音频数据类型 四. 拷贝 AAC 音频数据到 RTMPPa ...

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

    文章目录 安卓直播推流专栏博客总结 一. FAAC 编码器编码 AAC 音频解码信息 二. 封装 RTMP 音频数据头 三. 封装 RTMP 音频数据类型 四. 拷贝 AAC 音频数据到 RTMPPa ...

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

    文章目录 一. 头文件.成员变量准备 二. 创建 FAAC 编码器 三. 获取并设置 FAAC 编码器参数 四. 设置 FAAC 编码器编码标准 五. 设置 FAAC 编码器 AAC 编码规格 六. ...

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

    文章目录 安卓直播推流专栏博客总结 一. FAAC 头文件与静态库拷贝到 Android Studio 二. CMakeList.txt 构建脚本配置 三. Java 层 AudioRecord 音频 ...

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

    文章目录 安卓直播推流专栏博客总结 一. 音频数据采集.编码 二. AAC 高级音频编码 三. FAAC 编码器 四. Ubuntu 18.04.4 交叉编译 FAAC 编码器 安卓直播推流专栏博客总 ...

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

    文章目录 安卓直播推流专栏博客总结 一. NV21 图像数据中的 YUV 数据简介 二.向 x264 编码图片 三. 提取 NV21 数据中的灰度数据 Y 四. 提取 NV21 数据中的饱和度数据 U ...

  7. eclipse转android studio解决GBK编码转换为UTF-8格式的方法

    eclipse转android studio解决GBK编码转换为UTF-8格式出现乱码 本文转自:http://blog.csdn.net/ffacffac/article/details/77509 ...

  8. 【Android RTMP】安卓直播推流总结 ( 直播服务器搭建 | NV21 图像采集 | H.264 视频编码 | PCM 音频采集 | AAC 音频编码 | RTMP 包封装推流 )

    文章目录 一. 安卓直播推流专栏博客总结 二. 相关资源介绍 三. GitHub 源码地址 四. 整体 Android 直播推流数据到服务器并观看直播演示过程 Android 直播推流流程 : 手机采 ...

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

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

最新文章

  1. Cordova入门系列(三)Cordova插件调用
  2. 阿里云全球首批MVP张建平专访 - 我对数据有执念
  3. boost::gil模块实现带默认参数的框过滤器的测试程序
  4. React开发(152):注意替换路径
  5. ALGO-123_蓝桥杯_算法训练_A+B problem
  6. C#的变迁史08 - C# 5.0 之并行编程总结篇
  7. 禁用当前的账户win7_系统小技巧:服务客人 开启Windows 10来宾账户
  8. 软件开发丨关于软件重构的灵魂四问
  9. linux oa软件安装步骤,Ecology_OA_for_Linux安装手册
  10. 电脑动态壁纸_《Wallpaper Engine》一周电脑动态壁纸精选-第十二期
  11. 嵌入式系统——RS232和RS449
  12. Ubuntu下安装使用Monaco字体
  13. 【IDM】IDM下载器安装
  14. JAVA正则表达式语法大全
  15. 连载]第四讲 测量准确度、重复性、复现性及标准偏差
  16. CPU飙高和内存飙高等等的一般处理步骤
  17. 解决:windows电脑连接iphone手机热点,iphone锁屏后热点会自动断开
  18. 1977-1998全国历年高考状元现状
  19. qq邮箱html源码,qq邮箱源码
  20. win10解决解压复制粘贴速度慢的问题

热门文章

  1. 微软发布 Mobile Express for Microsoft Dynamics CRM 4.0
  2. requests与urllib.request
  3. 【leetcode 968. 监控二叉树】解题报告
  4. python爬取图片简记
  5. php 静态方法和非静态方法的调用说明
  6. android studio 控件提示大写
  7. IOS 2D游戏开发框架 SpriteKit--续(postion,锚点,游戏滚动场景)
  8. 阿里云数据库RDS环境搭建
  9. 2009 年 3月 二级 java
  10. yield %%% generator