首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 25-02-16 05:21
  • 3484
  • 6837
blog.csdn.net

文章目录

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





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



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 包 , 然后推流到服务器中 ;





一、 音频数据采集、编码



1 . 音频数据采集 : Android 中有两种方式可以采集音频数据 ;


① Java 层使用 AudioRecord ;

② Native 层使用 OpenSL ES ;



2 . 音频数据编码 :


① 视频数据回顾 : 手机使用 Camera 采集 NV21 格式的图像数据 , x264 编码库将图像数据编码成 H.264 格式的视频数据 ;

② 音频数据编码 : 手机端采集 PCM 音频采样数据 , FAAC 编码库将 PCM 采样编码成 AAC 格式的音频数据 ;





二、 AAC 高级音频编码



1 . 高级音频编码 ( Advanced Audio Coding , AAC ) :


① MPEG-2 AAC 编码 : 初期 AAC 编码时基于 MPEG-2 有损数字音频压缩编码标准 , 称为 MPEG-2 AAC 编码 ;

② MPEG-4 AAC 编码 : 后期 AAC 编码又基于 MPEG-4 标准基础上添加了 PNS 技术 , 称为 MPEG-4 AAC 编码 ;

③ 与 MP3 编码对比 : AAC 压缩编码音质要高于 MP3 格式 ;


一般情况下 , 多媒体压缩格式 , 视频采用 H.264 格式压缩编码 , 音频采用 AAC 格式压缩编码 ;





三、 FAAC 编码器



1 . FAAC 编码器 : 在 Android 平台推荐使用 FAAC 编码器 , 免费 ; FAAC ( Freeware Advanced Audio Coder ) ;



2 . FAAC 编码器下载 :


① 官方网站 : 可以在 FAAC 官网 下载 FAAC 开源库 ;

在这里插入图片描述

② 下载 FAAC 编码库 : 点击此处 , 进入下载页面

在这里插入图片描述

上述界面中 FAAD2 是解码库 , FAAC 是编码库 ;

这里下载 FAAC Source code 中的 TAR.GZ 文件 ;





四、 Ubuntu 18.04.4 交叉编译 FAAC 编码器



1 . 将下载的 FAAC 编码器源码拷贝到 Ubuntu 的 /root/rtmp 目录下 ;


2 . 解压源码 :

$ tar xvf faac-1.29.9.2.tar.gz 
  • 1

3 . 查看源码路径 : 该源码中也有 configure 脚本 , 用于配置生成 Makefile 文件 ;

root@octopus:~/rtmp# cd faac-1.29.9.2
root@octopus:~/rtmp/faac-1.29.9.2# ls
aclocal.m4  ChangeLog  compile       config.h.in  configure     COPYING  docs      include  install-sh  ltmain.sh    Makefile.in  NEWS    TODO
AUTHORS     common     config.guess  config.sub   configure.ac  depcomp  frontend  INSTALL  libfaac     Makefile.am  missing      README

  • 1
  • 2
  • 3
  • 4
  • 5

4 . 查看 configure 帮助信息 : 执行 ./configure --help 命令 , 可以查看编译配置信息 ;

$ ./configure --help

# 默认情况下, 编译 FAAC 时, 会同时编译静态库和动态库, Android 交叉编译推荐只编译静态库
--enable-shared[=PKGS]  build shared libraries [default=yes]
--enable-static[=PKGS]  build static libraries [default=yes]

# Android 中使用动态库时, 必须指定 pic, 表示编码出与位置无关的代码段
--with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
                        both]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

5 . 交叉编译工具链 :


① 其它开源库的惯例 : 在 FFMPEG 和 x264 交叉编译时 , 都指定了 --cross-prefix 交叉编译工具链前缀 ;

② FAAC 中指定交叉编译工具链的方法 : 在 FAAC 中没有提供该配置 , 那就只能通过环境变量设置 , 将交叉编译工具链的 gcc 设置成环境变量 ;

③ 解析说明 FAAC 中的环境变量 :

Some influential environment variables:
  # C 编码器命令行, 即 gcc, 这里可以直接指定交叉编译工具链的 gcc
  CC          C compiler command
  # 指定传递给 gcc 的参数
  CFLAGS      C compiler flags
  # 传递给链接器的参数
  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
              nonstandard directory <lib dir>
  # 传递给链接器的库
  LIBS        libraries to pass to the linker, e.g. -l<library>
  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
              you have headers in a nonstandard directory <include dir>
  # C++ 编译器
  CXX         C++ compiler command
  # C++ 编译器参数
  CXXFLAGS    C++ compiler flags
  LT_SYS_LIBRARY_PATH
              User-defined run-time library search path.
  CPP         C preprocessor
  CXXCPP      C++ preprocessor
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

6 . 交叉编译脚本 : 写一个 Shell 脚本 , 辅助交叉编译 FAAC 静态库 ;

参考之前的 FFMPEG 和 x264 的 Shell 编译脚本 ;

版本注意事项 : 基于 android-17 版本进行编译, Android Studio 开发时可以将最小兼容版本配置到 17 ;

#!/bin/bash

# NDK 根目录
NDK_ROOT=/root/NDK/android-ndk-r17c

# TOOLCHAIN 变量指向 gcc g++ 等交叉编译工具所在的目录
TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
# 具体的交叉编译工具链前缀
CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi

# gcc 编译器参数, 这里指定使用 android-17 版本的库进行编译
FLAGS="-isysroot $NDK_ROOT/sysroot -isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=17 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11  -O0  -fPIC"

# 编译结果输出路径
# 注意这里不能使用 ./android/armeabi-v7a, 报错 error: expected an absolute directory name
# 改成绝对路径, 或者使用下面的方法
PREFIX=`pwd`/android/armeabi-v7a

# FAAC 中没有指定交叉编译工具链的选项, 只能在此处通过环境变量的方式进行指定
# 这里指定使用 android-17 版本的库进行编译
export CC="$CROSS_COMPILE-gcc --sysroot=$NDK_ROOT/platforms/android-17/arch-arm"
# 指定 gcc 编译器的参数
export CFLAGS="$FLAGS"

# 配置 Makefile 生成规则
./configure \
--prefix=$PREFIX \
--host=arm-linux \
--with-pic \
--enable-shared=no  

# 清除之前的编译内容
make clean

# 开启新的 FFMPEG 编译安装过程
make install
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

7 . 执行编译脚本 :

# 赋予 build.sh 脚本 执行权限
$ chmod -R 777 build.sh

# 执行编译脚本
$ ./build.sh
  • 1
  • 2
  • 3
  • 4
  • 5

8 . 编译完毕 :

在这里插入图片描述

root@octopus:~/rtmp/faac-1.29.9.2# ls
aclocal.m4  build.sh   compile       config.h.in    config.sub    COPYING  frontend  install-sh  ltmain.sh    Makefile.in  README
android     ChangeLog  config.guess  config.log     configure     depcomp  include   libfaac     Makefile     missing      stamp-h1
AUTHORS     common     config.h      config.status  configure.ac  docs     INSTALL   libtool     Makefile.am  NEWS         TODO
root@octopus:~/rtmp/faac-1.29.9.2# cd android/
root@octopus:~/rtmp/faac-1.29.9.2/android# tree
.
└── armeabi-v7a
    ├── bin
    │   └── faac
    ├── include
    │   ├── faaccfg.h
    │   └── faac.h
    ├── lib
    │   ├── libfaac.a
    │   └── libfaac.la
    └── share
        └── man
            └── man1
                └── faac.1

7 directories, 6 files
root@octopus:~/rtmp/faac-1.29.9.2/android# 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
注:本文转载自blog.csdn.net的韩曙亮的文章"https://hanshuliang.blog.csdn.net/article/details/106792955"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top