为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
30秒到达战场 2022-05-18 13:52:26
我目前有这个功能,通过 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错误返回而不是继续发送,我是否可以解决这个问题?
查看完整描述

2 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

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


改变


youtube.Wait()


err = youtube.Wait()

if err != nil {

    log.Printf("youtube-dl failed: %v\n", err)

    return err

}


查看完整回答
反对 回复 2022-05-18
?
翻阅古今

TA贡献1780条经验 获得超5个赞

我通过将Start()and替换Wait()为 aCombinedOutput()


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)


查看完整回答
反对 回复 2022-05-18
  • 2 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信