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

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

效果图:

16dde77e31cf3466610c8b0424390972.png

编码和推流,有两个方案选择:

一:

使用javacv来实现,最终也是用过ffmpeg来进行编码和推流,javacv实现到可以直接接收摄像头的帧数据

需要自己实现的代码只是打开摄像头,写一个SurfaceView进行预览,然后实现PreviewCallback将摄像头每一帧的数据交给javacv即可

javacv地址:https://github.com/bytedeco/javacv

demo地址:https://github.com/beautifulSoup/RtmpRecoder/tree/master

二:

使用Android自带的编码工具,可实现硬编码,这里有一个国内大神开源的封装很完善的的库yasea,第一种方法需要实现的Camera采集部分也一起封装好了,进行一些简单配置就可以实现编码推流,并且yasea目前已经直接支持摄像头的热切换,和各种滤镜效果

yasea地址(内置demo):https://github.com/begeekmyfriend/yasea

服务器

流媒体服务器我用的是srs,项目地址:https://github.com/ossrs/srs

关于srs的编译、配置、部署、在官方wiki中已经写的很详细了,并且srs同样是国内开发人员开源的项目,有全中文的文档,看起来很方便

这里有最基本的简单编译部署过程 Android直播实现(二)srs流媒体服务器部署

播放器

android端的播放使用vitamio,还是国内的开源播放器,是不是感觉国内的前辈们越来越屌了^~^!

vitamio支持几乎所有常见的的视频格式和流媒体协议

vitamio地址(内置demo):https://github.com/yixia/VitamioBundle

这里使用的是yaesa库,先介绍一下直播实现的流程:

一:使用yaesa进行摄像头采集、编码然后向srs服务器rtmp推流

二:部署srs流媒体服务器

三:使用vitamio取流播放

编码和推流已经整合在一起,demo地址:https://github.com/SiKang123/LiveTest

yaesa推流:

首先 clone yesa源码,导入library库

//布局文件中实现

.ossrs.yasea.SrsCameraView

android:id="@+id/glsurfaceview_camera"

android:layout_width="match_parent" android:layout_height="match_parent"/>

//java代码 需要实现接口 implements SrsEncodeHandler.SrsEncodeListener, RtmpHandler.RtmpListener, SrsRecordHandler.SrsRecordListener

SrsCameraView cameraView = (SrsCameraView) findViewById(R.id.glsurfaceview_camera)

mPublisher = new SrsPublisher(cameraView);

//编码状态回调

mPublisher.setEncodeHandler(new SrsEncodeHandler(this)); mPublisher.setRecordHandler(new SrsRecordHandler(this)); //rtmp推流状态回调 mPublisher.setRtmpHandler(new RtmpHandler(this)); //预览分辨率 mPublisher.setPreviewResolution(1280, 720); //推流分辨率 mPublisher.setOutputResolution(720, 1280); //传输率 mPublisher.setVideoHDMode(); //开启美颜(其他滤镜效果在MagicFilterType中查看) mPublisher.switchCameraFilter(MagicFilterType.BEAUTY); //打开摄像头,开始预览(未推流) mPublisher.startCamera(); //mPublisher.switchToSoftEncoder();//选择软编码 mPublisher.switchToHardEncoder();//选择硬编码 //开始推流 rtmpUrl(ip换成服务器的部署ip):"rtmp://192.168.31.126/android/teststream" mPublisher.startPublish(rtmpUrl);

关键代码就这么几句(状态回调有很多这里就不贴了,可以看demo),剩下的交给yasea,编码推流就搞定了,是不是简单到怀疑人生?

vitamio取流播放

首先还是clone vitamio的源码,导入vitamio库

/*首先不要忘了在Manifest里注册InitActivity*/

"io.vov.vitamio.activity.InitActivity"

android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"

android:launchMode="singleTop"

android:theme="@android:style/Theme.NoTitleBar" android:windowSoftInputMode="stateAlwaysHidden" /> /*布局文件*/ .vov.vitamio.widget.VideoView android:id="@+id/surface_view" android:layout_width="wrap_content" android:layout_height="wrap_content" />

/*java代码*/

/*onCreate中,用于检查vitamioLibs库是否准备完成

*如果Manifest中没有初始化InitActivity,这里会返回false,并自动初始化InitActivity

*/

if (!LibsChecker.checkVitamioLibs(this))

return;

VideoView mVideoView=(VideoView) findViewById(R.id.surface_view); /*会有几秒延时*/ mVideoView.setVideoPath(rtmpUrl);

然后就可以开始愉快的播放rtmp流了,是不是简单到令人发指?

关键代码就这么多,具体代码可以看看demo:https://github.com/SiKang123/LiveTest

移动端的编码、推流、和播放就到这,后面会介绍一下srs的部署

srs流媒体服务器部署

前面介绍了Android端的编码、推流和播放

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

但是作为android程序员,写好了推流器和播放器,没有服务器来测试还是很头疼的,这里就介绍一下srs服务器的最简单的部署,如果有兴趣深入研究的可以去看看官方的wiki,因为是国内开发人员开源的,提供中文文档,讲解的很详细 https://github.com/ossrs/srs/wiki/v3_CN_Home

编译:

官方推荐在CentOs 6.x 和 Ubuntu12.x下编译,为了避免不必要的麻烦,我直接在Ububtu 12.04.5上进行编译和部署的

首先clone srs源码

git clone https://github.com/ossrs/srs

cd srs/trunk

然后进行编译

./configure --rtmp-hls --with-http-api --with-ffmpeg && make //--rtmp-hls:开启ssl/hls,其他功能都处于关闭状态。 //--with-http-api:开启http api接口。 //--with-ffmpeg:开启FFMPEG

这里只编译了基础功能,更详细的配置可以看:https://github.com/ossrs/srs/wiki/v1_CN_Build

编译完之后启动就可以了

//启动时也可以自定义去配置,制定一个conf文件就可以了,这里用现成的rtmp.conf来启动

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

如果没报错,这个时候服务器就已经启动了,把Android推流和播放端的ip地址,改成srs部署的ip就可以实现直播了(注意:如果是用虚拟机,要把网络模式换位桥接模式,让虚拟机拥有独立的ip,否则主系统可以访问到srs,但局域网内的手机是访问不到的)

为了测试srs是否已经成功启动,可以先用ffmpeg 对一个本地视频文件进行推流,srs的/doc/下有测试的flv文件,直接用ffmpeg进行推流

//ip地址换成自己部署的ip

sudo ./objs/ffmpeg/bin/ffmpeg -re -i ./doc/source.200kbps.768x320.flv \-vcodec copy \-f flv -y rtmp://192.168.31.126/srstest/teststream

不出意外的话在终端中就应该开始一帧一帧的推流了:

d805747197d58bae3a89f5a9ebc2237a.png

这样就推流成功了,然后用srs的在线播放器试一下能否观看

http://winlinvip.github.io/srs.release/trunk/research/players/srs_player.html

497e4f874a22661de957739890b3dc9b.png

服务器启动以后,把Android推流和播放端的ip改为服务器的部署ip,就可以开始直播了

如果没有成功,可以利用srs在线播放器来帮助测试:

1.测试推流可以在Android上向服务器推流,用srs在线播放,播放成功推流就没问题了

2.测试播放可以像上边一样,先用ffmpeg推流一个视频文件,在Android端播放

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 聊天功能实现,Android聊天背景功能实现

解决输入法弹出时背景被顶上去或者挤压变形的问题先看效果图:Screenshot_1510219375.pngScreenshot_1510219378.png实现方案:package com.qiangqiang.chatback.views;import android.content.Context;import android.util.AttributeSet;import android.v…

小技巧来助阵 玩转Google Chrome(谷歌浏览器)

核心提示:Google Chrome是由Google开发的一款设计简单、高效的Web浏览工具。 Chrome问世已经有段时间了,相关的应用技巧也开始被挖掘出来,这里小编教你3则小技巧,让Chrome更满足你的需求。 1、单进程运行:Chrome的多…

谷歌浏览器怎么下载视频 Google Chrome下载视频方法

核心提示:现在我来教大家谷歌浏览器怎么下载视频 Google Chrome下载视频方法。 谷歌浏览器怎么下载视频 Google Chrome下载视频方法 我们经常会在线看一些网页视频,但是网站的视频下载都只支持自己的客户端,如果每家网站的客户端都安装的话那…

android 日程安排view,RecyclerView 列表控件中简单实现时间线

时间时间,时间,时间啊;走慢一点吧~看见很多软件中都有时间线的东西,貌似天气啊,旅游啊什么的最多了;具体实现方式很多,在本篇文章中讲解一种自定义View封装的方式。效果先来看看效果…

android rxjava2 简书,RXJava2学习

什么是RxJava一个可观测的序列来组成异步的、基于事件的程序的库。(简单来说:它就是一个实现异步操作的库)RxJava 好在哪?RxJava 其实就是提供一套异步编程的 API,这套 API 是基于观察者模式的,而且是链式调用的,所以使用 RxJava…

无尽包围html5游戏在线玩,小团体激发潜能小游戏突破自我

缩小包围圈游戏其实是一个不可能完成的任务,但是它会给游戏者带来无尽欢笑,使小组充满活力,让队员们能够自然地进行身体接触和配合,消除害羞和忸怩感,创造融洽的气氛,为后续工作的开展奠定良好基础。可以作…

html5鼠标下拉浮窗固定,【前端技术】vue-floating-menu可拖拽吸附的浮窗菜单

前言正如这个名字,这是一个具有拖拽吸附功能的浮窗菜单,开源项目一个基于 vue 的浮窗组件,可在屏幕内自由拖拽,拖拽后可以根据最后的位置吸附到页面两边,而且可以点击浮窗显示菜单效果如下:遇到的问题总结鼠标移动过快&#xff0c…

html vba 单元格 格式,VBA设置单元格格式之——字体

009 设置单元格格式之字体(文档下载:关注本公众号,发送消息【教程】即可获得)通过VBA对单元格字体进行设置也是比较常用的方式,那么本节内容我们就来学习如何使用VBA对单元格中的字体进行设置。如图所示,字体设置主要有&#xff0…

2021聊城二中高考成绩查询,聊城中考成绩查询时间2021

聊城市2021年中考查分时间大约是6月27日。各普通高中要于7月10日前在校内张榜公布录取考生名单,并签发录取通知书。聊城中考录取时间各普通高中要于7月10日前在校内张榜公布录取考生名单,并签发录取通知书。所有学校均不得违规招收已被其他学校录取的考生…

桂林电子科技大学计算机信息管理专业排名,桂林电子科技大学信息科技学院优势专业排名,2021年桂林电子科技大学信息科技学院最好的专业排名...

桂林电子科技大学优势专业由桂林电子科技大学历届学长学姐实名推荐:1、通信工程 推荐指数: 4.8(156人推荐)2、电子信息工程 推荐指数: 4.6(135人推荐)3、机械设计制造及其自动化 推荐指数: 4.6(114人推荐)4、电气工程及其自动化 推荐指数: 4.5(93人推荐)5、测控技术…

计算机网络五层模型以及数据单元,计算机网络OSI模型、TCP/IP模型与5G协议

一、 OSI参考模型国际标准化组织(ISO)在1984年颁布了开放系统互连参考模型(OSI),这是一个开放式的体系结构,将网络分为了七层。这七层分别是应用层、表示层、会话层、传输层、网络层、数据链路层和物理层。1.1 七层模型的功能分层功能应用层网络服务与最…

台式机计算机怎么分割,编辑手把手教程 如何给电脑硬盘分区

1找到磁盘管理工具目前主流的电脑,都预装了正版Win7操作系统,相信就算没有安装系统,朋友们在买到新电脑后的第一件事就是安装Windows操作系统。虽然Win8操作系统即将面世,但Win7操作系统的市场占有率已跟经典的Windows XP操作系统…

银行柜员网申计算机水平要求高吗,银行网申没通过,是因为你水平差吗?

原标题:银行网申没通过,是因为你水平差吗?近段时间,各进银行陆续开设网申通道,各位憧憬进入到银行工作的学员也在紧张的网申材料准备中。根据往年的经验来看,会有学员对小编吐槽“同学都收到网申通过的通知…

辽宁沈阳计算机学校王斯琪,青春正好,理所当“燃”——沈阳万合技校开展2020-2021年度春季学期跳大绳比赛...

原标题:青春正好,理所当“燃”——沈阳万合技校开展2020-2021年度春季学期跳大绳比赛辽宁万合职业教育集团Liaoning Wanhe Vocational Education Group沈阳万合职业技术学校Shenyang Wanhe vocational and technical school跳跃奔跑的身影,爽…

win10计算机系统优化设置,win10系统优化系统的详细办法

作为大多数用户都使用的win10系统,如果发生对win10系统优化系统进行设置情况,会让人束手无策,那么win10系统优化系统是怎么设置的呢?如果有朋友想对win10系统优化系统进行设置的话,按照1、右键点击“此电脑”&#xff…

arm放弃服务器芯片,ARM溃败:Applied Micro拆分ARM架构服务器芯片业务

上月下旬通信芯片厂商MACOM达成最终协议以约7.7亿美元收购Applied Micro,日前则已决定只留下后者的高速载波和数据中心连网芯片业务,分拆它的ARM架构服务器芯片业务,这对ARM在服务器芯片市场造成了重击,对于Intel来说则是重大喜讯…

计算机硬盘写入错误怎么办,电脑提示缓存文件写入失败

非正常电脑关引起的:如果是非正常关电脑引起的写入缓存失败,那就在【运行】中输入【CHKDSK 盘符】。系统错误:1,打开我的电脑,打开本地磁盘属性,在弹出的对话框中选择【工具】--【开始检查】,2&…

win2008验证服务器错误,win2008dcdiag检测出的错误,求解决方法

win2008dcdiag检测出的错误目录服务器诊断正在执行初始化设置:正在尝试查找主服务器...主服务器 SPS003* 已识别的 AD 林。已完成收集初始化信息。正在进行所需的初始化测试正在测试服务器: Default-First-Site-Name\SPS003开始测试: Connectivity......................... S…

ajax 405报错,使用ajax请求时发生随机HTTP错误405

我收到HTTP错误405动词不允许。由于有时代码有效,并且有时会抛出http 405错误,所以我需要了解这是编程问题还是服务器配置问题。我用jQuery使用ajax。我在这里浏览了所有相关的帖子,并尝试了与代码相关的所有推荐选项。请帮忙。使用ajax请求时…

我的世界服务器修改末地难度,涨姿势啦!我的世界老司机带你解锁进入末地的高难度姿势!...

我的世界中国版从发布至今已经有八年的时光了,很多玩家从一开始就陪着我的世界成长,可以说是看着它长大的了。如果你是我的世界的忠实玩家,那么你肯定知道进入末地的唯一渠道就是末地门啦,但是坏坏今天来就是来告诉你们进入大名鼎…