Android-基于GSYVideoPlayer的rtsp、rtmp协议流直播开发
因为公司项目中的一个功能是直播,虽然我之前从来没有接触过这玩意但是也不得不硬着头皮上了,坑爹的是直播的协议流还不是http而是RTMP和RTSP,于是乎这一周一直在网上看各种教程从SDL+ffmpeg到ijkplayer鬼知道我到底经历了些什么,直到遇到了GSYVideoPlayer。
我就不对这个库多做介绍了总之就是很好很强大,对于我们这些小白来说很轻松的就能实现我们想要的功能以下是官网地址:https://github.com/CarGuo/GSYVideoPlayer
我在此只放如何直播rtsp和rtmp的相关代码其他的需要功能大家可以去官网看文档,文档写的很详细但是要耐着性子看下去。
实现步骤:
- 添加依赖
implementation 'com.shuyu:gsyVideoPlayer-java:6.0.1'//是否需要ExoPlayer模式
implementation 'com.shuyu:GSYVideoPlayer-exo2:6.0.1'//更多ijk的编码支持
implementation 'com.shuyu:gsyVideoPlayer-ex_so:6.0.1'
- 布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayerandroid:id="@+id/videoPlayer"android:layout_width="match_parent"android:layout_height="match_parent"></com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer></android.support.constraint.ConstraintLayout>
- 播放页面代码
package com.example.dadao.gsyvideoplayer;import android.content.pm.ActivityInfo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;import com.shuyu.gsyvideoplayer.GSYVideoManager;
import com.shuyu.gsyvideoplayer.model.VideoOptionModel;
import com.shuyu.gsyvideoplayer.player.IjkPlayerManager;
import com.shuyu.gsyvideoplayer.player.PlayerFactory;
import com.shuyu.gsyvideoplayer.utils.OrientationUtils;
import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer;import java.util.ArrayList;
import java.util.List;import tv.danmaku.ijk.media.player.IjkMediaPlayer;public class MainActivity extends AppCompatActivity {public StandardGSYVideoPlayer videoPlayer;OrientationUtils orientationUtils;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//PlayerFactory.setPlayManager(IjkPlayerManager.class);init();}private void init() {videoPlayer = (StandardGSYVideoPlayer)findViewById(R.id.videoPlayer);/**此中内容:优化加载速度,降低延迟*/VideoOptionModel videoOptionModel = new VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "rtsp_transport", "tcp");List<VideoOptionModel> list = new ArrayList<>();list.add(videoOptionModel);videoOptionModel = new VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "rtsp_flags", "prefer_tcp");list.add(videoOptionModel);videoOptionModel = new VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "allowed_media_types", "video"); //根据媒体类型来配置list.add(videoOptionModel);videoOptionModel = new VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "timeout", 20000);list.add(videoOptionModel);videoOptionModel = new VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "buffer_size", 1316);list.add(videoOptionModel);videoOptionModel = new VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "infbuf", 1); // 无限读list.add(videoOptionModel);videoOptionModel = new VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "analyzemaxduration", 100);list.add(videoOptionModel);videoOptionModel = new VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "probesize", 10240);list.add(videoOptionModel);videoOptionModel = new VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "flush_packets", 1);list.add(videoOptionModel);// 关闭播放器缓冲,这个必须关闭,否则会出现播放一段时间后,一直卡主,控制台打印 FFP_MSG_BUFFERING_STARTvideoOptionModel = new VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", 0);list.add(videoOptionModel);GSYVideoManager.instance().setOptionModelList(list);String source1 = "rtsp://192.168.1.101/11";videoPlayer.setUp(source1, true, "");videoPlayer.getTitleTextView().setVisibility(View.GONE);videoPlayer.startPlayLogic();}@Overrideprotected void onPause() {super.onPause();videoPlayer.onVideoPause();}@Overrideprotected void onResume() {super.onResume();videoPlayer.onVideoResume();}@Overrideprotected void onDestroy() {super.onDestroy();GSYVideoManager.releaseAllVideos();if (orientationUtils != null)orientationUtils.releaseListener();}@Overridepublic void onBackPressed() {//先返回正常状态if (orientationUtils.getScreenType() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {videoPlayer.getFullscreenButton().performClick();return;}//释放所有videoPlayer.setVideoAllCallBack(null);super.onBackPressed();}}
- 结束
所有步骤结束,不需要添加什么so库更不需要自己去编译so库!
测试结果:
设备:荣耀play
- 局域网下(rtsp流):1080P视频能流畅直播不会卡,延迟一秒左右,加载时间在优化之后秒;4K视频会偶尔卡顿,延迟在两秒左右。
- 广域网下(rtmp流):只测试了1080P流畅播放没见卡,延迟一秒左右,加载秒开。
(更新:2018/11/28)
结束
参考链接:
基于IJKPlayer(兼容系统MediaPlayer与EXOPlayer2),实现了多功能的视频播放器
九个完美的Android播放器开源项目【精华】
IjkPlaye开源库
Android-基于GSYVideoPlayer的rtsp、rtmp协议流直播开发相关推荐
- HTML页面 加载播放RTMP协议流和HLS协议流直播视频
主要内容让rtmp或hls的协议流直播视频能在html页面正常显示(这里也是综合参考了网上其余的资料,最终放出下面这些实测可用的方案). 首先是HLS协议流, 这种是播放m3u8格式的视频. 解决方案 ...
- HLS,HTTP,RTSP,RTMP协议的区别
HLS,HTTP,RTSP,RTMP协议的区别: 用HTTP方式: 先通过服务器将FLV下载到本地缓存,然后再通过NetConnection的本地连接来播放这个FLV,这种方法是播放本地的视频,并不是 ...
- 基于c++实现RTSP/RTMP推流组件PushStream简介
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 原文:https://blog.csdn.net/hiwubihe/article/details/84639975 [本系列相关文章] 基于c ...
- 视频监控安防平台-国标28181平台(支持国标28181转RTSP/RTMP/HLS/WEBRTC直播)
视频监控安防平台-国标28181平台(支持国标28181转RTSP/RTMP/HLS/WEBRTC直播) 发现很久都未更新博客了,最近把小平台的功能做了完善,在原来的功能基础上添加了功能,支持国标28 ...
- 常用的RTMP、RTSP、HTTP协议流直播流地址
一.RTMP.RTSP.HTTP协议 这三个协议都属于互联网 TCP/IP 五层体系结构中应用层的协议.理论上这三种都可以用来做视频直播或点播.但通常来说,直播一般用 RTMP.RTSP.而点播用 H ...
- H5视频之RTMP、RTSP、HTTP协议流直播流测试地址
转自https://blog.csdn.net/u014162133/article/details/81188410 一.RTMP.RTSP.HTTP协议 这三个协议都属于互联网 TCP/IP 五层 ...
- GSYVideoPlayer(基于ijkplayer)之rtmp协议播放器的简单应用
基于ijkplayer的GSYVideoPlayer rtmp协议播放器的简单应用 **添加依赖** **Manifest配置** **Layout布局** activity_start.xml ac ...
- 基于FFmpeg接收RTSP的ts流
RTSP用于建立的控制媒体流的传输,通过wireshark抓包可以看到rtsp消息交互的过程: 1. 第一步:查询服务器端可用方法 C->S:OPTION request // 询问S有 ...
- 用QT做一个rtsp / rtmp实时流的播放器 ffmpeg
老早之前用qt集成ffmpeg 做过一个播放器 那个是基于sdl的命令行窗口 这次做成GUI的方式 直接做成一个播放器 可以输入rtsp或者rtmp流地址 效果图如下 那个长的输入框输入rtsp地址 ...
最新文章
- Repeater控件的分页问题
- python以及MATLAB终止循环的快捷键
- Android 开源项目及其学习
- mybatis.mapper-locations 配置多个mapper路径
- .Net Core with 微服务 - Polly 服务降级熔断
- [.NET Core].NET Core R2安装及示例教程
- 2021“MINIEYE杯”中国大学生算法设计超级联赛(2)I love max and multiply(转化)
- [转]DevExpress GridControl 关于使用CardView的一点小结
- [转载]Programming MS Office 2000 Web Components第二章第三节
- 用C#访问Dynamic AX的WebService.
- [Python] 字符串大写变小写 lower()函数
- 遗传优化算法优化LSTM结构-准确率
- bat 指定hid驱动加载_Linux驱动程序学习一 (续)
- 【论文翻译】卷积神经网络图像风格转移 Image StyleTransfer Using Convolutional Neural Networks
- 数学建模6 典型相关分析
- Hi3519使用·记录
- 【ESD专题】1.ESD基础及IEC61000-4-2标准
- 【周五松土】私家萝卜与坑
- TLC固态硬盘暴力读写寿命测试
- php 逻辑思维题,倘若3分钟内,你能答对这道智力题,说明你的逻辑思维能力很强...