gpt4 book ai didi

go - 管道输入出现错误时如何使程序返回

转载 作者:行者123 更新时间:2023-12-01 19:24:11 24 4
gpt4 key购买 nike

我目前拥有此功能,该功能通过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)

关于go - 管道输入出现错误时如何使程序返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60308189/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com