【发布时间】:2020-02-19 19:52:21
【问题描述】:
我目前有这个功能,通过 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 出错返回而不是继续发送,我可以解决这个问题吗?
【问题讨论】:
-
不直接通过管道传输到客户端,不。您必须在 RAM 中缓冲输出以确定它是否是错误,并基于此发送错误响应或发送有效负载响应。
-
@Adrian 如果 ffmpeg 出错以避免发送 0kb,它将无法返回错误?如果我必须缓冲,最低限度是多少,我将如何做到这一点?
-
@Adrian 我想具体来说,因为 youtube-dl 会立即出错或与 ffmpeg 一样工作,我只是觉得必须有一种方法来解决它
-
你可以,你只需要缓冲它而不是直接管道到客户端。
标签: go