基于HLS创建Golang视频流服务器的优缺点

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,如果速度很慢可以尝试切换镜像。

brew install ffmpeg

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

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

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

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

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

项目结构

代码如下

 package main

 import (
   "fmt"
   "log"
   "net/http"
 )

 func main() {
  // 设置文件目录
  const songsDir = "song"
  const port = 8888

  http.Handle("/", http.FileServer(http.Dir(songsDir)))
  log.Printf("Serving %s on HTTP port: %v\n", songsDir, port)

  log.Fatal(http.ListenAndServe(fmt.Sprintf(":%v", port), nil))
 }

运行代码

go run main.go

打开浏览器地址

http://127.0.0.1:8888/outputlist.m3u8

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

总结

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

到此这篇关于基于 HLS 创建 Golang 视频流服务器的文章就介绍到这了,更多相关Golang 视频流服务器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅谈Golang中创建一个简单的服务器的方法

    我们知道,golang中的net/http包对网络的支持非常好,这样会让我们比较容易的建立起一个相对简单的服务器,我们来看一段代码 func sayHi(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w,"Hi") } func main() { http.HandleFunc("/sayHi", sayHi) log.Fatal(http.ListenAndServe("localhost:80

  • 详解如何热重启golang服务器

    服务端代码经常需要升级,对于线上系统的升级常用的做法是,通过前端的负载均衡(如nginx)来保证升级时至少有一个服务可用,依次(灰度)升级. 而另一种更方便的方法是在应用上做热重启,直接升级应用而不停服务. 原理 热重启的原理非常简单,但是涉及到一些系统调用以及父子进程之间文件句柄的传递等等细节比较多. 处理过程分为以下几个步骤: 监听信号(USR2) 收到信号时fork子进程(使用相同的启动命令),将服务监听的socket文件描述符传递给子进程 子进程监听父进程的socket,这个时候父进程和

  • golang文件服务器的两种方式(可以访问任何目录)

    一.方法1: 主要用到的方法是http包的FileServer,参数很简单,就是要路由的文件夹的路径. package main import ( "fmt" "net/http" ) func main() { http.Handle("/", http.FileServer(http.Dir("./"))) e := http.ListenAndServe(":8080", nil) fmt.Print

  • golang-gin-mgo高并发服务器搭建教程

    gin-mgo服务器搭建 该服务器实现简单接收请求并将请求参数封装存储在mongodb数据库中,本文将讲述gin-mgo的使用方法. 项目完整代码地址: https://github.com/wayne-yhp/golang-gin-mgo gin web框架使用介绍 首先获取gin框架依赖 go get gopkg.in/gin-gonic/gin.v1 func main() { server = gin.Default() app.server.GET("/do", IndexR

  • golang DNS服务器的简单实现操作

    简单的DNS服务器 提供一个简单的可以查询域名和反向查询的DNS服务器. dig命令主要用来从 DNS 域名服务器查询主机地址信息. 查找www.baidu.com的ip (A记录): 命令:dig @127.0.0.1 www.baidu.com 根据ip查找对应域名 (PTR记录): 命令:dig @127.0.0.1 -x 220.181.38.150 源码 : package mainimport ( "fmt" "net" "golang.org

  • golang搭建静态web服务器的实现方法

    我胡汉三又回来啦.好久没发文了,为保持平台上的活跃度,我今天就分享下个刚学到的知识,使用golang搭建静态web服务器,亲测可用,附代码! 使用过golang语言的程序猿都应该知道,在使用golang开发的时候,我们是不需要诸如iis,apache,nginx,kangle等服务器支持的. 为什么呢? 原因是,golang的net/http包中已经提供了HTTP的客户端与服务端实现方案. 网上言论都说golang不适合做web开发,相对php.java..net.nodejs等各类后端语言来说

  • golang项目如何上线部署到Linu服务器(方法详解)

    Go作为Google2009年推出的语言,其被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言. 对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率.它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了. 到现在Go的开发已经是完全开放的,并且拥有一个活跃的社区. 下面看下golang项目如何上线部署到Linu服务器上. windows服务器 先本地编译 go build main.go 编译后会在同级目录生成可执行文件

  • golang HTTP 服务器 处理 日志/Stream流的操作

    目前,我开发 HTTP 服务, 用的是 beego框架, 方便了很多. 但是, 有时候,还是会遇到一些 特殊的场景. 比如: 过滤日志. 这应该是一种典型的stream,同时数据量也适中, 不会有人,为了这个, 就用一些很重的框架. 可以这样直观的描述这个 逻辑 其他组件 产生 log || \ / 我的组件,业务处理 || \ / 用户, http client 这种情景下, 有几个特殊点: 1. 难以用 string,或者 byte 数组 收集数据 2. 数据Source 端,不断的有数据产

  • 基于HLS创建Golang视频流服务器的优缺点

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

  • 构建基于虚拟用户的vsftpd服务器应用

    安装: [root@server ~]# yum install -y vsftpd [root@server ~]# rpm -ql vsftpd /etc/logrotate.d/vsftpd /etc/pam.d/vsftpd /etc/rc.d/init.d/vsftpd /etc/vsftpd /etc/vsftpd/ftpusers /etc/vsftpd/user_list /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd_conf_migrat

  • 基于vue-cli创建的项目的目录结构及说明介绍

    一. ├── build // 项目构建(webpack)相关代码 记忆:(够贱) 9个 │ ├── build.js // 生产环境构建代码 │ ├── check-versions.js // 检查node&npm等版本 │ ├── dev-client.js // 热加载相关 │ ├── dev-server.js // 构建本地服务器 │ ├── utils.js // 构建配置公用工具 │ ├── vue-loader.conf.js // vue加载器 │ ├── webpack.b

  • Java实现基于NIO的多线程Web服务器实例

    代码地址:https://github.com/iyuanyb/webserver 实现了 静态.动态资源获取: Cookie.Session.HTTP 长连接,及 Session 和 HTTP 长连接的定时清除: 类似 Spring MVC 的注解式编程,如 @RequestMapping @RequestParam 等,方法中可以根据参数名从前台获取数据,可以传递对象,也支持级联属性,如: // GET /page?pageSize=10&pageNum=1 HTTP/1.1 @Reques

  • 基于gin的golang web开发:路由示例详解

    Gin是一个用Golang编写的HTTP网络框架.它的特点是类似于Martini的API,性能更好.在golang web开发领域是一个非常热门的web框架. 启动一个Gin web服务器 使用下面的命令安装Gin go get -u github.com/gin-gonic/gin 在代码里添加依赖 import "github.com/gin-gonic/gin" 快速启动一个Gin服务器的代码如下 package main import "github.com/gin-

  • 详解node.js创建一个web服务器(Server)的详细步骤

    前言 在 node.js 中创建一个服务器非常简单,只需要使用 node.js 为我们提供的 http 模块及相关 API 即可创建一个麻雀虽小但五脏俱全的web 服务器,相比 Java/Python/Ruby 搭建web服务器的过程简单的很. http model 要想创建一个基于 node.js 的 web 服务器,你就必须使用 node.js 提供的 http 模块,node.js 中的 http 接口旨在支持传统上难以使用的协议的许多特性, 特别是,大块的.可能块编码的消息,接口永远不会

  • 基于Python创建语音识别控制系统

    下面附上参考文章,这篇文章是通过识别出来的文字来打开浏览器中的默认网站.python通过调用百度api实现语音识别 题目很简单,利用语音识别识别说出来的文字,根据文字的内容来控制图形移动,例如说向上,识别出文字后,画布上的图形就会向上移动.本文使用的是百度识别API(因为免费),自己做的流程图: 不多说,直接开始程序设计,首先登录百度云,创建应用 注意这里的API Key和Secret Key,要用自己的才能生效 百度语音识别有对应的文档,具体调用方法说的很清晰,如果想学习一下可以查看REST

  • PostgreSQL13基于流复制搭建后备服务器的方法

    目录 实际操作 1.参数配置 2.使用pg_basebackup创建备机数据库 3.启动备机数据库服务器 4.检查 pg的高可用.负载均衡和复制特性矩阵如下 后备服务器作为主服务器的数据备份,可以保障数据不丢,而且在主服务器发生故障后可以提升为主服务器继续提供服务. 实际操作 1.参数配置 首先配置主机的postgresql.conf vim /usr/local/pgsql/data/postgresql.conf listen_addresses = '*' wal_level = hot_

  • 基于jQuery创建鼠标悬停效果的方法

    本文实例讲述了基于jQuery创建鼠标悬停效果的方法.分享给大家供大家参考.具体实现方法如下: 1. 创建HTML: <ul> <li><a href="/tv"><img src="images/tv_off.gif" class="mainnav"></a></li> </ul> 2. 选择.mainnav的class: $(".mainnav&qu

  • AngularJS基于factory创建自定义服务的方法详解

    本文实例讲述了AngularJS基于factory创建自定义服务的方法.分享给大家供大家参考,具体如下: 为什么要创建自定义服务? 很简单,不想让控制器显得过于"臃肿",而且服务可复用.针对性强,每个服务对应不同的功能. 这里介绍如何使用factory创建自定义服务,并且使用他. 例子1: <!--HTML--> <div ng-controller="showTheName"> <h1 ng-bind="name"

随机推荐