视频直播解决方案

视频直播解决方案背景当下,视频直播行业在中国逐渐走红。在刚刚过去的2015年,视频直播成为互联网行业最抢眼的领域之一。从游戏到秀场,从传统的网页端到移动互联网,各大直播平台包括斗鱼、熊猫tv、虎牙战旗还有纯移动端的印客、易直播等,群雄割据。言归正转,毕竟本文是一篇技术博客,接下来让我们从技术的角度分析如何搭建一个自己的直播平台。流程图首先让我们看一下直播整体流程。首先是直播视频采集端,

大家好,又见面了,我是你们的朋友全栈君。

背景

当下,视频直播行业在中国逐渐走红。在刚刚过去的2015年,视频直播成为互联网行业最抢眼的领域之一。从游戏到秀场,从传统的网页端到移动互联网,各大直播平台包括斗鱼、熊猫tv、虎牙战旗还有纯移动端的印客、易直播等,群雄割据。言归正转,毕竟本文是一篇技术博客,接下来让我们从技术的角度分析如何搭建一个自己的直播平台。

流程图

首先让我们看一下直播整体流程。直播流程图
首先是直播视频采集端,由主播通过摄像头手机等采集设备,采集视音频流,编码后采用RTMP协议1推流到直播流服务器。这里采用H.264[^H.264]编码对视频流进行编码,使用AAC2对音频流进行编码,采用这两种编码的原因是hls协议3要求使用这两种编码。 接下来直播服务器会对从采集端推送的流进行一定的处理。比如,hls协议会将视频流切片成一个个的TS视频文件缓存在服务器中,同时生成一个m3u8文件记录了视频流中的包含的TS文件。 之后如果有播放器请求某一个直播链接,服务器会使用RTMP或者hls协议将流推送到播放器。那么我们该如果根据情况选择这两种协议呢。首先,我们需要明确一点,这两种协议各有利弊。如下所示:

  RTMP hls
Company Adobe Apple
平台支持 FlashPlayer 
等一些网页端的播放器 
移动端 Vitamio
Apple产品原生支持,
Android3.0以上原生支持 桌面机的浏览器需要使用一些第三方库,如JWPlayer
延迟 三秒左右的延迟,实时性较高 根据TS长度不同而不同,一般会有10s以上的延迟

综合以上因素,我们认为如果对实时性要求较高,那么使用RTMP会比较好。网页端使用RTMP会比较好,因为Flash Player原生支持,而大多数的浏览器都会安装Flash player。而在移动端如果对实时性要求不高,那么采用hls比较好,因为ios包括3.0以上的安卓都原生支持hls协议。接下来本文将根据以上的三个步骤的具体实现分别展开说明,为了篇幅考虑,我们会将一些内容放到子文章中。

视频采集与编码

视频采集可以有多重途径,比如通过电脑摄像头,通过OBS等录屏软件进行录屏,通过手机摄像头采集。由于目前户外直播和移动互联网很火,所以我们就选择实现在安卓设备上通过摄像头采集视频流(其实是因为我是写安卓的= =)。 为了实现这一功能,我们使用了一个开源项目javacv 它包含了一些在计算机视觉领域应用比较多的库,我们主要使用的是它的FFMpeg库。使用FFMpeg的FFMpegFrameRecoder类,我们能够方便地将从android摄像头采集到的帧传输到服务器。具体的通过Camera和FFMpeg推流到服务器的实现请看我们的另一篇文章Android使用FFMpeg实现推送视频直播流到服务器。另外FFMpeg也支持H.264和AAC编码。

直播流服务器

关于直播服务器,我们选择使用我们中国人开发的一个开源项目——srs,它支持RTMP/HTTP/RTSP等协议的流输入,支持RTMP/HDS/HLS/HTTP等协议的流输出,同时它也支持集群。给作者点赞。 
关于srs的安装和使用可以直接看它在github上的wiki,这里不再赘述。需要注意的一点是该项目在centos 6.x 和ubunut12.x上能正常编译通过,但是在比如我使用的ubuntu14.04上会有一些依赖包的缺失。所以为了方便考虑的话,读者可以在centos和ubuntu12.x上进行test。

播放器

我们在试验的过程中,使用多种播放器和库在全平台实现了rtmp和hls的播放。在网页端使用了videojs,在安卓端使用vitamio。具体的实现请看我们的另外一篇如何在网页端和移动端播放rtmp和hls视频流

总结

当然本文中的解决方案只是最简单的,对于直播服务器集群,直播间的创建和管理,直播间直播密码和权限,内容分发网络CDN都没有进行深入的研究。但是通过本实验性项目,我认为对于我们了解整个直播的业务流程还是很有帮助的。

相关文件推荐

相关项目

  1. Real Time Messaging Protocol (RTMP) was initially a proprietary protocol developed by Macromedia for streaming audio, video and data over the Internet, between a Flash player and a server. Macromedia is now owned by Adobe, which has released an incomplete version of the specification of the protocol for public use. (reference from wikipedia )
    Flash Player是天生能够播放RTMP流的,所以RTMP流可以在网页上得到很好的支持,另外也有很多其他浏览器能够支持播放RTMP流,如比较知名的JW player,videoJS。另外RTMP流的延迟只有3s,比较适合一些实时性和互动性较高的直播。 

  2. AAC(Advanced Audio Coding),中文名:高级音频编码,出现于1997年,基于MPEG-2的音频编码技术。由Fraunhofer IIS、杜比实验室、AT&T、Sony等公司共同开发,目的是取代MP3格式。2000年,MPEG-4标准出现后,AAC重新集成了其特性,加入了SBR技术和PS技术,为了区别于传统的MPEG-2 AAC又称为MPEG-4 AAC。 

  3. HLS (HTTP Live Streaming),Apple的动态码率自适应技术。主要用于PC和Apple终端的音视频服务。包括一个m3u(8)的索引文件,TS媒体分片文件和key加密串文件。 

连接地址:https://github.com/beautifulSoup/RtmpRecoder/tree/master
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/162848.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux 文件系统与日志分析「建议收藏」

    Linux 文件系统与日志分析「建议收藏」文章目录1.前言2.深入理解Linux文件系统2.1inode与block详解(1)inode和block概述1.前言2.深入理解Linux文件系统2.1inode与block详解(1)inode和block概述  文件是存储在硬盘上的,硬盘的最小存储单位叫做“扇区”(sector),每个扇区存储512字节。一般连续八个扇区组成一个“块”(block),一个块是4K大小,是文件存取的最小单位。操作系统读取硬盘的时候,是一次性连续读取多个扇区

    2022年5月9日
    45
  • srvctl start_局部视图的配置规定是

    srvctl start_局部视图的配置规定是SRVCTL概述SRVCTL是ORACLERAC集群配置管理的工具,可以管理Database、Instance、ASM、Service、Listener和NodeApplication,NodeApplication包括GSD,ONS,VIP。srvctl的命令格式为srvctl<command><target>[options]srvctlUs…

    2022年9月12日
    0
  • python缩进块_Python缩进规则(包含快捷键)「建议收藏」

    和其它程序设计语言(如Java、C语言)采用大括号“{}”分隔代码块不同,Python采用代码缩进和冒号(:)来区分代码块之间的层次。在Python中,对于类定义、函数定义、流程控制语句、异常处理语句等,行尾的冒号和下一行的缩进,表示下一个代码块的开始,而缩进的结束则表示此代码块的结束。大理石平台精度等级注意,Python中实现对代码的缩进,可以使用空格或者Tab键实现。但无论…

    2022年4月8日
    99
  • ntp服务器ntp协议时间戳,计算机的时钟(一):NTP 协议[通俗易懂]

    ntp服务器ntp协议时间戳,计算机的时钟(一):NTP 协议[通俗易懂]本系列文章主要介绍计算机系统中时钟的处理。主要内容包含NTP,Lamport逻辑时钟,向量时钟,TrueTime等。本文是第一篇,介绍NTP协议。电脑的时钟不知道你注意过没有,假如隔了好几天打开你的电脑,任务栏的时间依然是显示正确的,即使你的电脑没有联网,这是如何做到的?post-quartz.png计算机的主板上有一个石英晶体振荡器和一个纽扣电池。石英晶体振荡器的频率是32768Hz每秒。在通电…

    2022年10月12日
    0
  • 有效管理自己知识,多总结和分享——2018七月份的尾巴

    知道却做不到,等于不知道! –笔记侠 知道却讲不出来,也等于不知道! –dufy知道 ≠ 能做到 | 知道 ≠ 能讲出 ?昨天听了一个音频,里面说:“知道很多道理 却依然过不好这一生”!知道了这么多道理,能真正做到有多少呢?知道了这么多道理,真正用自己的理解或者自己的话能表达的道理又有多少呢?我在反思自己,希望与你共勉!分享:好的学习方法 — 费曼技巧…

    2022年2月27日
    40
  • vim插件管理工具pathogen[通俗易懂]

    vim插件管理工具pathogen[通俗易懂]因为vim编辑的时候,实在记不住复杂的目录结构,为了更方便展示,所以想到安装树形目录插件,自然是用到最多的NERDTree。说到安装vim插件首先需要安装vim插件管理工具啊。简单说一下vim插件管理工具pathogen,官网http://www.vim.org/scripts/script.php?script_id=2332。

    2022年10月25日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号