Maison > développement back-end > Golang > 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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Libérer: 2024-02-06 10:12:03
avant
931 Les gens l'ont consulté

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-----------------------")
}
Copier après la connexion

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-----------------------")
}
Copier après la connexion

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 de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal