发布时间:2024-08-24 12:01
上一次我们找到一些开源方案,目前我们先测试一下ffmpeg转hls播放的方式,看下延迟情况及兼容性情况,主要测试Windows、Linux和macOS中使用谷歌浏览器播放的情况。
后端结合我们之前的cgo部分,建立一个简单的http服务器,然后提供给前端调用。
sudo apt-get install ffmpeg
可能报错:
“E: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/universe/f/flite/libflite1_2.1-release-3_amd64.deb Connection failed [IP: 91.189.88.142 80]”
解决办法,可以选择直接源码编译安装:
wget https://ffmpeg.org/releases/ffmpeg-4.1.tar.bz2 tar -xjvf ffmpeg-4.1.tar.bz2 cd ffmpeg-4.1 sudo apt-get install yasm ./configure make && sudo make install ffmpeg -version
ffmpeg转换rtsp为hls:
ffmpeg -i \"rtsp://username:password@40.40.40.101/media/video1\" -c copy -f hls -hls_time 2.0 -hls_list_size 0 -hls_wrap 15 \"./test.m3u8\"
我们使用go创建简单的http服务,然后利用ffmpg转换hls提供给前端。
需要鉴权时rtsp地址前加上用户名密码时即可,比如rtsp://username:password@xxx,用户名和密码之间用:隔开,和原本的地址用@隔开。
main.go:
import ( \"fmt\" \"net/http\" \"os/exec\" \"bytes\" \"io/ioutil\" ) func Index(w http.ResponseWriter, r *http.Request) { content, _ := ioutil.ReadFile(\"./index.html\") w.Write(content) } func main () { http.HandleFunc(\"/index\", Index) http.Handle(\"/\", http.FileServer(http.Dir(\".\"))) go func() { http.ListenAndServe(\":9000\", nil) }() cmd := exec.Command(\"ffmpeg\", \"-i\", \"rtsp://admin:admin@40.40.40.101/media/video1\", \"-c\", \"copy\", \"-f\", \"hls\", \"-hls_time\", \"2.0\", \"-hls_list_size\", \"0\", \"-hls_wrap\", \"15\", \"./test.m3u8\") var out bytes.Buffer var stderr bytes.Buffer cmd.Stdout = &out cmd.Stderr = &stderr err := cmd.Run() if err != nil { fmt.Println(fmt.Sprint(err) + \": \" + stderr.String()) return } fmt.Println(\"Result: \" + out.String()) }
前端播放m3u8格式视频
运行后端代码后访问localhost:9000即可查看视频,经测试延迟还是比较高的(我测试大致在5s-8s),如果要加上ptz控制的话没有实时感恐怕比较怪异,只适合简单的网络直播之类的,不太在乎一定的延迟。
以上就是go后端利用ffmpeg转hls做简单视频直播的详细内容,更多关于Go ffmpeg转hls视频直播的资料请关注脚本之家其它相关文章!