Maison  >  Article  >  développement back-end  >  La commande exécutée par Golang à l'aide de Run() ne renvoie pas

La commande exécutée par Golang à l'aide de Run() ne renvoie pas

WBOY
WBOYavant
2024-02-06 10:12:03827parcourir

Golang 使用 Run() 执行的命令没有返回

Contenu de la question

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 ?


Bonne réponse


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 echocat 代替。您应该能够通过注释掉新的 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer