热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android直播系统的实现,直播APP开发Android端推流及播放

想实现一个Android的直播系统,但是对于这方面的资料都比较零碎,一开始是打算用ffmpeg来实现编码推流,在搜集资料期间,

想实现一个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.SrsCameraViewandroid:id&#61;"&#64;&#43;id/glsurfaceview_camera"android:layout_width&#61;"match_parent"android:layout_height&#61;"match_parent"/>

//java代码 需要实现接口 implements SrsEncodeHandler.SrsEncodeListener, RtmpHandler.RtmpListener, SrsRecordHandler.SrsRecordListenerSrsCameraView cameraView &#61; (SrsCameraView) findViewById(R.id.glsurfaceview_camera)mPublisher &#61; 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();//开启美颜&#xff08;其他滤镜效果在MagicFilterType中查看&#xff09;mPublisher.switchCameraFilter(MagicFilterType.BEAUTY);//打开摄像头&#xff0c;开始预览&#xff08;未推流&#xff09;mPublisher.startCamera();//mPublisher.switchToSoftEncoder();//选择软编码mPublisher.switchToHardEncoder();//选择硬编码//开始推流 rtmpUrl&#xff08;ip换成服务器的部署ip&#xff09;&#xff1a;"rtmp://192.168.31.126/android/teststream"mPublisher.startPublish(rtmpUrl);

关键代码就这么几句&#xff08;状态回调有很多这里就不贴了&#xff0c;可以看demo&#xff09;&#xff0c;剩下的交给yasea&#xff0c;编码推流就搞定了&#xff0c;是不是简单到怀疑人生&#xff1f;

vitamio取流播放
首先还是clone vitamio的源码&#xff0c;导入vitamio库

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

<activityandroid:name&#61;"io.vov.vitamio.activity.InitActivity"android:configChanges&#61;"orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"android:launchMode&#61;"singleTop"android:theme&#61;"&#64;android:style/Theme.NoTitleBar"android:windowSoftInputMode&#61;"stateAlwaysHidden" />/*布局文件*/
<io.vov.vitamio.widget.VideoViewandroid:id&#61;"&#64;&#43;id/surface_view"android:layout_width&#61;"wrap_content"android:layout_height&#61;"wrap_content" />

/*java代码*//*onCreate中,用于检查vitamioLibs库是否准备完成*如果Manifest中没有初始化InitActivity&#xff0c;这里会返回false&#xff0c;并自动初始化InitActivity*/if (!LibsChecker.checkVitamioLibs(this))return;VideoView mVideoView&#61;(VideoView) findViewById(R.id.surface_view);/*会有几秒延时*/mVideoView.setVideoPath(rtmpUrl);

然后就可以开始愉快的播放rtmp流了&#xff0c;是不是简单到令人发指&#xff1f;

关键代码就这么多&#xff0c;具体代码可以看看demo&#xff1a;https://github.com/SiKang123/LiveTest
移动端的编码、推流、和播放就到这&#xff0c;后面会介绍一下srs的部署

srs流媒体服务器部署

前面介绍了Android端的编码、推流和播放
Android直播实现&#xff08;一&#xff09;Android端推流、播放

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

编译&#xff1a;
官方推荐在CentOs 6.x 和 Ubuntu12.x下编译&#xff0c;为了避免不必要的麻烦&#xff0c;我直接在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&#xff1a;开启ssl/hls&#xff0c;其他功能都处于关闭状态。
//--with-http-api&#xff1a;开启http api接口。
//--with-ffmpeg&#xff1a;开启FFMPEG

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

编译完之后启动就可以了

//启动时也可以自定义去配置&#xff0c;制定一个conf文件就可以了&#xff0c;这里用现成的rtmp.conf来启动
./objs/srs -c conf/rtmp.conf

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

为了测试srs是否已经成功启动&#xff0c;可以先用ffmpeg 对一个本地视频文件进行推流&#xff0c;srs的/doc/下有测试的flv文件&#xff0c;直接用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

不出意外的话在终端中就应该开始一帧一帧的推流了&#xff1a;
这里写图片描述

这样就推流成功了&#xff0c;然后用srs的在线播放器试一下能否观看
http://winlinvip.github.io/srs.release/trunk/research/players/srs_player.html

这里写图片描述

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

如果没有成功&#xff0c;可以利用srs在线播放器来帮助测试&#xff1a;
1.测试推流可以在Android上向服务器推流&#xff0c;用srs在线播放&#xff0c;播放成功推流就没问题了
2.测试播放可以像上边一样&#xff0c;先用ffmpeg推流一个视频文件&#xff0c;在Android端播放


推荐阅读
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • node.jsurlsearchparamsAPI哎哎哎 ... [详细]
  • 在加载一个第三方厂商的dll文件时,提示“找不到指定模块,加载失败”。由于缺乏必要的技术支持,百思不得期间。后来发现一个有用的工具 ... [详细]
  • ps:写的第一个,不足之处,欢迎拍砖---只是想用自己的方法一步步去实现一些框架看似高大上的小功能(比如说模型中的toArraytoJsonsetAtt ... [详细]
  • 1.利用node实现页面实时更新,主要 ... [详细]
  • 初始化初始化本地空版本库,仓库,英文名repositorymkdirtest&&cdtestgitinit克隆项目到本地gitclone远程同 ... [详细]
  • Sublime P4语法高亮设置
    Github插件链接:p4-syntax-highlighter首先安装PackageControl。进入Package界面,我的目录:U ... [详细]
author-avatar
lovejiao2012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有