问题内容 我有一个程序,它是使用 FFmpeg 进行流式传输的 rtsp 相机到 hls 格式。 当 ffmpeg 在后台运行时,为每个 rtsp 链接创建 Goroutine 流是通
我有一个程序,它是使用 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的详细内容,更多请关注编程网其它相关文章!
--结束END--
本文标题: 关闭由 Fiber 端点生成的 goroutine
本文链接: https://lsjlt.com/news/561210.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0