Maison >développement back-end >Golang >La commande exécutée par Golang à l'aide de Run() ne renvoie pas
J'essaie de créer un service de streaming musical en utilisant youtube-dl et ffmpeg. Lorsque l'utilisateur envoie une requête POST avec l'URL de la vidéo, mon code de gestionnaire fonctionne comme ceci :
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-----------------------") }
J'ai créé un pipeline en utilisant ffmpeg et youtube-dl. Pendant la phase de test, j'ai envoyé une requête POST, mais la requête n'a pas abouti. Si je regarde les journaux, je ne vois pas "Complet----------------". Je pense que le processus semble bloqué. As tu des idées? Mon utilisation est-elle correcte ?
C'est assez proche - nous devons encore fermer *io.PipeWriter
.
Sinon ffmpeg
认为可以通过更多数据。这将在程序中显示为 EOF
.
Voici un exemple exécutable que j'ai mis en place pour reproduire le problème en utilisant echo
和 cat
代替。您应该能够通过注释掉新的 defer w.Close()
:
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-----------------------") }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!