Ich habe ein Programm, das ffmpeg verwendet, um eine RTSP-Kamera in das HLS-Format zu streamen. Wenn ffmpeg im Hintergrund läuft, erstellen Sie eine Goroutine für jeden RTSP-Link
Der Stream wird mit dem folgenden Code hinzugefügt.
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 } }() }
}
Führen Sie die Streaming-Funktion des Befehls ffmpeg aus.
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 } }}
Mein Ziel ist es, jeden os.exec-Prozess (Befehl ffmpeg) zu stoppen oder zumindest alle Goroutinen unter dem Befehl ffmpeg zu schließen, ohne den Glasfaserserver herunterzufahren.
** Golang-Neuling braucht Hilfe **
Das ist der Arbeitscode:
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() } }
Und fang an zu streamen:
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 } }
.
Das hat bei mir funktioniert, jetzt finde ich keinen besseren Weg. Wenn jemand einen besseren Weg hat, kommentieren Sie ihn bitte.
Das obige ist der detaillierte Inhalt vonSchließen Sie die vom Fiber-Endpunkt generierte Goroutine. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!