Android直播实现 Android端推流、播放

摘要:
//Www.cnblogs.com/endv/p/7487685.html最近,我们希望实现Android直播。集成后,只有少量的java代码可以用于实现编码、流和流播放。javacv需要实现的直接接收相机的帧数据的代码只是打开相机。第一种方法需要实现的相机收集部分也打包在一起。

原文地址  :http://www.cnblogs.com/endv/p/7487685.html

最近想实现一个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的部署

 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
  •  

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

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

这里写图片描述

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

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


下载源码代码下载

免责声明:文章转载自《Android直播实现 Android端推流、播放》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux内核调试方法总结之栈帧Docker快速指南下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

rtsp学习----海康RTSP客户端连接深入分析

转载于:http://blog.csdn.net/zhouyongku/article/details/41546789 海康相机RTSP连接代码分析 最近在做海康相机rtsp连接获取音视频的工作,现在介绍一下分析过程和源码。 【源码在我上传的共享资料中:http://download.csdn.net/detail/zhouyongku/8203521】...

[转]HEX文件格式

Intel HEX 文件是由一行行符合Intel HEX 文件格式的文本所 构 成的ASCII 文本文件。在Intel HEX 文件中,每一行包含一 个 HEX 记录 。 这 些 记录 由 对应 机器 语 言 码 和/ 或常量 数 据的十六 进 制 编码数 字 组 成。Intel HEX 文件通常用于 传输将 被存于ROM 或者EPROM 中的程序和 数 ...

阿里巴巴移动安全应用加固能力养成记

近些年来,移动APP数量呈现爆炸式的增长,黑产也从原来的PC端转移到了移动端,伴随而来的逆向攻击手段也越来越高明。在解决加固产品容易被脱壳的方案中,代码混淆技术是对抗逆向攻击最有效的方式之一。但目前的移动端加固技术真能抵御黑客的攻击吗? 本报告将分享阿里巴巴集团安全部应用加固能力养成记,重点介绍Android加固对于端上的业务风险控制是如何做到自动化部署...

Android_广播

BroadcastReceiver 一,概述 使用场景: 1.同一app内部的组件之间的消息通信 2.同一app不同进程之间的消息通信 3.不同app之间的组件之间消息通信 4.Android系统与app之间的消息通信 实现原理:观察者模式,基于消息的发布/订阅事件模型。 实现流程(大致): 1.接受者通过Binder机制向AMS(Activity Man...

现场取证之流量分析总结

一、前言 当业务系统发生安全事件时,我们除了需要对客户的主机进行排查找出入侵来源、还原入侵事故过程,还需要对网络流量持续性地跟踪监测。 虽然市面上那么多的安全监控分析设备、软件,产生了大量的安全日志。可还是要将尝试攻击、已经攻击成功的情况判断出来有针对性地进行排查、防御。 针对常见的攻击事件,结合监测工作中分析流量的方法,总结了几个网络流量分析排查思路。...

JavaMail入门:创建纯文本、HTML格式的邮件

转自:http://haolloyin.blog.51cto.com/1177454/353849/ 在 http://java.sun.com/products/javamail/ 下载了 JavaMail 1.4.3 版本,如果所用 JDK 是 6.0 则不用再下载 activation 。下载得到的是 javamail-1.4.3.zip 的压缩包,...