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,一经查实,立即删除!

相关文章

xx Chrome浏览器更新2020版本:黑暗模式一样使用

谷歌浏览器最近更新了一个全新的版本,新增了很多的浏览器服务,让用户在使用的时候可以更加的方便,多种使用模式都可以一键选择,使用起来也是非常方便的,最近非常火爆的黑暗模式也是可以一键使用的,今天小编…

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的多…

android app没有读写权限设置,Android 6.0以上权限拒绝打开权限设置界面的解决方法...

本人使用小米手机,打开qq或者微信的时候,某个权限拒绝的话,会提示你开启,点击开启会跳转到app的权限设置界面,当然了,这是国内系统深层定制的原因,也就是说这个界面原声的android没有的&#xf…

爱奇艺视频如何联系客服?爱奇艺联系客服攻略

爱奇艺视频是一款不错的视频,小编在闲的无聊的时候,就会使用爱奇艺来看视频,相信你们也会使用爱奇艺视频来看视频,我们在使用爱奇艺的时候,就会遇到些问题,今天小编为你介绍下:爱奇艺视频如何联…

android显示圆圈动画,Android实现3个圆圈的动画

实现了一个类似Windows进度条效果,界面上有三个圆圈,依次有一个圆圈显示白色,其它的圆圈显示蓝色。画圆圈的Viewimport android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Pai…

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

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

android sdk64位资源,android SDK 有32位或64位的分别吗

android环境下搞开发工作,原来用的是32位的(操作系统32位、Eclipse、JDK 都是32位)。现在换了win7 64位系统, Eclipse、JDK 有32位或64位的, 问一下,android SDK 有32位或64位的分别吗?32位环境下(操作系统32位、Eclipse、JDK 都是32位)更新过 android …

Google Chrome(谷歌浏览器)安装方法与使用技巧

核心提示:Google Chrome(谷歌浏览器)的特点是简洁、快速。Google Chrome支持多标签浏览,每个标签页面都在独立的“沙箱”内运行,在提高安全性的同时,一个标签页面的崩溃也不会导致其他标签页面被关闭。此外,Google Chr…

android 单元测试 回调,android – 如何为retrofit2回调进行单元测试?

我无法尝试,但它应该工作.也许你必须修复泛型类型像mock这样的错误(Call.class);.Testpublic void should_test_on_response(){Call onResponseCall mock(Call.class);doAnswer(invocation -> {Response response null;invocation.getArgumentAt(0, Callback.class).onRes…

Chrome浏览器显示“网站连接不安全”怎么解决?解决方法分享

chrome浏览器是一个非常受欢迎的搜索服务软件,这款软件可以满足用户非常多搜索需求,有很多用户都会使用这款软件进行搜索,功能非常的全面,但是在使用Chrome浏览器的也会遇到一般浏览器都会遇到的问题,今天小编就会与大…

android registerreceiver() 参数,android-registerReceiver无法正常工作

我正在尝试处理我的主类中的推送通知(并且我也有GCMBroadcastReceiver-用于我未运行主类时出现的所有通知)但是registerReceiver无法正常工作(GCMBroadcasrReceiver正常工作)我的代码:public class Main extends Activity {protected void onCreate(Bundle savedIns…

如何在Chrome浏览器中创建账户?

chrome浏览器是一款非常特殊的浏览器,不仅有非常多的用户喜欢使用这款软件,有很多开发者也非常喜欢使用这款软件,在使用浏览器的时候创建账号是一种最简单的方法,其实操作起来非常的简单、方便,但不是所有的人都会在Ch…

IE或Chrome浏览器玩Xbox游戏能实现吗

IE或Chrome浏览器玩Xbox游戏能实现吗?根据海外媒体报道,微软正在研发一种在PC网页浏览器当中串流Xbox游戏的技术。据称该技术支持Xbox One和Xbox 360游戏,可通过IE或Chrome获取。   在去年,微软就曾经展示过Windows Phone设备在云技术的帮…

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

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

小技巧来助阵 玩转Chrome浏览器

核心提示:Chrome问世已经有段时间了,相关的应用技巧也开始被挖掘出来,这里小编教你3则小技巧,让Chrome更满足你的需求。 Chrome问世已经有段时间了,相关的应用技巧也开始被挖掘出来,这里小编教你3则小技巧…

chrome浏览器遭eFast浏览器恶意软件删除取代

近日,有一款称为 eFast 浏览器的新恶意软件。该恶意软件从表面上看起来很像谷歌浏览器,但它会执行删除Chrome浏览器的操作,然后自我安装替代Chrome浏览器,并将自身设置为默认浏览器。之后,当你打开“浏览器”时&#x…

android rxjava2 简书,RXJava2学习

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

谷歌Chrome:将逐步阻止浏览器不安全下载内容

谷歌浏览器是一款非常好用的浏览服务软件,用户可以使用手机获取更多的线上内容,随时都可以使用手机下载想要的内容,这款软件最近对于功能进行了更改,用户在使用这款软件下载应用和需要的资讯时,会对下载的内容更加的严…

最新版谷歌浏览器Chrome45版本性能提升

最新版谷歌浏览器Chrome45版本性能提升 最新发布的Chrome 45版本内存消耗暴减1/4 性能大提升。距离上个v44版本发布已经10多天了,伴随着全新Logo,xx近日推出了首个v45版本:45.0.2454.85,而在实测中,Crome 45在实测中比…