安卓直播的推流和播放

为啥想写这篇博客呢,也是因为自己这一周开发走过不少坎坷路途,希望对有同样需求的同志们有些许帮助。说说最近的项目,需要远程控制一个硬件设备,通过互联网传送指令,后来硬是加上远程监控,所以就有了接下来的纠结。需要在远程控制端加上个播放流媒体的功能,执行端需要调用摄像头进行推流。我也是调研很多,以前也没做过相关的,最终选择使用RTMP协议推流,nginx服务器转发流媒体,远程采用Vitamio播放RTMP流。

实现方法

推流端publisher
执行端要加上推流,找了很久最终选择github上一位大神分享的免费RTMP推流SDK,android_rtmppush_sdk下载地址,但是我遇到个问题,我需要的是横屏推流和小窗口嵌入界面,仔细看了他附带demo中的代码终于找到方法。我们知道从摄像头提取的数据先得转换成yuv格式(yuv420 = _swEncH264.swapNV21toI420(YUV, W, H)根据手机ImageFormat设置NV21或YV12来选择swap函数),然后裁剪(demo中使用获取相机默认的尺寸,然后设置成推流的宽高比例),相机返回尺寸默认是宽度大于高度的,作者为了实现竖屏推流将宽设置小于高,但是在处理的时候都是将参数倒过来用,之后还将yuv数据旋转270度(后置摄像头需要旋转90度)。sdk中集成了yuv数据的90度和270度旋转的方法(SWVideoEncoder类中YUV420pRotate90、YUV420pRotate270方法),当然也可以自己写,但是效率啥的这里应该更好。
回到我的项目,我需要的是前置摄像头横屏推流,这里在xml布局文件中加了个SurfaceView,设置大小为推流视频分辨率尺寸或者等比放大。横屏推流就不需要旋转yuv数据角度,直接赋值_yuvEdit = yuvData就好,根据需求旋转90或270度(试过这sdk中只有这两种旋转方式),例如_yuvEdit = _swEncH264.YUV420pRotate90(yuvData, W,H) (W>H默认相机获取图形分辨率宽大于高)。在进行编码时候的宽高是发送推流后显示的宽高_swEncH264 = new SWVideoEncoder(W, H, F, B)。
倘若需要横竖屏推流切换的话,应该在编码前进行手机重力感应进行方向判断(demo中有getWindowManager().getDefaultDisplay().getRotation()函数返回屏幕方向,但遇到某些定制平板横竖底层调转了,要自己调试一下,或者手动设置角度),然后相应旋转yuv数据,编码输出相应尺寸。
调用前置摄像头经常需要镜像处理,发一段yuv数据镜像转换的函数

public void Mirror(
一: 使用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库,先介绍一下直播实现的流程:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值