首先需要了解推流端需要采集两部分数据,视频和音频,视频是通过摄像头采集的。音频是通过麦克风采集的。对于android设备摄像头采集的数据是没有经过压缩的NV21数据(属于YUV420数据格式,需要了解两者区别的,查看链接:YUV与NV21),由于这样的数据没有经过压缩,数据量很大,想要传给服务器就需要对其进行压缩(编码),采用H264编码。要使用x264工具将NV21数据编码成H264(H264是一种协议)数据

H264编码是得到连续的流,流中有很多帧(I帧称为关键帧,P帧,B帧)。要想传递给服务器的数据是不丢帧的,需要对流进行重新打乱,比如第一段先传I帧数据包,再传B帧数据包等。这个传递给服务器的工具就是rtmpDump,它是真正实现摆放数据的,会将h264数据转成packet,推到服务器。它是遵循rtmp协议的。这种协议就保证了流在传递的过程中不丢帧。

一、android studio集成rtmpDump

1、下载linux环境下的rtmpDump 地址rtmpDump-linux

2、在linux环境解压,将解压得到的librtmp文件夹拷贝到项目中的cpp目录下。

3、在当前librtmp文件夹下创建CMakeLists.txt,编写CMake,生成rtmp静态库,代码如下:

cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
#所有的.c文件编译成静态库rtmp
add_library(rtmpSTATICamf.chashswf.clog.cparseurl.crtmp.c)

试着编译,发现编译失败,定位到代码

是因为openssl找不到导致的,openssl一般是使用在视频加密的地方,这里不需要,但是如果手动删除。发现需要很多地方都要做修改,那么我们就需要使编译的时候不编译它。发现系统是通过CRYPTO这个宏来控制是否编译这段代码,而CRYPTO又是通过NO_CRYPTO这个宏来控制的。那么我们就需要定义NO_CRYPTO这个宏,这样CRYPTO这个宏就不会定义,继而就不会编译openssl这段代码。如下:


cmake_minimum_required(VERSION 3.4.1)
#设置编译器为c编译器 -DNO_CRYPTO为定义宏变量NO_CRYPTO
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNO_CRYPTO")
#所有的.c文件编译成静态库rtmp
add_library(rtmpSTATICamf.chashswf.clog.cparseurl.crtmp.c)

4、将我们编译的静态库连接到动态库native-lib中,编写项目的CMakeList.txt,代码如下:


cmake_minimum_required(VERSION 3.4.1)
#将外部编译的文件引入进来
add_subdirectory(librtmp)
#添加动态库
add_library(native-libSHAREDnative-lib.cpp)
find_library(log-liblog)target_link_libraries(native-lib#静态库rtmp编译到native-lib中rtmp${log-lib})

这样就完成了rtmp的集成。

二、android studio集成x264

x264是一个C语言编写的目前对H.264标准支持最完善的编解码库。与RTMPDump一样同样直接在Android中使用,也可以集成进入FFMpeg。在Android中使用x264,首先需要预编译出x264的静/动态库。

1、linux环境进入x264目录,编写生成静态库编译脚本build.sh。代码如下

#!/bin/bash
PREFIX=./android/armeabi-v7a
NDKROOT=/root/android-ndk-r17c
TOOLCHAIN=$NDKROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64FLAGS="-isysroot $NDKROOT/sysroot -isystem $NDKROOT/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  -O0 -fPIC"
#--disable-cli 不需要命令行工具
#--enable-static 静态库
#和ffmpeg差不多
./configure \
--prefix=$PREFIX \
--disable-cli \
--disable-asm \
--enable-static \
--enable-pic \
--host=arm-linux \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--sysroot=$NDKROOT/platforms/android-17/arch-arm \
--extra-cflags="$FLAGS"make clean
make install

执行sh build.sh命令,会在当前目录下生成android/armeabi-v7a。

2、将头文件拷贝到cpp目录下的include文件夹下,将静态库拷贝到cpp/libs/armeabi-v7a目录下

3、将我们编译的静态库连接到动态库native-lib中,编写项目的CMakeList.txt,代码如下:


cmake_minimum_required(VERSION 3.4.1)
#将外部编译的文件引入进来
add_subdirectory(librtmp)
#添加动态库
add_library(native-libSHAREDnative-lib.cpp)
#-L代表路径
#CMAKE_SOURCE_DIR当前工程目录
#CMAKE_ANDROID_API内置变量指向armeabi-v7a
set(my_lib_path  ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI})
set(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -L${my_lib_path}")
#导入头文件
include_directories(include)
find_library(log-liblog)target_link_libraries(native-lib#静态库rtmp编译到native-lib中rtmpx264${log-lib})

这样就完成了x264的集成。

附件:完整的x264与rtmp配置文档

直播--android端推流实现一相关推荐

  1. android 自定义推流器,Android直播实现 Android端推流、播放

    最近想实现一个Android直播,但是对于这方面的资料都比较零碎,一开始是打算用ffmpeg来实现编码推流,在搜集资料期间,找到了几个强大的开源库,直接避免了jni的代码,集成后只用少量的java代码 ...

  2. android 推流地址可以多人用,Android直播实现(一)Android端推流、播放

    Android直播实现(一)Android端推流.播放 最近想实现一个Android直播,但是对于这方面的资料都比较零碎,一开始是打算用ffmpeg来实现编码推流,在搜集资料期间,找到了几个强大的开源 ...

  3. Android直播系统的实现,直播APP开发Android端推流及播放

    想实现一个Android的直播系统,但是对于这方面的资料都比较零碎,一开始是打算用ffmpeg来实现编码推流,在搜集资料期间,找到了几个强大的开源库,直接避免了jni的代码,集成后只用少量的java代 ...

  4. Android直播实现(一)Android端推流、播放

    最近想实现一个Android直播,但是对于这方面的资料都比较零碎,一开始是打算用ffmpeg来实现编码推流,在搜集资料期间,找到了几个强大的开源库,直接避免了jni的代码,集成后只用少量的java代码 ...

  5. Android直播实现(Android端推流、播放)

    最近想实现一个Android直播,但是对于这方面的资料都比较零碎,一开始是打算用ffmpeg来实现编码推流,在搜集资料期间,找到了几个强大的开源库,直接避免了jni的代码,集成后只用少量的java代码 ...

  6. 七牛云直播-Android端播放卡顿问题处理

    背景: 七牛直播云主要涉及推流SDK.业务控制SDK.播放SDK.转发平台:而在播放端经常会遇到卡断不能播放的问题,此时可能有两种情况,第一,推流端停止推流,即主播下线:第二,播放端网络慢的原因:所以 ...

  7. 七牛云直播推流php,七牛云直播Android推流端之开速开发

    前言 在我看来,定性为快速开发的文档应该是毫无障碍的,对着敲应该就能直接运行的.可是由于七牛迭代太快了,文档跟不上代码迭代的速度,导致快速开始这部分文档的还没更新,很多被废弃的类.方法还在文档中,导致 ...

  8. Android音视频学习系列(九) — Android端实现rtmp推流

    系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...

  9. 百度LSS视频直播Android版Demo详细注释

    最近准备研究一下视频直播,就找了一下一些提供流媒体服务的服务商,虽然我对百度一直有点看法,但流媒体服务器这一点,平心而论,还可以,虽然对认证的个人开发者有100G的流量限制,而且对新开通的用户还赠送1 ...

最新文章

  1. 【冷门实用小工具】轻量级流程图工具ClickCharts PRO绿色版,ClickCharts PRO下载【亲测有效】
  2. 安装autoit libary失败问题解决
  3. socket服务器显示未响应,“程序未响应”的思考总结
  4. ASP.NET 2.0 的数据源、数据绑定控件概述与区别
  5. NIO客户端主要创建过程
  6. QT | 聊聊QT与直播流播放——从QMediaPlayer到Qt-AV
  7. uniapp 微信小程序的弹框文字换行
  8. redhat7 安装 docker
  9. 饥荒联机一直显示正在启动服务器,饥荒联机版一直正在启动服务器 | 手游网游页游攻略大全...
  10. VSS的基本使用操作介绍
  11. [Leetcode] 382. Linked List Random Node 解题报告
  12. 模拟10位QQ账号的生成
  13. win10如何共享打印机_局域网内,办公室USB接口打印机如何共享
  14. 使用LabVIEW进行物体追踪图像处理分析
  15. 【NuxtJs】阻止微信内置浏览器的字体缩放的解决方案(vue,h5)
  16. WebWork教程一
  17. 微阵列数据分析(Microarray data analysis)
  18. Dirty Pipe linux内核提权漏洞分析(CVE-2022-0847)
  19. 自动驾驶AI也能像真人司机一样有性格吗?
  20. 地理位置 百度地图api

热门文章

  1. 荣耀v40pro和华为nova8pro哪个好?
  2. 外汇天眼:什么是熊市和牛市?
  3. 《STM32学习笔记》4——核心功能电路与编程(下)
  4. CC2530基础实验四 串口通信
  5. 【C#工具】后宫佳丽三千
  6. adb不是内部或外部命令,也不是可运行的程序
  7. 基于51单片机无线门铃控制系统设计(毕设课设)
  8. 使用Python进行同期群分析(Cohort Analysis)
  9. 使用PS调整图片大小
  10. 个人项目(二)-- 自助点餐系统