1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 【Android RTMP】Android Studio 集成 x264 开源库 ( Ubuntu 交叉编译 | Android Studio 导入函数库 )

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

时间:2023-04-24 20:25:19

相关推荐

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

文章目录

安卓直播推流专栏博客总结一、 x264 简介二、 x264 交叉编译三、 Android Studio 导入函数库四、 交叉编译版本五、 GitHub 项目地址

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

Android RTMP 直播推流技术专栏 :

0 . 资源和源码地址 :

资源下载地址 :资源下载地址 , 服务器搭建 , x264 , faac , RTMPDump , 源码及交叉编译库 , 本专栏 Android 直播推流源码 ;GitHub 源码地址 :han120 / 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# lsAUTHORS build.sh config.guess configure docexample.c filters Makefile tools x264.cx264dll.c x264res.rcautocomplete.c common config.sub COPYING encoder extrasinput output version.sh x264cli.h x264.hroot@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 地址 :han120 / RTMP_Pusher

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。