当下,音视频服务很热,广发应用到直播电商,在线教育,游戏,社区聊天,电视直播,电视盒子物联网等应用场景。音视频服务是比较成熟技术,市场上有很多产品可以快速搭建流媒体:
Flash流媒体服务器 Red5 (Java)
FMS流媒体服务器 (Adobe,收费的)
流媒体服务器 Open Streaming Server (Java)
Wowza流媒体服务器(Java)
开源流媒体平台FreeCast(Java)
Ngix+RTMP插件
流媒体解决方案 Live555 (C++)
SRS+OBS (C++,国产精品)
HLS + FFmpeg + Golang(Golang)
下面以以HLS + FFmpeg + Golang 快速搭建视频流服务。
1、什么是 HLS?
HTTP Live Streaming 是 Apple 开发的基于 HTTP 的自适应比特率流通信协议。
HLS 是一种流媒体协议,它允许大型媒体文件作为许多较小的文本文件提供服务,这些文件被分解成大约 10 秒的增量。通过分解它们,用户的客户端应用程序只需要提前缓冲约 10 秒。这为用户节省了大量潜在的带宽,并允许歌曲或视频几乎立即开始播放。
2、 FFmpeg 流媒体编码器
我们可以轻松地将 mp3 文件转换为由多个文件组成的 HLS 格式。其中一个文件包含元数据 (.m3u8) 并首先提供。这个元数据文件告诉客户端从哪里获取每个数据文件,以及每个数据文件包含什么。数据文件具有 .ts 扩展名,通常包含约 10 秒的音频,并应客户请求一次提供一个。
3、实现过程
1)下载示例 BachGavotteShort.mp3
http://www.hubharp.com/web_sound/BachGavotteShort.mp3
2)安装FFmpeg。如果您使用的是 Mac:
brew install ffmpeg
3)格式化一些媒体 文件
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 文件。
4)Golang开发Web服务
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
您的服务器已上线!使用 HLS 媒体客户端测试您的代码并收听音乐流。你可以在这里找到一个免费的在线客户端:https ://hls-js-latest.netlify.com/demo/
只需粘贴您歌曲的 URI 并收听: