返回顶部
首页 > 资讯 > 后端开发 > GO >Golang 使用 Run() 执行的命令没有返回
  • 784
分享到

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

2024-02-06 09:02:42 784人浏览 薄情痞子
摘要

问题内容 我正在尝试使用 youtube-dl 和 FFmpeg 创建音乐流服务。当用户发送带有视频 URL 的 POST 请求时,我的处理程序代码的工作原理如下: router.

问题内容

我正在尝试使用 youtube-dl 和 FFmpeg 创建音乐流服务。当用户发送带有视频 URL 的 POST 请求时,我的处理程序代码的工作原理如下:


 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-----------------------")
}

我用 ffmpeg 和 youtube-dl 创建了一个管道。在测试阶段,我发送了 POST 请求,但请求未完成。如果我查看日志,我看不到“完成----------------”。我认为这个过程似乎被卡住了。你有什么主意吗?我的用法正确吗?


正确答案


这非常接近 - 我们还需要关闭 *io.PipeWriter

否则 ffmpeg 认为可以通过更多数据。这将在程序中显示为 EOF

这是一个我放在一起的可运行示例,使用 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-----------------------")
}

以上就是golang 使用 Run() 执行的命令没有返回的详细内容,更多请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: Golang 使用 Run() 执行的命令没有返回

本文链接: https://lsjlt.com/news/561411.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作