登录
首页 >  Golang >  Go问答

当管道输入出错时如何让程序返回

来源:stackoverflow

时间:2024-04-15 17:33:35 302浏览 收藏

大家好,我们又见面了啊~本文《当管道输入出错时如何让程序返回》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

我目前有这个函数,它通过 ffmpeg 传输 youtubedl 命令,然后将 ffmpeg 的输出传输到 http 客户端。

func pipeThruFfmpegToMp3(vi *VideoInfo, rw web.ResponseWriter) error {
    var ffmpeg *exec.Cmd
        ffmpeg = exec.Command("ffmpeg", "-i", "-","-acodec", "libmp3lame","-f", "mp3","-")
    }

    youtube := exec.Command("youtube-dl", "-f", "137", "video_url", "-o", "-")

    var ytbuf, ffbuf bytes.Buffer
    youtube.Stderr = &ytbuf
    ffmpeg.Stderr = &ffbuf

    audio, err := youtube.StdoutPipe()
    if err != nil {
        log.Printf("pipeThruFfmpegToMp3: %v\n", err)
        return err
    }

    ffmpeg.Stdin = audio
    ffmpeg.Stdout = rw

    // Headers sent, no turning back now
    rw.Header().Set("Content-Type", "audio/mpeg")
    rw.Header().Set("Content-Disposition", fmt.Sprintf("attachment;filename=\"%s.mp3\"", vi.GetSlug()))
    rw.Flush()

    youtube.Start()
    ffmpeg.Start()
    ffmpeg.Wait()
    youtube.Wait()

    // check ytvbuf, ytbuf, ffbuf for stderr errors

    if ffbuf.Len() != 0 {
        log.Printf("pipeThruFfmpegToMp3: %v\n", ffbuf.String())
    }

    if ytbuf.Len() != 0 {
        log.Printf("pipeThruYouTubeDLToMp3: %v\n", ytbuf.String())
    }

    return nil
}

问题是,当youtubedl出现错误时,它会发送一个0kb的文件,而不是返回错误并且不发送文件。

那么,如果 youtubedl 错误返回而不是继续发送,我是否可以修复此问题?


解决方案


我通过将 start()wait() 替换为 combinedoutput() 来完成这项工作

var ffbuf bytes.buffer
ffmpeg.stderr = &ffbuf

audio, err := youtube.output()
if err != nil {
    log.printf("pipethruffmpegtomp3: %v\n", err)
    return err
}

ffmpeg.stdin = bytes.newreader(audio)

不丢弃 youtube-dl 返回的错误代码怎么样?

改变

youtube.wait()

err = youtube.Wait()
if err != nil {
    log.Printf("youtube-dl failed: %v\n", err)
    return err
}

请参阅 documentation on Go's wait() API 了解更多详情。

今天关于《当管道输入出错时如何让程序返回》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>