基于 HLS 创建 Golang 视频流服务器

标签: hls golang 视频 | 发表时间:2021-11-29 13:51 | 作者:声网Agora
出处:https://juejin.cn/frontend

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 阶段。

项目结构

img

代码如下

  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 视频] 推荐:

基于 HLS 创建 Golang 视频流服务器

- - 掘金 前端
HLS 是 HTTP Live Streaming 的缩写,是苹果开发的一种基于 HTTP 的自适应比特率流媒体传输协议, 并于 2009 年. HLS 流媒体已经成为应用最广泛的实时视频协议. 它是一种将流分解成基于文件小段的格式, 可以通过 HTTP 下载,HLS 可以通过标准的 HTTP 或代理服务器等,这和基于 UDP 的协议(例如 RTP)不同.

Golang测试技术

- - Tony Bai
本篇文章内容来源于 Golang核心开发组成员 Andrew Gerrand在Google I/O 2014的一次主题分享“ Testing Techniques”,即介绍使用Golang开发 时会使用到的测试技术(主要针对. 单元测试),包括基本技术、高级技术(并发测试、 mock/fake、竞争条件测试、并发测试、内/外部测 试、vet工具等)等,感觉总结的很全面,这里整理记录下来,希望能给大家带来帮助.

Android播放HLS协议的流媒体

- - CSDN博客推荐文章
最近需要测试Android是否支持HLS协议的流媒体播放,在网上找了些例子都是播放本地文件的,还有一些播放网络文件的却不是HLS协议的流媒体. 据Android3.0的更新说明介绍,Android3.0已经开始支持大部分的HLS流媒体类型,于是就做了一下测试. mvdView.setVideoURI(uri); // mvdView是一个videoView控件.

golang的杀手级应用:docker

- - _不是我干的 _
docker 是 golang 的第一个杀手级应用,发展迅猛, 现在各大云计算平台几乎全都支持 docker 实例,包括 谷歌,亚马逊,阿里云等. golang 本身已经让我惊喜万分,而 docker 更是极大的激发了我对虚拟化的想象. IT 业发展至今,软件和硬件始终是无法分割的两个物体. 就拿最近几年红红火火的智能机时代来说, 很久之前的诺基亚智能机, 软件和硬件相辅相成, 连进入主界面都需要按一个特定的按钮才能进入.

Golang 大杀器之跟踪剖析 trace

- - SegmentFault 最新的文章
在 Go 中有许许多多的分析工具,在之前我有写过一篇 《Golang 大杀器之性能剖析 PProf》 来介绍 PProf,如果有小伙伴感兴趣可以去我博客看看. 但单单使用 PProf 有时候不一定足够完整,因为在真实的程序中还包含许多的隐藏动作,例如 Goroutine 在执行时会做哪些操作. GC 是怎么影响到 Goroutine 的执行的.

基于Golang的微服务——Micro实践

- - IT瘾-tuicool
开始开发前需要先配置好Go的开发环境,可以看我写的 基于Golang的微服务——上手篇. 在 GOPATH目录下的src目录下创建我们的实战项目目录 tech,切换到这个目录. go get github.com/micro/go-micro //用于开发的微服务的RPC框架,是micro架构的基础 go get github.com/micro/protoc-gen-micro // 用于生成Protobuf的代码 go get github.com/micro/micro // 工具集安装,会自动将 micro加入环境变量 复制代码.

基于HTTP Live Streaming(HLS) 搭建在线点播系统

- - 乐无线-无线互联网观察
为何要使用 HTTP Live Streaming. 可以参考wikipedia. HTTP Live Streaming(缩写是 HLS)是一个由苹果公司提出的基于HTTP的流媒体 网络传输协议. 是苹果公司QuickTime X和iPhone软件系统的一部分. 它的工作原理是把整个流分成一个个小的基于HTTP的文件来下载,每次只下载一些.

流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls)

- - CSDN博客互联网推荐文章
          参考文档  RFC3550/RFC3551.          Real-time Transport Protocol)是用于Internet上针对多媒体数据流的一种传输层协议. RTP协议详细说明了在互联网上传递音频和视频的标准数据包格式. RTP协议常用于流媒体系统(配合RTCP协议),视频会议和一键通(Push to Talk)系统(配合H.323或SIP),使它成为IP电话产业的技术基础.

windows下一分钟配置ngnix实现HLS m3u8点播

- - 三棵杏软件工作室
下载 nginx-1.5.10 for windows 2. 修改配置文件nginx-1.5.10\conf\nginx.conf,增加以下行到最后一个"}"的前一行:. } 同时,新建子目录:nginx-1.5.10\html\hls,把生成的m3u8和切片好的ts文件或目录拷贝到hls目录下 3.

RTMP,HLS和HTTP分发方式比较 v1_CN_RTMP.PK.HTTP · ossrs/srs Wiki · GitHub

- -
互联网上的两种主要的分发方式: HLS和 RTMP,什么时候用谁,完全决定于应用场景. 还有其他的分发方式,这些分发方式不属于互联网常见和通用的方式,不予以比较:. UDP:譬如YY的实时应用,视频会议等等,或者RTSP之类. 这类应用的特点就是实时性要求特别高,以毫秒计算. TCP家族协议根本就满足不了要求,所以HTTP/TCP都不靠谱.