Ich versuche, einen Musik-Streaming-Dienst mit youtube-dl und ffmpeg zu erstellen. Wenn der Benutzer eine POST-Anfrage mit der Video-URL sendet, funktioniert mein Handler-Code folgendermaßen:
router.POST("/submit", func(c *gin.Context) { body := Body{} if err := c.BindJSON(&body); err != nil { c.AbortWithError(http.StatusBadRequest, err) return } w := c.Writer header := w.Header() header.Set("Content-Type", "audio/mp3") w.WriteHeader(http.StatusOK) fetchMusic(c, body.Data) }) func fetchMusic(c *gin.Context, data string) { r, w := io.Pipe() defer r.Close() ydl := exec.Command("youtube-dl", data, "-o-") ffmpeg := exec.Command("ffmpeg", "-i", "/dev/stdin", "-vn", "-f", "mp3", "-") ydl.Stdout = w ydl.Stderr = os.Stderr ffmpeg.Stdin = r ffmpeg.Stdout = c.Writer ffmpeg.Stderr = os.Stderr fmt.Println("Starting-----------------------") go func() { if err := ydl.Run(); err != nil { panic(err) } }() if err := ffmpeg.Run(); err != nil { panic(err) } fmt.Println("Done-----------------------") }
Ich habe eine Pipeline mit ffmpeg und youtube-dl erstellt. Während der Testphase habe ich eine POST-Anfrage gesendet, die Anfrage wurde jedoch nicht abgeschlossen. Wenn ich mir die Protokolle ansehe, wird „Complete----------------“ nicht angezeigt. Ich denke, der Prozess scheint festzustecken. Hast du eine Idee? Ist meine Verwendung korrekt?
Das ist ziemlich knapp – wir müssen noch schließen *io.PipeWriter
.
Sonst ffmpeg
认为可以通过更多数据。这将在程序中显示为 EOF
.
Hier ist ein ausführbares Beispiel, das ich zusammengestellt habe, um das Problem mit echo
和 cat
代替。您应该能够通过注释掉新的 defer w.Close()
zu reproduzieren:
package main import ( "fmt" "io" "os" "os/exec" ) func main() { r, w := io.Pipe() defer r.Close() echo := exec.Command("echo", "hello") cat := exec.Command("cat") echo.Stdout = w echo.Stderr = os.Stderr cat.Stdin = r cat.Stdout = os.Stdout cat.Stderr = os.Stderr fmt.Println("Starting-----------------------") go func() { // -- I added this -- defer w.Close() if err := echo.Run(); err != nil { panic(err) } }() if err := cat.Run(); err != nil { panic(err) } fmt.Println("Done-----------------------") }
Das obige ist der detaillierte Inhalt vonDer von Golang mit Run() ausgeführte Befehl wird nicht zurückgegeben. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!