使用java搭建直播平台

  • 时间:
  • 浏览:246
  • 来源:成都艾邦软件开发

引言
流媒体文件是目前非常流行的网络媒体格式之一这种文件允许用户一边下载一边播放从而大大减少了用户等待播放的时间。另外通过网络播放流媒体文件时文件本身不会在本地磁盘中存储这样就节省了大量的磁盘空间开销。正是这些优点使得流媒体文件被广泛应用于网络播放。

流媒体服务器是通过建立发布点来发布流媒体内容和管理用户连接的。流媒体服务器能够发布从视频采集卡或摄像机等设备中传来的实况流也可以发布事先存储的流媒体文件并且发布实况流和流媒体文件的结合体。一个媒体流可以由一个媒体文件构成也可以由多个媒体文件组合而成还可以由一个媒体文件目录组成。

Flash Media Server简称 FMS是 Flash 大家庭里的一员被称为是目前开发 Web 音视频应用程序比如视频聊天室、视频会议系统、播客系统、音视频留言等等的最方便最快捷的解决方案。也在 web 应用程序开发上有着越来越广泛的应用。当然 FMS 这种优良功能并不是免费提供给广大用户的几千美金每个点的价格让很多开发人员望而却步。于是大家开始尝试寻找一种更合适的解决方案开源的 Red5 便成为了人们的新宠。

Red5 是一个采用 Java 开发的开源的 Flash 流媒体服务器功能上与 FMS 类似。它支持把音频MP3和视频FLV转换成播放流录制客户端播放流只支持 FLV共享对象现场直播流发布远程调用。Red5 使用 RSTP 作为流媒体传输协议包括在线录制Flash 流媒体播放在线聊天视频会议等一些基本功能。国内外基于 Red5 的流媒体应用产品也在不断推广例如在线视频会议 Openmeeting大型 Flash 网游功夫之王 2。

Red5 概述
Red5 是一个采用 Java 开发开源的 Flash 流媒体服务器。免费开源使软件更加容易扩展下载后你可以对源代码进行修改更加经济比起 FMS 高昂的费用Red5 能为一般的应用节约大笔费用同时服务器端的 Java 面向对象语言比起 FMS 服务器端的 ActionScript2 语言更加成熟。鉴于 Red5 的种种优势推出不久便被广大用户所接受。

Red 5 支持:

1. 把音频MP3和视频FLV, F4V, MP4, 3GP转换成播放流

2. 录制客户端播放流, 把摄像头麦克风等传入的音频视频录制保存到服务器

3. 共享对象

4. 现场直播流发布

5. 远程调用

6. 协议:RTMP, RTMPT, RTMPS, and RTMPE。

Red5 服务器搭建
JDK自行安装
下载Red5
/Red5/red5-server/releases

解压到自己的一个能记住的文件夹中 eg:F:Red5

配置Red5相关参数
修改red5.properties配置文件..conf\red5.properties

只需要配置HTTP 和RMTP节点的host和port即可 默认也行host配置成0.0.0.0 输入局域网IP或者127.0.0.1都可以正常访问

# Socket policy
policy.host0.0.0.0
policy.port843
 
# HTTP
http.host0.0.0.0
http.port8855
https.port5443
http.URIEncodingUTF-8
http.max_keep_alive_requests-1
http.max_threads20
http.acceptor_thread_count10
http.processor_cache20
 
# RTMP
rtmp.host0.0.0.0
rtmp.port1935
rtmp.io_threads16
rtmp.send_buffer_size65536
rtmp.receive_buffer_size65536
rtmp.ping_interval1000
rtmp.max_inactivity60000
rtmp.max_handshake_time5000
rtmp.tcp_nodelaytrue
rtmp.tcp_keepalivefalse
rtmp.default_server_bandwidth10000000
rtmp.default_client_bandwidth10000000
rtmp.client_bandwidth_limit_type2
rtmp.bandwidth_detectionfalse
rtmp.encoder_base_tolerance5000
rtmp.encoder_drop_live_futurefalse
# traffic optimization hinting. to disable set traffic class set to -1
# low delay high throughput 24 (0x18)
rtmp.traffic_class-1
# requested maximum length of the queue of incoming connections
rtmp.backlog32
# the interval (seconds) between each throughput calculation
rtmp.thoughput_calc_interval15
# enable use of the default mina acceptor
rtmp.default_acceptortrue
# socket i/o pool sizes used when default acceptor is disabled
rtmp.initial_pool_size0
rtmp.max_pool_size2
rtmp.max_processor_pool_size16
rtmp.executor_keepalive_time60000
mina.logfilter.enablefalse
# scheduler configs (per application)
rtmp.scheduler.pool_size16
rtmp.deadlockguard.sheduler.pool_size16
# message executor configs (per application) - adjust these as needed if you get tasks rejected
rtmp.executor.core_pool_size4
rtmp.executor.max_pool_size32
rtmp.executor.queue_capacity64
# drop audio packets when queue is almost full, to disable this, set to 0
rtmp.executor.queue_size_to_drop_audio_packets60
# maximum amount of time allotted to process a single rtmp message / packet in milliseconds, set it as 0 to disable timeout
rtmp.max_handling_time2000
# connection tweaks - dont modify unless you know what youre doing
rtmp.channel.initial.capacity3
rtmp.channel.concurrency.level1
rtmp.stream.initial.capacity1
rtmp.stream.concurrency.level1
rtmp.pending.calls.initial.capacity3
rtmp.pending.calls.concurrency.level1
rtmp.reserved.streams.initial.capacity1
rtmp.reserved.streams.concurrency.level1
 
# RTMPS
rtmps.host0.0.0.0
rtmps.port8443
rtmps.ping_interval5000
rtmps.max_inactivity60000
rtmps.max_keep_alive_requests-1
rtmps.max_threads20
rtmps.acceptor_thread_count2
rtmps.processor_cache20
# RTMPS Key and Trust store parameters
rtmps.keystorepasspassword
rtmps.keystorefileconf/keystore.jks
rtmps.truststorepasspassword
rtmps.truststorefileconf/truststore.jks
 
# RTMPT
rtmpt.host0.0.0.0
rtmpt.port8088
rtmpt.ping_interval5000
rtmpt.max_inactivity60000
rtmpt.max_handshake_time5000
rtmpt.max_keep_alive_requests-1
rtmpt.max_threads20
rtmpt.acceptor_thread_count2
rtmpt.processor_cache20
rtmpt.encoder_base_tolerance5000
rtmpt.encoder_drop_live_futuretrue
# better setting for streaming media
rtmpt.target_reponse_size32768
# best setting for small messages or shared objects
#rtmpt.target_reponse_size8192
# max incoming messages to process at a time. the most that FP appears to send is 166
rtmpt.max_in_msg_process166
# max time in millis that we will wait when offering data to the in or out queue
rtmpt.max_queue_offer_time125
# max offer attempts
rtmpt.max_queue_offer_attempts4
 
# WebSocket
ws.host0.0.0.0
ws.port8081
 
# Debug proxy (needs to be activated in red5-core.xml)
proxy.source_host127.0.0.1
proxy.source_port1936
proxy.destination_host127.0.0.1
proxy.destination_port1935
 
# JMX
jmx.rmi.hostlocalhost
jmx.rmi.port9999
jmx.rmi.sport9998
jmx.rmi.port.remoteobjects
jmx.keystorepasspassword
jmx.mina.monitor.enablefalse
jmx.mina.poll.interval1000
# Whether to always create the registry in-process, not attempting to 
# locate an existing registry at the specified port. Set to true in order
# to avoid the overhead of locating an existing registry when you always intend
# to create a new registry in any case.
jmx.registry.createtrue
# Whether or not the MBeanServerFactoryBean should attempt to locate a running 
# MBeanServer before creating one
jmx.reuse.existing.servertrue
# Whether to register the MBeanServer with the MBeanServerFactory, making it 
# available through MBeanServerFactory.findMBeanServer()
jmx.register.factorytrue
# Whether any threads started for the JMXConnectorServer should be started as daemon threads
jmx.daemontrue
# Whether the JMXConnectorServer should be started in a separate thread
jmx.threadedtrue
 
# Server properties
# max events to send in a single update
so.max.events.per.update64
so.scheduler.pool_size4
keyframe.cache.entry.max500
war.deploy.server.check.interval600000
fileconsumer.delayed.writetrue
fileconsumer.queue.size120
subscriberstream.buffer.check.interval5000
subscriberstream.underrun.trigger100
broadcaststream.auto.recordfalse
启动Red5
双击red.bat即可启动Red5服务器
浏览器访问查看是否搭建成功
http://localhost:port(localhost、port为配置文件中设置) 正确如下图所示


视频直播开始准备
下载demo
上图可以看到install红色的那行字。点击进去。选择OLFA 安装

如果下载不成功请看这里
确定webapps下面没有oflaDemo文件夹。下载小帅丶准备好的压缩包解压放进去即可

下载地址链接:

查看Settings区域。选择Video后在Device中选择摄像头并点击Start出现视频画面(有可能会提示是否允许。选择允许即可)

Server设置
回到Server画面在Location中输入rtmp://localhost:1935/oflaDemo地址与red5.properties中的rtmp协议的设置必须相同。
点击Connect

右侧出现NetConnection.Connect.Success 说明连接服务器成功。

推送视频流
切换到Video点击Publish页面中的Publish按钮即可对外发布直播

查看视频流
切换到Server点击play即可看推送的视频流

用自己的页面观看直播
需要jwplayer。为了方便大家已经放在oflaDemo里面。在上面的百度云链接下载即可。

修改相关内容 file的值是直播页面的Name的值。streamer则为Location里面的URL

html
head
titleRed5 - OFLADemo/title
script typetext/javascript srcjwplayer.js/script
/head
body
div idplayer
script typetext/javascript
  jwplayer(player).setup({
flashplayer: player.swf,
file: 直播页面的Name,
streamer: rtmp://自己服务的IP:1935/oflaDemo,
controlbar: bottom,
width: 848,
height: 360
  });
/script
/div
/body
/html

前言

相信很多小伙伴在日常开发中都有遇到开发直播的需求是不是感觉无从下手如果你刚好看到这篇博客那么你真的来对地方本篇文章将详细的讲解如果手把手的搭建直播平台最终效果为手机或者电脑端实时抓取摄像头数据实现推流服务端拉流。

一、概念理解

要做一个这样的直播平台首先要理解概念就是数据怎么传输的概括的说现在实现直播通常用的协议是RTMP/RTSP当然不仅仅是这两个只是主流是这两个。参考文章RTSP协议学习,我截取了一张结构图片供参考

通过上述图片相信大家都能够理解RTSP协议简单来说就是实时传输协议TCP和UDP之上建立的应用层协议。至于什么是应用层协议你可以这样理解就好像四川人之间用四川话交流河南人之间用河南话交流一样只是双方约定好的一种消息传输格式。如果你感兴趣也可以去百度看看如何自定义网络通信协议。

其实我们本次实现利用的是RTMP协议RTSP只是为了帮助我们理解只要对比RTMP和RTSP的相同点和不同点那么就可以很好的理解RTMP协议RTMP和RTSP的异同大家可以去查阅相关文档理解这里不做赘述。

二、实战

1.流媒体服务器搭建

理解了上面的概念之后我们会发现问题更加的清晰了我们要如何才能实现这样一个功能核心就是需要搭建一个服务这个服务能够通过RTMP协议实现音视频流的接收并推送。那么问题又来了搭建一个这样的服务难吗要用什么语言开发呢我完全不知道怎么下手别担心既然我们能够想到肯定有大佬早都想到了这个问题了开源项目srs可以完美的解决我们的问题这个项目是国人开源的不得不感慨国人真的越来越牛了。同时srs支持docker部署参考链接/ossrs/srs-docker/tree/dev#usage只要5分钟你就可以搭建一个自己的流媒体服务器了。搭建成功后你可以访问服务器地址查看是否正确启动访问地址http://192.168.1.9:1985/console/我在虚拟机启动所以这里是我们虚拟机地址你只需要修改为自己的地址即可。启动后的界面大致张下面这样

2.windows端实现推流

windows端推流可以参考一款软件叫做OBS这款软件可以实现摄像头推流和你本地视频推流。

上传视频后点击设置推流地址

设置成功后即可在srs看到有新的流接入

点击预览即可观看该地址也可以通过其他进行播放例如VLC等流媒体播放器。

3.android端实现推流

android端要稍微麻烦一点这里推荐一个开源项目/begeekmyfriend/yasea,这个项目是一个安卓应用克隆代码后导入android studio如果你完全不懂怎么导入项目你可以参考下面两篇博客

安装 | Android studio 3.5.2安装教程

规范导入android项目

导入项目后即可使用android生成自己的apk包生成后即可安卓到手机安装后效果如下还可以通过右上角开美颜额

点击pushlish即可实现向流媒体服务器推流即可通过流媒体服务器实时接收音视频数据这个和windows端一样这个推流地址也可以通过VLC等播放器播放最终流媒体效果如下

上面的基础我们就可以基于上述做很多定制化的开发例如流媒体播放器我们完成可以通过ffmpeg实现实时拉流通过webscoket展示在浏览器等操作等等。在android端也可以改造Yasea代码加入自己的一些操作等等。

如果你都看到这里了刚好这篇文章对你也有一定的帮助给个点赞鼓励一下吧谢谢如果不正确的请指正。