Android实现直播的博文和流程(全过程,超详细/附源码)

为方便大家阅读,源码先行奉上
github源码链接 https://github.com/Recycle1/Live-video-demo
csdn源码链接 https://download.csdn.net/download/weixin_52263647/85070250

需要注意的一点是!!!:上述的代码需要更改IP地址为你自己的IP地址,博主在做完这个demo后禁用了1935端口号,因此无法直接使用博主的云服务器,同时如果是阿里云服务器,一定要记得在安全组中放行相应的端口号,否则无法正常推流。

最近要做一个有把视频从手机端推流,在另一端拉流功能的app,所以就学习了一下直播功能,这两个功能比较类似,找到了一些收藏点赞比较多的文章,按着他们的记录一步一步的做了下来,但是文章大多都是几年前写的,可能也是我懂的比较少,捣鼓了好几天,按着他们做的照着做,还是出现了各种各样的问题,所以我汇总了一些博文的内容,终于是实现了。

首先准备工作,不光需要有Android stdio,还需要有自己的服务器,这里我租用了阿里云的云服务器(linux系统),之后的文章中,从Android端的编写到服务器端的配置都会有所介绍。最后测试实现的结果,可以先在电脑上下载一个VLC

具体的一些流程是:

  1. 在android端调用yaesa库进行摄像头采集、编码,随后向srs服务器rtmp推流
  2. 在服务器端部署srs流媒体服务器
  3. 在android端调用vitamio实现取流播放

一 Android端搭建

android实现的功能一个是采集摄像头的内容,然后将视频内容推流到服务器端,另一个是从服务器端拉流到手机播放视频。

以下是我认为比较好的博文
Android直播实现(一)Android端推流、播放

首先需要调用yaesa,链接如下
https://github.com/begeekmyfriend/yasea

将yaesa项目clone下来,对我们有用的就是其中library这部分,我们将这个文件夹作为library导入到自己的android项目中,导入的过程就是在顶部的功能那里,依次点击
File -->new–>import Module
请添加图片描述
出现上面的画面,我们从里面找到刚才下载的yeasa中的library文件夹,放入里面,导入成功

然后需要在我们自己的项目,也就是app这个目录下导入library这个依赖,具体的方法可以等之后在那些引用外部依赖的代码标红时(出错),看android stdio给的推荐解决方案,点击(import dependence)即导入依赖,也可以直接通过File–>Project Structure->Dependencies,点击加号添加依赖

在这里插入图片描述
然后对于拉流操作,我们需要使用vitamio是实现功能,所以我们同样需要引入vitomio,这里就到了一个大坑!!!
我按着第一篇博文的方法,从他给出的demo
https://github.com/SiKang123/LiveTest
或者从各种博文都推荐的vitomio地址https://github.com/yixia/VitamioBundle
将vitomio导入到android端(和上面的操作一样)
但是,本以为大功告成了,结果vitomio在测试时一直出现问题,找不到vinit.so文件,我查了各种文章,都找不到解决的办法,最后我看到一个博主出现的虽然不是这个问题,但是vitomio也是运行不了,于是他换了一个vitomio的下载地址,没有用上面的链接,成功解决了自己的问题,我试了一下,也是把我的问题解决了
引用vitamio框架提示libffmpeg.so、libstlport_shared.so无法找到的错误
他引用的vitomio项目地址是这个
https://github.com/yixia/VitamioBundleStudio
上面这个是可以用的,但是也需要做一些修改,首先把vitomio文件夹根据我们上面讲到的方法放入自己的项目中,随后更改vitomio文件下的build.gradle文件
在这里插入图片描述
改为这样
在这里插入图片描述
随后更改vitomio文件夹下的MediaPlayer.java文件
在这里插入图片描述
其实这个我也不知道问题出在哪里,后面运行的时候发现这里报错,LIB_ROOT这个变量的值有问题,所以这里我索性去掉了if语句,运行发现没有问题
请添加图片描述
这样,外部引用库就导入完成了,文件结构长这个样子请添加图片描述
之后根据第一篇博文给的链接
https://github.com/SiKang123/LiveTest
把他的xml文件activity文件我们按着他写的写在我们自己的文件里
在这里插入图片描述
这样,android端就配置完成了,之后,我们开始配置服务器端

二 服务器端搭建

在服务器搭建这里,不是很了解的也没关系,现在搭建服务器有很多工具,操作起来不是很难,也不需要写很多命令,这里,我是用我租用的阿里云服务器(Linux系统)配置srs流媒体服务器

准备工作

需要有自己的服务器,工具类,我用的是宝塔面板,关于宝塔面板如何安装,使用,以及站点搭建,可以看我之前写的这篇文章
阿里云服务器宝塔面板的安装
一些比较方便的工具还有xshell,xftp这两个软件,一个是写命令的,一个是把自己电脑的文件传到服务器里的,xshell的功能宝塔面板里也有,但是xshell功能更加全面,xftp建议下载一个,因为这个传文件确实很方便

在宝塔面板这里,通过软件商店,我下载了nginx服务器,mysql,phpmyadmin等,这些是一些比较基础的配置(很方便,只要找到相应软件,点击安装,即可完成服务器基本配置工作)

具体内容

关于配置srs的大致思路,可以看这篇文章
linux部署安装SRS流媒体服务器教程

上面这篇博文通过crt进行安装,我们用
宝塔面板+xftp(+xshell)
就很方便,首先下载srs
https://github.com/ossrs/srs
最好是下载releases版本的,在上面的网页往下划,找到这里,选一个你相中的,
请添加图片描述
点进去以后,下载这个比较好
在这里插入图片描述
在自己电脑里解压就可以然后通过xftp传到服务器的root文件夹里面
在这里插入图片描述

1.在宝塔终端或在xshell输入命令行
请添加图片描述
2.进入trunk文件夹下,之后的操作都在此文件夹下进行
输入以下内容编译文件

./configure && make

3.启动srs

./objs/srs -c conf/srs.conf 

查看是否启动成功

ps -ef | grep srs

编译过程可能会面临权限问题,可能某个文件因为权限打不开,可以通过宝塔面板,打开文件,鼠标悬浮文件夹,就可以找到权限选项,设置权限,也可以通过代码来完成
在Linux系统中如何修改文件夹读写权限

4.之后我们需要下载ffmpeg,srs内部也有ffmpeg,在trunk目录下的3rdparty文件夹
请添加图片描述
但是我试了试,怎么都有问题,所以我自己又下了一个(在官网ffmpeg)当然,我们下载到哪里?也是放在这个3rdparty文件夹里面,上面这个图片里ffmpeg文件夹就是我自己下载的ffmpeg

5.要想用ffmpeg,首先要有yasm,如果没有yasm,需要先安装,以下是下载yasm的网站
http://www.tortall.net/projects/yasm/releases

6.下载合适版本的yasm(注意要下载以.tar.gz结尾的压缩包),解压后放在这个3rdparty文件夹下
然后在终端逐行输入

cd yasm-1.3.0
./configure
make && make install

7.安装完成后,开始安装ffmpeg
进入ffmpeg文件夹(cd ffmpeg)
上面发的那篇博文说需要先获取root权限,直接输入:su 在输入密码即可取得root权限,这样可以,但是我是通过宝塔面板把文件夹权限放开的

然后输入

./configure
make && make install

这样,我们的服务器部分就配置完成了
可以通过下面两行来了解配置的信息

//了解参数
cat -n conf/srs.conf
//了解运行状态
./etc/init.d/srs status

(b站里也有教学的视频,这里我挑了一个讲的比较详细的,分享给大家srs配置教学,srs官网里也有配置的相关流程介绍,也很详细srs官网

三 运行测试

关于运行测试,分为推流和拉流
首先我们进行推流,我看了这篇博文
推流效果
同样里面也给出了官方的方案
推流与拉流
我们使用官方的方案,测试的视频存在srs的一个文件夹里面,内容是阿凡达

for((;;)); do \
        ./3rdparty/ffmpeg/ffmpeg -re -i ./doc/source.200kbps.768x320.flv \
        -vcodec copy -acodec copy \
        -f flv -y rtmp://192.168.1.170/live/livestream; \
        sleep 1; \
    done

需要注意的几点:

  1. ffmpeg是我们下载的,所以我这里的路径是3rdparty路径下的
  2. ip地址需要换成我们服务器的ip地址
  3. 在trunk文件夹下执行

进行完上面的操作,就可以看到视频开始推流了
请添加图片描述
我们想要观看视频需要取流,可以通过在线播放器,但是现在的浏览器很多不支持flash,所以可能不成功,所以可以在电脑上下载一个VLC,通过VLC取流播放,在
媒体–>流–>网络
输入播放的地址,就是刚才我们推流时的地址
在这里插入图片描述
点击串流旁的三角,点击播放,等一会,看到阿凡达的话,那恭喜你,成功了!!!请添加图片描述
在android端测试也可以,也是把地址换成我们服务器的ip地址就可以