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





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



Android RTMP 直播推流技术专栏 :


0 . 资源和源码地址 :


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

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

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

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

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

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

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

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

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

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

11. 解析 AAC 音频格式 :

12 . 将麦克风采集的 PCM 音频采样编码成 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 只有 55 个 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 29
    buildToolsVersion "29.0.2"

    defaultConfig {
        applicationId "kim.hsl.rtmp"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

        externalNativeBuild {
            cmake {
                cppFlags ""
                abiFilters 'armeabi-v7a'
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles 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-lib

              log )

# 设置头文件搜索路径
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 29
    buildToolsVersion "29.0.2"

    defaultConfig {
        applicationId "kim.hsl.rtmp"
        // 核心 ---------------------------------
        minSdkVersion 21
        // 核心 ---------------------------------
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

        externalNativeBuild {
            cmake {
                cppFlags ""
                abiFilters 'armeabi-v7a'
            }
        }
    }

    ...
}

...

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





五、 GitHub 项目地址



GitHub 地址 : han1202012 / RTMP_Pusher

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章