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

nad*_*rmx 5 go

我目前有这个功能,它通过 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
}
Run Code Online (Sandbox Code Playgroud)

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

那么无论如何,如果 youtubedl 出错返回而不是继续发送,我可以解决这个问题吗?

nad*_*rmx 3

Start()我通过将和替换Wait()为 a 来完成这项工作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)
Run Code Online (Sandbox Code Playgroud)