轮子之路-搭建小型视频转发系统_视频流转发服务器部署-程序员宅基地

技术标签: red5  设计  ffmpeg  开发实战  

前言

本文结合作者实际项目经历介绍如何搭建一个小型的视频直播系统,包括设计思路,开发过程以及优化方向还有踩过的坑。

功能梳理

2014年由于项目要求需要具备将远端的现场视频信息回传到以供多个地方的用户同时查看的功能,同时由于系统采用B/S架构,因此视频只能通过浏览器来访问,而且系统基本浏览器按照chrome设计,因此视频实时浏览必须支持chrome,此外,还需要支持历史回放。


需求总结如下:
1. 支持实时视频的预览
2. 支持历史视频的回放
3. 支持20用户的同时浏览
4. 支持chrome浏览器
5. 支持现场RTSP的视频流


设计思路

问题分析

好了有了大致的功能列表,我们可以进行开始系统的实现了。
首先必然是调研了,因为之前并不是十分了解这方面情况。调研也是要有目标,因此我大体梳理出来了如下几个问题
1. 目前有没有类似的系统,现在哪几种解决方案
2. 如何能够满足多用户的同时查看实时视频
3. 目前通过浏览器来查看实时视频
4. RTSP视频流是什么?

现状了解

有经过一番google和百度之后有了如下的发现

  1. 现有的直播系统大多需要采购硬件或系统,经费都是10w以上的
  2. 要想满足多用户同时看实时视频需要一个叫流媒体服务器的东西,主要由fms,red5,srs等现成软件
  3. 一般的web播放器是无法播放rtsp视频的,有一款vlc的插件之前能在chrome下观看视频,但现在由于安全性问题chrome已经不支持这个插件了,web视频播放器中大部分支持rtmp或hls的实时视频流。
  4. 有不少方案可以将rtsp转为rtmp视频流

    经过以上调研,就有了下面的大体设计思路,建立一个视频转发服务,将现场的rtsp视频流转为rtmp视频流发送到流媒体服务器,用户通过web视频播放器播放流媒体服务器的rtmp视频流。

选型调研和验证

有了以上的思路,就展开了第二轮调研,主要是对于流媒体服务器选型,web播放器的选型以及最重要的视频转码方案的确定。
流媒体选型方向:
在网络上流媒体服务器的资料最为丰富的是red5和fms,fms是商业软件需要购买的因此就选了red5,同时发现了一个神器adobe的live encoder这个软件就能将摄像头的视频转为rtmp的视频流,同时发现有一个fvplayer就能直接播放视频。
流媒体选型涉及到一个关键的20并发的性能指标,我们就是通过搭建了live encoder+fvplayer+red5的测试平台快速验证了red5的性能指标。
web播放器方向:
web视频播放器选择jwplayer,虽然也是商业软件,但免费版也能先凑用,
视频转码方向
关键的视频转发方案则选择了最为简单的ffmpeg 命令行的方式,
初步确定 的命令行大概是这样。

ffmpeg -i rtsp:url  -b:v 2000k -an -y rtmp://10.0.4.150/live/20150423201047382

在这些问题确定后,我们的视频转发系统的总体设计就完成了,由于我们系统还需要跟主要的业务系统联动,因此系统框图如下所示。
这里写图片描述

系统框图

实现思路

确定好设计方案,实现就相对简单了。
整体实现可以被划分为下面几个阶段

  1. Red5的部署和调试
  2. Ffmpeg的命令行的设计和调试
  3. web前端的开发
  4. 视频转发控制模块的开发

    流媒体服务器实现

    red5 的部署网络上有相当多的资料可以查询到,这里就不再赘述了。
    Ffmpeg的命令行主要可以分为输入配置,输出配置,保存配置这三块,输入配置和保存配置较为简单,需要注意的是输入配置中需要确定rtsp的视频源url这个是根据不同设备不同的。而输出配置最为复杂配置项又可以分为带宽,编码,格式,帧率,进程等部分。最终命令行如下所示(针对海康的视频服务器),

ffmpeg -i rtsp://admin:[email protected]:554/PSIA/streaming/channels/101 -c copy -vcodec libx264 -f flv -r 25 -threads 0 -b:v 2000k -an -y rtmp://20.10.114.150/live/20150423201047382 "C:/Z111W/out.mp4" 

Web前端实现

web前端开发也是很简单,html+js就能搞定,jwplayer的初始化代码如下所示。

<html>  
<head>  
<script src="/jwplayer/jwplayer.js"></script>  
</head>  
<body>  
<div id='myplayer'></div> <script type='text/javascript'>      
 jwplayer('myplayer').setup({         
 file: 'rtmp-url',         
 width: '640',          
 height: '480'     });   
</script>  
</body>  
</html>

视频转发控制模块实现

视频转发控制器初期功能其实很简单,就是根据视频源的信息,解析为ffmpeg的命令行配置参数,最后再启动ffmpeg进行视频转发。整体采用springboot框架,采用restful接口与业务系统对接,通过直接调用cmd ffmepg的方式启动视频转发。

系统联调

在开发环境内的局域网的测试联调还是比较顺利的,系统初步开发完成。

填坑之旅

自己造轮子最有挑战性的阶段并不是开发阶段,而是后来的填坑阶段
要填的坑有以下几个

  1. 视频转发如何结束
  2. 历史回放如何实现
  3. 实际高动态视频在有限带宽下的转发调优
  4. 如何支持rtsp之外的视频流
  5. 能同时转发多少路视频以及优化方向


    由于篇幅原因,这里就不一一详细说明这几个坑是怎么填的,这里只是给出几个大体思路
    1.通过管理转发线程id,视频转发任务id的对应的表,在要进行结束转发时发送ctrl+c指令到对应的线程停止视频转发
    2.通过将保存的实时视频归档到red5的live文件夹下,通过业务系统的记录归档的文件名返回用户,用户通用通过jwplayer读取历史文件进行回放
    3.试验试验试验
    4.通过扩展视频转发模块来组合命令行扩展ffmpeg支持的视频流,对于不支持的视频流则采用前置硬件转码器进行转码譬如h265;
    5.通过重构视频转发模块采用执行转码的模块与控制模块分离的策略,通过消息中间件来实现控制与转码模块的对接,利用转码服务集群的水平扩展提高视频转发性能。


回顾与反思

该系统随着时间的推移,经过不断的重构所用技术甚至架构已经跟最开始的设计非常不一样的,这个过程正好体现了系统演进的过程。
说明了一个普遍现象只要时间和资源不是问题,那么技术本身就不是问题。
DRY在开发上是真理,但在技术成长上优势偶尔突破一次也会有不同的收获。
人有多大胆,地有多大产啊,但这是建立在技术直觉的基础上的,否则就是只挖坑不填坑。

总结

最后,这个系统并不复杂,但我希望在搭建和开发这个系统的思路还是对大家是有帮助的。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhaoenweiex/article/details/65938547

智能推荐

Java 并发学习笔记:JUC中锁,aotimc,AQS并发工具类,附加:常用的线程安全_java提供哪些工具类解决并发环境下的安全问题-程序员宅基地

文章浏览阅读206次。synchronized中文意思是同步,也称之为”同步锁“。synchronized的作用是保证在同一时刻, 被修饰的代码块或方法只会有一个线程执行,以达到保证并发安全的效果。synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。在JDK1.5之前synchronized是一个重量级锁,相对于j.u.c.Lock,它会显得那么笨重,随着Javs SE 1.6对synchronized进行的各种优化后,synchronized并不会显得那么重了。_java提供哪些工具类解决并发环境下的安全问题

sql字段null参与运算 sql date_null 参与演算-程序员宅基地

文章浏览阅读2k次。1 如果一个表中存在一个字段的值为null1 computer 699 25 15 2 printer 365 36 3 telephone 280 159 57 select id, price * (amount + exct) from Products; 存在exct的值为null 无法参与运算 select id, price * (amount + IFNULL_null 参与演算

二维码图片怎么转链接?怎么分解二维码成链接网址?_易语言图片转网址-程序员宅基地

文章浏览阅读582次。相信很多小伙伴都知道将链接生成二维码怎么操作,那么当我们需要将二维码转链接的要求时,大家知道该如何操作吗?想要教二维码图片分解成链接,那么就需要使用二维码生成器的解码功能来处理,下面教大家在线分解二维码图片的操作方法,只需简单的操作就可以完成。复制链接到浏览器就可以获取到二维码中展现的内容。点击右上方的【解码】按钮。在操作页面上传二维码图片。_易语言图片转网址

整理了3家面试问题:美团+字节+腾讯,个个三面,你认为你能走到哪一面?_互联网公司三面问什么-程序员宅基地

文章浏览阅读229次。2020年,莫名的感觉自己度过了最艰难而又漫长的一年!炒鱿鱼,跳槽不顺,就像家常便饭一样。2020也是迄今为止我投简历最多的一年了,天天面试天天挂,要多糟心有多糟心…不过我始终坚信,机会永远是留给坚持不懈与努力的人的,所以很庆幸,我抓住了2020年的年尾吧,上岸了腾讯!回顾这一年,我的付出终归是没有白费的!很快,今天又是2021年02月19号了,激烈的金三银四已经没有多少日子就有上场了!所以今天,我挑选了“美团+字节+腾讯”等三家的一二三面问题,在此篇文章里做一个分享,希望看到的朋友可以做一个面试参考,并_互联网公司三面问什么

Blender:创建基本几何体及自动贴图_blender 自动上纹理-程序员宅基地

文章浏览阅读1.4k次。废话少说,直接上代码。参考链接https://blender.stackexchange.com/questions/21589/how-can-i-add-a-cubehttps://blender.stackexchange.com/questions/157531/blender-2-8-python-add-texture-imagehttps://blender.stackexchange.com/questions/57446/create-named-objecthttps://bl_blender 自动上纹理

goland经过eval reset 后出现Unresolved reference但是能正常运行_goland eval reset-程序员宅基地

文章浏览阅读983次。如题,用eval reset了goland编译器后,重新进入时会有些包函数标红,显示Unresolved reference,但是是可以正常运行的,网上找了些解决方案,主要是通过File->Invalidate Caches解决。我试了几次都不行,后来发现得在Invalidate Caches那勾选第一个选项:Clear file system cache and Local History,默认只勾选了第二个选项,把第一个选项也勾选了然后点击Invalidate and Restart就行了。..._goland eval reset

随便推点

十三、Spring Data JPA 入门 - 测试项目创建_spring data jpa快速入门 datajpatest-程序员宅基地

文章浏览阅读1.3k次。十三、Spring Data JPA 入门 _spring data jpa快速入门 datajpatest

java与MySQL做购物系统_基于java和MySQL的购物系统源代码-程序员宅基地

文章浏览阅读755次。【实例简介】是一个很实用很基础的的购物系统,包含注册,登录,查看商品,分类查询,购物车,购买商品等功能【实例截图】【核心代码】ShoppingSystem└── ShoppingSystem├── src│ ├── action│ │ ├── LoginAction.java│ │ ├── LoginOut.java│ │ └── RegisterAction.java..._java jsp mysql 购物系统

TOPSIS(逼近理想解)算法原理详解与代码实现_逼近算法-程序员宅基地

文章浏览阅读5.7k次,点赞11次,收藏65次。写在前面:个人理解:针对存在多项指标,多个方案的方案评价分析方法,也就是根据已存在的一份数据,判断数据中各个方案的优劣。中心思想是首先确定各项指标的最优理想值(正理想值)和最劣理想值(负理想解),所谓正理想值是一设想的最好值(方案),它的的各个属性值都达到各候选方案中最好的值,而负理想解是另一设想的最坏的值(方案),然后求出各个方案与正理想值和负理想值之间的加权欧氏距离,由此得出各方案与最优方案的接近程度,作为评价方案的优劣标准,最后得到各个方案的优劣值。目录一、TOPSIS算法1.1 .._逼近算法

css音量调节,CSS3 音量调节旋钮-程序员宅基地

文章浏览阅读702次。CSS语言:CSSSCSS确定ul {height: 40px;left: 50%;margin-left: -100px;margin-top: -20px;position: absolute;top: 50%;text-align: center;width: 200px; }.knob {background: -webkit-repeating-linear-gradient(145de..._css 音量调节

NOI2012 迷失游乐园【基环树随机游走问题】-程序员宅基地

文章浏览阅读226次。题目描述:基环树/树,随机起点,随机游走,不能走重复点,有边权,问期望路径长度。n≤100000n\le100000n≤100000,环长≤20\le 20≤20洛谷链接题目分析:设fuf_ufu​表示uuu点向下走的期望长度,sonuson_usonu​表示儿子个数:fu=1sonu∑vfv+wu,vf_u=\frac 1{son_u}\sum_v{f_v+w_{u,v}}fu​=sonu​1​v∑​fv​+wu,v​对于不在基环树上的点,设它向上走(意味着不再进入子树)的期望长度为 gug_基环树随机游走

PWM的驱动使用(呼吸灯)_void pwm_setcompare1(uint16_t compare)-程序员宅基地

文章浏览阅读3.4k次,点赞5次,收藏40次。本章内容讲述的是PWM的代码用法,项目使用的是呼吸LED灯,内容有:PWM的配置步骤、PWM函数、PWM初始化和引脚配置。_void pwm_setcompare1(uint16_t compare)