hls流媒体服务器
在本教程中,我将指导您使用Golang构建流API。 不用担心,构建强大的流服务器非常容易,特别是如果我们使用一种更现代的协议:HLS。
什么是HLS?
HTTP Live Streaming是Apple开发的基于HTTP的自适应比特率流通信协议。
https://zh.wikipedia.org/wiki/HTTP_Live_Streaming
HLS使我们可以将较大的媒体文件作为许多较小的文本文件来提供,这些文件分成约10秒的增量。 通过以这种方式分解它们,我们用户的客户端应用程序仅需要提前缓冲10秒钟,从而为他们节省了大量的潜在带宽,并使歌曲开始更快地播放。
使用FFmpeg ,我们可以轻松地将mp3文件转换为包含多个文件的HLS格式。 这些文件之一包含元数据(.m3u8),并且首先提供。 此元数据文件告诉客户端从何处获取每个数据文件以及每个数据文件包含的内容。 数据文件的扩展名为.ts。 数据文件通常包含约10秒钟的音频,并应客户的请求一次提供一次。
入门-格式化某些媒体
下载示例.mp3:
http://www.hubharp.com/web_sound/BachGavotteShort.mp3
安装FFmpeg 。 如果您使用的是Mac:
brew install ffmpeg
导航到mp3文件的目录并运行
ffmpeg -i BachGavotteShort.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
这将产生三个新文件:
output000.ts output001.ts outputlist.m3u8
恭喜你! 困难的部分完成了,您现在有了可以通过HTTP提供的简单文件。 任何现代的客户端媒体库都将知道如何读取HLS文件。
构建服务器
如上所述,HLS在服务器端非常简单。 我们要做的就是提供.m3u8文件的路径,并确保从同一路径提供.ts文件。 在传统的文件服务器体系结构中,这仅意味着它们需要位于同一目录中。
让我们使用以下文件夹结构设置我们的项目:
将以下代码复制到main.go中:
package main
import (
"fmt"
"log"
"net/http"
)
func main () {
// configure the songs directory name and port
const songsDir = "songs"
const port = 8080
// add a handler for the song files
http.Handle( "/" , addHeaders(http.FileServer(http.Dir(songsDir))))
fmt.Printf( "Starting server on %v\n" , port)
log.Printf( "Serving %s on HTTP port: %v\n" , songsDir, port)
// serve and log errors
log.Fatal(http.ListenAndServe(fmt.Sprintf( ":%v" , port), nil ))
}
// addHeaders will act as middleware to give us CORS support
func addHeaders (h http.Handler) http . HandlerFunc {
return func (w http.ResponseWriter, r *http.Request) {
w.Header().Set( "Access-Control-Allow-Origin" , "*" )
h.ServeHTTP(w, r)
}
}
现在运行您的服务器:
go run main.go
您的服务器已上线! 使用媒体客户端测试您的音乐播放。 您可以在这里找到免费的在线客户端: https : //hls-js-latest.netlify.com/demo/
只需粘贴您歌曲的URI并收听:
http:// localhost:8080 / bachgavotteshort / outputlist.m3u8
谢谢阅读! 祝您的媒体项目好运!
Twitter上的Lane Wagner: @wagslane
订阅Qvault文章: https ://qvault.io
Dev.to上的车道: wagslane
翻译自: https://hackernoon.com/building-a-media-streaming-server-using-go-and-hls-protocol-j85h3wem
hls流媒体服务器