欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 运维知识 > Ubuntu >内容正文

Ubuntu

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

发布时间:2025/6/17 Ubuntu 49 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【Android RTMP】Android Studio 集成 x264 开源库 ( Ubuntu 交叉编译 | Android Studio 导入函数库 ) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章目录

  • 安卓直播推流专栏博客总结
  • 一、 x264 简介
  • 二、 x264 交叉编译
  • 三、 Android Studio 导入函数库
  • 四、 交叉编译版本
  • 五、 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 数据包 )






上一篇博客 【Android RTMP】RTMPDumb 源码导入 Android Studio 工程 ( 交叉编译 | 配置 CMakeList.txt 构建脚本 ) 中 , 集成了 RTMPDump , 用于 RTMP 数据编解码及传输 , 本篇博客中主要讲解将图像编码为视频的开源库 x264 , 集成到 Android 项目中 ;


RTMPDump 和 x264 库都可以集成到 FFMPEG 中 , FFMPEG 中也提供类似功能 , 但是其执行效率性能要低于 RTMPDump 和 x264 开源库 ;





一、 x264 简介



x264 简介 :


① H.264 标准 : H.264 是视频编码标准 , 由 ITU 和 MPEG 制订 ;

② x264 开源库 : x264 是 H.264 格式的视频编解码库 , 由 C 语言实现 ;

③ 官方页面 : 访问 x264 官网页面 , 该开源库是由 VLC 同一个团队维护的 ;

④ 直接下载 : 上述官网页面建议不好访问 , 可以 点击此处直接下载 , 也可以在博客资源中下载 ;

⑤ Android 使用方式 : x264 库很大 , 必须交叉编译成 ARM 架构的函数库 ( 动态库 / 静态库 ) 导入到 Android Studio 中才能使用 ;

不像 RTMPDump 只有 555 个 C 代码 , 可以直接放在 Android Studio 工程中进行编译 ;





二、 x264 交叉编译



参考博客 : 有些配置 , 参考之前写的 NDK 交叉编译相关的博客 ;


【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )

【Android NDK 开发】Ubuntu 函数库交叉编译 ( Android 动态库交叉编译 | Android 静态库交叉编译 )

【Android FFMPEG 开发】FFMPEG 交叉编译配置 ( 下载 | 配置脚本 | 输出路径 | 函数库配置 | 程序配置 | 组件配置 | 编码解码配置 | 交叉编译配置 | 最终脚本 )



1 . 准备编译环境 : 按照 交叉编译环境 操作 , 先把 NDK 环境搭建好 ;



2 . 拷贝源码到 Ubuntu :last_x264.tar.bz2 拷贝到 Ubuntu 中的 /root/rtmp/ 目录下 ;



3 . 解压源码 :

tar xvf last_x264.tar.bz2

4 . 配置 Makefile 文件 ( 仅做参考 ) : 与 FFMPEG 编译内容类似 , 不一一配置了 , 直接执行 shell 脚本自动配置 ;

--prefix : 指定代码安装目录 ;

--cross-prefix : 指定交叉编译头 ;

--sysroot : 配置头文件与库文件查找目录 ;



5 . 交叉编译 Shell 脚本内容 : 根据之前的 FFMPEG 编译 Shell 脚本修改一下即可 , 只是 ./configure 生成 Makefile 的选项不同 , 其它都相同 ; 在 x264 源码目录 x264-master 下 , 创建 build.sh , 并拷贝上述内容 ;

#!/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# gcc 编译器参数 FLAGS="-isysroot $NDK_ROOT/sysroot -isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -isystem $NDK_ROOT/sources/android/support/include -D__ANDROID_API__=21 -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 -O0 -fPIC"# 编译结果输出路径 PREFIX=./android/armeabi-v7a./configure \ --prefix=$PREFIX \ --disable-cli \ --enable-static \ --enable-pic \ --host=arm-linux \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --sysroot=$NDK_ROOT/platforms/android-21/arch-arm \ --extra-cflags="$FLAGS"# 清除之前的编译内容 make clean# 开启新的 FFMPEG 编译安装过程 make install

6 . 修改脚本权限 : chmod -R 777 build.sh 命令 , 修改 build.sh 脚本权限 ;

root@octopus:~/rtmp/x264-master# ls AUTHORS build.sh config.guess configure doc example.c filters Makefile tools x264.c x264dll.c x264res.rc autocomplete.c common config.sub COPYING encoder extras input output version.sh x264cli.h x264.h root@octopus:~/rtmp/x264-master# chmod -R 777 build.sh

7 . 执行编译脚本 : 执行 ./build.sh 编译脚本 , 编译后 , 生成的结果如下 ;





三、 Android Studio 导入函数库



1 . 拷贝文件 : 拷贝上面编译好的头文件与函数库到 Android Studio 工程中 , 没有目录的创建目录 ;



2 . 编辑 build.gradle 构建脚本 : 只在生成的代码基础上 , 添加了 abiFilters ‘armeabi-v7a’ 内容 ;

apply plugin: 'com.android.application'android {compileSdkVersion 29buildToolsVersion "29.0.2"defaultConfig {applicationId "kim.hsl.rtmp"minSdkVersion 21targetSdkVersion 29versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"externalNativeBuild {cmake {cppFlags ""abiFilters 'armeabi-v7a'}}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}externalNativeBuild {cmake {path "src/main/cpp/CMakeLists.txt"version "3.10.2"}} }dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'androidx.appcompat:appcompat:1.1.0'implementation 'androidx.constraintlayout:constraintlayout:1.1.3'testImplementation 'junit:junit:4.12'androidTestImplementation 'androidx.test.ext:junit:1.1.1'androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' }

3 . 编辑 CMakeList.txt 构建脚本 : 这是 src/main/cpp 下的 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 )# 设置头文件搜索路径 include_directories(include)# 通过设置编译选项, 设置函数库的搜索路径 # 此处的 ANDROID_ABI 是在 # build.gradle android->defaultConfig->externalNativeBuild->cmake # 下的 abiFilters 中设置 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}")target_link_libraries( # 链接动态库native-lib# 编译的 rtmp 静态库rtmp${log-lib} )



四、 交叉编译版本



1 . 交叉编译 Android 库版本 : 在 Ubuntu 中进行交叉编译时 , 使用的是 android-21 版本的函数库与头文件 ,

# 截取的两个配置片段 FLAGS="...-D__ANDROID_API__=21..." ./configure \ ... --sysroot=$NDK_ROOT/platforms/android-21/arch-arm \ ...

2 . Android APP 中的最低版本 : Android 项目中的 build.gradle 中配置对应的最低兼容版本 , 也要是 21 版本 ;

apply plugin: 'com.android.application'android {compileSdkVersion 29buildToolsVersion "29.0.2"defaultConfig {applicationId "kim.hsl.rtmp"// 核心 ---------------------------------minSdkVersion 21// 核心 ---------------------------------targetSdkVersion 29versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"externalNativeBuild {cmake {cppFlags ""abiFilters 'armeabi-v7a'}}}... }...

Ubuntu 中的交叉编译版本 , 与 Android 应用的最低兼容版本 , 一定要保持一致 ;





五、 GitHub 项目地址



GitHub 地址 : han1202012 / RTMP_Pusher

总结

以上是生活随笔为你收集整理的【Android RTMP】Android Studio 集成 x264 开源库 ( Ubuntu 交叉编译 | Android Studio 导入函数库 )的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。