HLS 是 HTTP Live Streaming 的缩写,是苹果开发的一种基于 HTTP 的自适应比特率流媒体传输协议, 并于 2009 年. HLS 流媒体已经成为应用最广泛的实时视频协议。它是一种将流分解成基于文件小段的格式, 可以通过 HTTP 下载,HLS 可以通过标准的 HTTP 或代理服务器等,这和基于 UDP 的协议(例如 RTP)不同。既然 HLS 现在如此受欢迎,那么它有那些优点和缺点呢。

优点

  • 应用广泛

  • 首先,刚才已经提到过,HLS 是应用最惯犯的实时视频协议。虽然最初苹果是为了自己的生态设计的,例如 IOS,Safari 浏览器等,但是背靠苹果,有强大的生态和研发能力,现在它几乎在所有浏览器上实现了。虽然现在的主流浏览器都支持一个类似的标准,称为 MPEG DASH,但是由于苹果 Safari 浏览器和 IOS 设备不支持它,个人认为 HLS 是一个更好的选择。

  • 自适应比特率

  • HLS 另一个巨大的优势是,它允许客户端根据可用带宽,从各种质量流中选出合适的。HLS 分解成一个个大约 10 秒的文件小段,通过分解,客户端应用程序只需要提前缓冲 10 秒。为用户节约了大量潜在带宽。

缺点

  • 糟糕的延迟

  • 虽然 HLS 设计出来是为了高效的处理多质量的流,但它并不是为了快速传输视频设计的。实际上,HLS 在流中引入流相当长的延迟,一般 20 秒左右,甚至更久。

  • 说到这里,你可能想问为什么?HLS 需要三个片段在队列中才允许回放,片段被视频中的关键帧分割。用 HLS 创建超低延迟流的唯一方法就是每 250 毫秒出现一个关键帧的视频进行编码,HLS 播放列表窗口将是四项长度,增加正在发生的 HTTP 调用频率,并给服务器增加额外的压力。

  • 未发布

  • HLS 是一个仅供用户使用的协议。不像 WebRTC 有从浏览器发布的规范,HLS 仅支持播放流,如果你想发布一个设备的实时视频流,你只需要寻找其他的 SDK ,国外的例如 Red5 Pro(场景较为单一,巨贵), 来创建使用 RTP 的发布应用程序,然后通过 HLS 中继这些流,让人们在浏览器中查看。

  • 国内有几个较为成熟的音视频 SDK,例如声网等平台,提供很多场景的音视频解决方案。

HLS 简单介绍完了,接下来演示一个小 Demo, 使用 FFmpeg,可以很轻易的将 mp3 文件转换为 HLS 格式,它由多个文件组成,其中一个包含元数据(.m3u8),元数据告诉客户端从哪里获取每个数据文件,以及数据文件中包含什么内容。数据文件拓展名是.ts,通常包含 10 秒的音频。

首先准备一个 mp3 文件。然后安装 FFmpeg,在 Mac 上安装 FFmpeg,如果速度很慢可以尝试切换镜像。

1 brew install ffmpeg
2

  

成功安装后,进入 mp3 所在文件夹,执行以下指令。

1 ffmpeg -i 江南.mp3 -c:a libmp3lame -b:a 128k -map 0:0 -f segment -segment_time 10 -segment_list outputlist.m3u8 -segment_format mpegts output%03d.ts
2

  

执行完毕后应该会看到一些结果,大致内容如下.

1 output000.ts  output008.ts  output016.ts  output024.ts
2 output001.ts output009.ts output017.ts output025.ts
3 output002.ts output010.ts output018.ts output026.ts
4 output003.ts output011.ts output019.ts outputlist.m3u8
5 output004.ts output012.ts output020.ts 江南.mp3
6 output005.ts output013.ts output021.ts
7 output006.ts output014.ts output022.ts
8 output007.ts output015.ts output023.ts
9

  

到这一步你已经完成了文件格式转换,接下来进入 Coding 阶段。

项目结构

代码如下

1 package main
2
3 import (
4 "fmt"
5 "log"
6 "net/http"
7 )
8
9 func main() {
10 // 设置文件目录
11 const songsDir = "song"
12 const port = 8888
13
14 http.Handle("/", http.FileServer(http.Dir(songsDir)))
15 log.Printf("Serving %s on HTTP port: %v\n", songsDir, port)
16
17 log.Fatal(http.ListenAndServe(fmt.Sprintf(":%v", port), nil))
18 }
19

 

运行代码

1 go run main.go
2

打开浏览器地址

1 http://127.0.0.1:8888/outputlist.m3u8
2

恭喜你,你可以听到这段 mp3 动人的旋律了。但是如果你想进一步进行商业开发,或者个人开发,推荐使用比较成熟的解决方案,一是音视频不分家,音频需求往往伴随着视频需求,音视频往往是开发过程中的某一个子需求,如果在上面耗费大量时间,往往会耽误项目进度,而且处理起多个平台时往往有一些细节上的坑。使用市面上的 SDK,能够很大程度上节约开发成本。我个人在使用的声网,能够支持跨平台,最最最关键,每个月能够白嫖一定的额度,对于个人开发者来说十分友好。当然了,费用其实是一方面,还有相当重要的一点就是能够几行代码即可接入,大大较少了踩坑量!

总结

正如你所见,HLS 广泛应用在各种平台,移动端,浏览器的普遍支持,让它成为开发者分发流给用户的一个很好的选择。但是,凡事都有但是,因为 HLS 是一个比较慢的协议,虽然苹果的规则似乎相当严格,当涉及到 IOS 流媒体需求时,实际上还是比较灵活的。如果你想通过它去构建一些实时通信的程序,那么它可能不太适合你。最后,如果想要实现比较实时的通信系统,最好借助于市面上其他比较成熟的解决方案,它更适合实时性要求不那么高的场景,在苹果的生态体系下构建的应用。

基于 HLS 创建 Golang 视频流服务器的更多相关文章

  1. Comet:基于 HTTP 长连接的“服务器推”技术解析

    原文链接:http://www.cnblogs.com/deepleo/p/Comet.html 一.背景介绍 传统web请求,是显式的向服务器发送http Request,拿到Response后显示 ...

  2. Comet:基于 HTTP 长连接的“服务器推”技术

    “服务器推”技术的应用 请访问 Ajax 技术资源中心,这是有关 Ajax 编程模型信息的一站式中心,包括很多文档.教程.论坛.blog.wiki 和新闻.任何 Ajax 的新信息都能在这里找到. c ...

  3. 转载:Comet:基于 HTTP 长连接的“服务器推”技术

    转自:http://www.ibm.com/developerworks/cn/web/wa-lo-comet/ 很多应用譬如监控.即时通信.即时报价系统都需要将后台发生的变化实时传送到客户端而无须客 ...

  4. Apache Solr采用Java开发、基于Lucene的全文搜索服务器

    http://docs.spring.io/spring-data/solr/ 首先介绍一下solr: Apache Solr (读音: SOLer) 是一个开源.高性能.采用Java开发.基于Luc ...

  5. 基于腾讯Centos7云服务器搭建SVN版本控制库

    基于腾讯Centos7云服务器搭建SVN版本控制库 最近在和小伙伴组队参加一个关于人工智能的比赛,无奈不知道怎么处理好每个人的代码托管问题,于是找到了晚上免费svn托管服务器的服务,但是所给的免费空间 ...

  6. 【重点突破】——使用Express创建一个web服务器

    一.引言 在自学node.js的过程中有一个非常重要的框架,那就是Express.它是一个基于NodeJs http模块而编写的高层模块,弥补http模块的繁琐和不方便,能够快速开发http服务器.这 ...

  7. [转载] Comet:基于 HTTP 长连接的“服务器推”技术

    转载自http://www.ibm.com/developerworks/cn/web/wa-lo-comet/ “服务器推”技术的应用 传统模式的 Web 系统以客户端发出请求.服务器端响应的方式工 ...

  8. 基于 HTML5 WebGL 的 3D 服务器与客户端的通信

    这个例子的初衷是模拟服务器与客户端的通信,我把整个需求简化变成了今天的这个例子.3D 机房方面的模拟一般都是需要鹰眼来辅助的,这样找产品以及整个空间的概括会比较明确,在这个例子中我也加了,这篇文章就算 ...

  9. 基于线程开发一个FTP服务器

    一,项目题目:基于线程开发一个FTP服务器 二,项目要求: 基本要求: 1.用户加密认证   2.允许同时多用户登录   3.每个用户有自己的家目录 ,且只能访问自己的家目录   4.对用户进行磁盘配 ...

  10. 基于VMware Workstation搭建开发服务器

    基于VMware Workstation搭建开发服务器   文章为本人原创,转载请联系作者并注明出处.晓松 源URL: https://www.jianshu.com/p/e62ab7de0124 我 ...

随机推荐

  1. sqlserver将查询中一行内容转化为多行内容

    WITH CTE AS( SELECT top 5 TaskID ,Attachments from [V_AllAccessoriesAompression])SELECT a.TaskID,c.A ...

  2. linux缓冲区溢出尝试

    #include <stdio.h>#include <string.h>char Lbuffer[] = "01234567890123456789======== ...

  3. Myeclipse导入项目提示已存在(Some projects cannot be imported because they already exist in the workspace)

    原因:在项目空间的文件夹中没有删除干净之前的项目,之前的项目和要导入的项目的名字相同,所以导致无法将项目导入.需要在项目空间中将有关的旧文件都清理干净. 1.将项目空间文件夹中的项目删除. 2.到:\ ...

  4. 【JavaScript】JS写法随笔(二) JS动态生成表格

    主要思路:通过Ajax请求后端接口并拿到结果list之后,然后通过DOM获取tbody并向tbody中添加行.单元格. $("#calculate").click(function ...

  5. ssh免密码登录服务器

    A机为本地主机(即用于控制其他主机的机器) B机为远程主机(即被控制的机器server)B机:192.168.3.145 假如A机无密码登录B机器     A机上的命令: 1,ssh-keygen - ...

  6. javascript原型,继承

    //普通对象 //函数对象(有原型 prototy 的属性) //原型的应用 继承 function Amial(){ this.type = '小于' } function cat(name){ t ...

  7. SVN报错:database is locked

    https://blog.csdn.net/k7arm/article/details/81168416 https://www.jianshu.com/p/aa9c67fcc407

  8. element ui动态生成表单数据与校验(后台传入数据)

    前言 最近有一个需求是通过后台返回的数据,生成表单并添加校验.在做的过程中,动态表单挺好做,关键是校验.困扰了我2天,最后通过查找资料和"运气"终于解决了.解决问题关键点:vue的 ...

  9. 正向代理和反向代理和spring的动态代理模式有几种?默认是那种?如何切换?

    spring的动态代理模式有几种?默认是那种?如何切换? spring的动态的代理模式有两种 JDK动态代理,基于接口(默认代理模式),CGLIB动态代理(若要使用需要进行配置) JDK动态代理是由j ...

  10. 【Unity】利用C#反射打印类的字段信息

    最近在用protobuf-net序列化功能生成.bytes配置文件时,遇到了需要把.bytes配置文件再另外转成Lua配置文件(Lua配置表内容举例)的需求.Lua配置文件需要记录配置类的各个字段名和 ...