以下是一个使用 Golang 编写的简单示例,用于接收和转发 MPEG-TS 格式流的 HTTP 服务器:
package main
import (
"log"
"net/http"
"os/exec"
)
func handleLiveStream(w http.ResponseWriter, r *http.Request) {
cmd := exec.Command("ffmpeg", "-i", "http://input-stream-url/live.mpg", "-c:v", "copy", "-f", "mpegts", "pipe:1")
stdout, err := cmd.StdoutPipe()
if err != nil {
log.Println(err)
return
}
err = cmd.Start()
if err != nil {
log.Println(err)
return
}
defer cmd.Wait()
w.Header().Set("Content-Type", "video/mp2t")
w.Header().Set("Transfer-Encoding", "chunked")
buf := make([]byte, 1024)
for {
n, err := stdout.Read(buf)
if n > 0 {
w.Write(buf[:n])
w.(http.Flusher).Flush() // 确保实时刷新数据到客户端
}
if err != nil {
break
}
}
}
func main() {
http.HandleFunc("/live.mpg", handleLiveStream)
log.Println("HTTP server started on port 8001")
err := http.ListenAndServe(":8001", nil)
if err != nil {
log.Fatal(err)
}
}
这段代码使用了 os/exec
包来执行外部命令并读取其输出。在 handleLiveStream
处理函数中,它启动了一个 ffmpeg 命令,并将输入源为 "http://input-stream-url/live.mpg"
的 MPEG-TS 流通过 -c:v copy -f mpegts pipe:1
参数转发到标准输出。
然后,通过设置 HTTP 响应头部信息,将 MPEG-TS 流传输给客户端。在每次读取到流数据后,使用 w.Write()
方法将数据写入响应体,并使用 w.(http.Flusher).Flush()
确保实时刷新数据到客户端。
最后,在 main
函数中,我们注册了 /live.mpg
路径的处理函数,并监听 8001 端口启动了 HTTP 服务器。当有客户端访问 http://localhost:8001/live.mpg
时,就会执行 handleLiveStream
函数来处理请求。
请注意,在实际应用中需要根据需求进行适当的修改和优化。同时,对于安全性、错误处理、并发性等方面也需要进行更加严谨的考虑和处理。
内容由零声教学AI助手提供,问题来源于学员提问