如果你希望将视频流转发给 Golang 进行读取和处理,可以尝试使用 io.Pipe
创建一个管道,并将 ffmpeg
的标准输出连接到该管道的写入端口。然后,在另一个 goroutine 中从管道的读取端口读取数据。
以下是示例代码片段,展示了如何实现这个过程:
package main
import (
"fmt"
"io"
"net/http"
"os/exec"
)
func handleVideoStream(w http.ResponseWriter, r *http.Request) {
pr, pw := io.Pipe()
cmd := exec.Command("ffmpeg", "-f", "v4l2", "-s", "1920x1080", "-i", "/dev/video1",
"-vcodec", "libx264", "-f", "mp4", "pipe:1")
cmd.Stdout = pw // 将 ffmpeg 标准输出连接到管道的写入端口
cmd.Stderr = w // 将错误输出重定向到 HTTP ResponseWriter
go func() {
defer pr.Close()
if err := cmd.Run(); err != nil {
fmt.Println(err)
return
}
}()
w.Header().Set("Content-Type", "video/mp4") // 设置正确的 Content-Type
io.Copy(w, pr) // 从管道的读取端口复制数据到 ResponseWriter
}
func main() {
http.HandleFunc("/video-stream", handleVideoStream)
http.ListenAndServe(":8080", nil)
}
请注意,这只是一个简单的示例代码,可能需要根据你的具体需求进行调整。确保在适当情况下关闭管道,以避免资源泄漏。此外,还应考虑流式传输时的缓冲区管理和错误处理等问题。
内容由零声教学AI助手提供,问题来源于学员提问