Android直播实现(一)Android端推流、播放
Android直播实现(一)Android端推流、播放
最近想实现一个Android直播,但是对于这方面的资料都比较零碎,一开始是打算用ffmpeg来实现编码推流,在搜集资料期间,找到了几个强大的开源库,直接避免了jni的代码,集成后只用少量的java代码就可实现编码、推流和取流播放,整理了一下做了一个demo,在这里记录一下
编码和推流,有两个方案选择:
一:
使用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库
//布局文件中实现
<net.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*/ <activity android:name="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" /> /*布局文件*/ <io.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的部署
作者:Si-Kang
来源:CSDN
原文:https://blog.csdn.net/Mr_Sk/article/details/71083366
版权声明:本文为博主原创文章,转载请附上博文链接!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android原生方式获取经纬度
Android原生方式获取经纬度两种定位方式:GPS定位、WiFi定位优劣: 如果项目定位要求较高还是建议使用三方地图库 GPS定位相比Wifi定位更精准且可在无网络情况下使用,但在室内基本暴毙无法使用WiFi定位没有室内外限制也不需要开启GPS但需要联网,另外测试发现WiFi定位时onLocationChanged函数(用于监听经纬度变化)触发间隔无法小于30s 下面是Wifi定位的代码 public class GPSActivity extends AppCompatActivity { public static final int LOCATION_CODE = 301; private LocationManager locationManager; private String locationProvider = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getLocation(); } private ...
- 下一篇
闲鱼无障碍是怎么在端侧实现的
作者:闲鱼技术-君爱 Hi,小伙伴们还记得之前刷屏的“闲鱼为1700万人,打造了一条盲道”的文章吗?在今年4月,闲鱼和深圳市信息无障碍研究会取得了联系。在沟通过程中,我们了解到在移动互联网时代,视障人士同样可以通过手机,享受到互联网带来的便利。闲鱼作为目前国内最大的闲置交易平台,为了更好地服务用户,在无障碍研究会的视障工程师团队的支持下,在现有基础上,先后进行了Android、iOS版本的无障碍支持。闲鱼在Flutter&Native混合工程下,如何进行的无障碍优化?在日常版本迭代频繁情况下,是怎么有效地保持稳定支持无障碍功能?本文为您一一揭秘。 什么是无障碍? 什么是无障碍?一个人残疾或者能力缺失,生活中有种种障碍,比如,残疾人不能上楼梯,视障人士不能玩手机。残障人士,同样享有人权,拥有独立生活的诉求。合理地使用工具减少障碍,
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Hadoop3单机部署,实现最简伪集群
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能