一. 前言
HLS(HTTP Live Streaming) 是苹果公司提出的基于 HTTP 的流媒体传输协议,它的工作原理是将整个文件切分成一个个小的文件(通常是 TS 格式文件),客户端通过 HTTP 下载播放。在准备播放某个 m3u8 媒体源时会先下载一个包含元数据信息的 .m3u8 索引文件,根据 .m3u8 索引文件信息依次下载媒体流文件。
本文将使用 FFmpeg+go 搭建一个 m3u8 点播服务器,其中 FFmpeg 用于对 mp4 等媒体文件进行切分,go 用于搭建一个 Web 资源服务器。
二. 切分媒体文件
ffmpeg -i lantingxv.mp4 -vbsf h264_mp4toannexb -vcodec libx264 -acodec aac -strict 2 -s 1280x720 -r 30 -g 150 -hls_time 5 -hls_list_size 0 -start_number 0 -f hls -y lantingxv.m3u8
准备一个媒体文件,然后执行如上命令,命令执行完成后将在本地目录生成一个 .m3u8 文件(索引文件)和若干个 .ts 文件(媒体文件),每一个 .ts 文件都可以单独播放,每个 .ts 文件的时长大约 5s。
m3u8 播放索引文件内容大致如下,#EXT 开头的是 m3u8 Tag,各个 Tag 含义见如下解释。
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:5
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.000000,
lantingxv0.ts
#EXTINF:5.000000,
lantingxv1.ts
#EXTINF:5.000000,
lantingxv2.ts
#EXTINF:5.000000,
lantingxv3.ts
#EXTINF:5.000000,
lantingxv4.ts
#EXTINF:5.000000,
lantingxv5.ts
#EXTINF:5.000000,
lantingxv6.ts
#EXTINF:5.000000,
lantingxv7.ts
#EXTINF:5.000000,
lantingxv8.ts
#EXTINF:5.000000,
lantingxv9.ts
#EXT-X-ENDLIST
#EXTM3U 必须在文件的第一行,标识这是一个 M3U Playlist 文件。
#EXT-X-VERSION 表示版本。
#EXT-X-TARGETDURATION 表示最大的媒体段文件的时长,如上表示最长的 TS 文件是 5s。
#EXT-X-MEDIA-SEQUENCE 表示第一个媒体段文件名的序号,如上是从 lantingxv0.ts 开始的,因此是 0。
#EXTINF 表示下面媒体段文件的时长,如上都是 5s。
#EXT-X-ENDLIST 表示 Playlist 结束,对于 m3u8 点播索引文件有这个 TAG,m3u8 直播索引文件没有这个 TAG,直播索引文件是不断动态更新的。
三. 使用go搭建一个静态资源服务器
我们完成媒体文件切分成 .m3u8 索引文件和 .ts 文件片段后,还需要通过 HTTP 方式暴露出去,让客户端可以通过 HTTP 协议获取索引文件和媒体文件,我们使用 go 搭建一个静态资源服务器,代码如下。
package main
import "net/http"
func main() {
http.Handle("/", http.FileServer(http.Dir("file")))
http.ListenAndServe(":8080", nil)
}
先在代码的同级目录下创建 file 目录,然后将 .m3u8 文件和对应的 .ts 文件全部拷贝到该目录,之后运行代码即可。
四. 使用VLC播放指定m3u8源
启动 VLC,点击打开网络,输入 m3u8 源后点击播放即可,播放效果如下。