• 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的部署

     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端播放

  • 相关阅读:
    0309. Best Time to Buy and Sell Stock with Cooldown (M)
    0621. Task Scheduler (M)
    0106. Construct Binary Tree from Inorder and Postorder Traversal (M)
    0258. Add Digits (E)
    0154. Find Minimum in Rotated Sorted Array II (H)
    0797. All Paths From Source to Target (M)
    0260. Single Number III (M)
    0072. Edit Distance (H)
    0103. Binary Tree Zigzag Level Order Traversal (M)
    0312. Burst Balloons (H)
  • 原文地址:https://www.cnblogs.com/endv/p/7487685.html
Copyright © 2020-2023  润新知