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

我目前有这个功能,通过 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错误返回而不是继续发送,我是否可以解决这个问题?


30秒到达战场
浏览 87回答 2
2回答

富国沪深

不丢弃返回的错误代码youtube-dl怎么样?改变youtube.Wait()到err = youtube.Wait()if err != nil {    log.Printf("youtube-dl failed: %v\n", err)    return err}

翻阅古今

我通过将Start()and替换Wait()为 aCombinedOutput()var ffbuf bytes.Bufferffmpeg.Stderr = &ffbufaudio, err := youtube.Output()if err != nil {    log.Printf("pipeThruFfmpegToMp3: %v\n", err)    return err}ffmpeg.Stdin = bytes.NewReader(audio)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go