我有一个程序,它是使用 ffmpeg 进行流式传输的 rtsp 相机到 hls 格式。 当 ffmpeg 在后台运行时,为每个 rtsp 链接创建 goroutine
流是通过以下代码添加的。
func streamprocess(data <-chan streamdata, ctx context.context) { for v := range data { ctx, _ := context.withcancel(ctx) go func() { if !getstreams(v.camera_id) { var stream streamstate stream.camera_id = v.camera_id stream.state = true go stream(v, ctx) wg.wait() } else { return } }() }
}
运行 ffmpeg 命令的流函数。
func Stream(meta StreamData, ctx context.Context) error { log.Println("Started Streaming") ffmpegCmd := exec.Command("ffmpeg", "-i", meta.rtsp, "-pix_fmt", "yuv420p", "-c:v", "libx264", "-preset", "ultrafast", "-b:v", "600k", "-c:a", "aac", "-b:a", "160k", "-f", "rtsp", fmt.Sprintf("rtsp://localhost:8554/%s", meta.camera_id)) output, _ := ffmpegCmd.CombinedOutput() log.Println(string(output)) for { select { case <-ctx.Done(): log.Println("killing process") ffmpegCmd.Process.Kill() return nil } }}
我的目标是停止每个 os.exec 进程(ffmpeg 命令)或至少关闭 ffmpeg 命令下的所有 goroutine,而不关闭 fiber 服务器。
** golang 新手需要帮助 **
这是工作代码:
func streamprocess(data <-chan streamdata, ctx context.context) { ctx, cancel := context.withcancel(ctx) defer cancel() for { select { case v, ok := <-data: if ok { go func() { if !getstreams(v.camera_id) { var stream streamstate stream.camera_id = v.camera_id stream.state = true go stream(v, ctx) } }() } else if !ok { cancel() return } case <-ctx.done(): log.println("closed ctx") cancel() } }
并开始流式传输:
func Stream(meta StreamData, ctx context.Context) error { log.Println("Started Streaming") err := exec.CommandContext(ctx, "ffmpeg", "-i", meta.rtsp, "-pix_fmt", "yuv420p", "-c:v", "libx264", "-preset", "ultrafast", "-b:v", "600k", "-c:a", "aac", "-b:a", "160k", "-f", "rtsp", fmt.Sprintf("rtsp://localhost:8554/%s", meta.camera_id)).Run() if err != nil { log.Println("error in streaming", err) return err } log.Println(string("waiting for closure")) for { select { case <-ctx.Done(): log.Println("killing process") return nil case <-time.After(2* time.second): log.Println("started default context") return nil } }
.
这对我有用,现在我没有找到更好的方法。如果有人有更好的方法请评论。
以上是关闭由 Fiber 端点生成的 goroutine的详细内容。更多信息请关注PHP中文网其他相关文章!