Android 推流和播放

编码和推流,有两个方案选择:

一:
使用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):GitHub - yixia/VitamioBundle: Vitamio for Android

这里使用的是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的部署
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Android推流是指利用Android设备进行直播,即将手机或平板上的视频、音频等内容通过网络传输到指定的服务器,并实时显示在其他用户的终端设备上。Android推流可以通过使用相应的推流SDK或库来实现。 在Android推流中,首先需要获取手机或平板上的视频内容。可以通过调用手机摄像头的API来获取实时的视频流,并利用音频API获取实时的音频流。获取到视频和音频内容后,可以用编码器进行编码,生成对应的音视频流。 接下来,需要选择合适的传输协议和服务器来进行推流。常用的传输协议有RTMP、HLS等。RTMP协议是一种基于TCP的传输协议,适用于实时性要求较高的场景;HLS协议是一种基于HTTP的直播协议,适用于实时性要求不太高且需要在不同终端设备上播放的场景。选择好传输协议后,可以将编码好的音视频流通过网络传输到指定的服务器。 最后,在服务器上配置好相应的推流地址和推流参数,其他用户可以通过访问该推流地址来实时观看推流内容。可以通过在终端设备上使用对应的播放器,来解码播放服务器上的音视频流。 总之,Android推流是将手机或平板上的视频、音频等内容通过网络传输到指定服务器,并实时显示在其他用户的终端设备上的一种技术。它涉及到获取手机或平板上的视频和音频内容、选择传输协议和服务器、进行编码和解码等步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值