我目前有这个功能,通过 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
}
翻阅古今
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)
- 2 回答
- 0 关注
- 86 浏览
添加回答
举报
0/150
提交
取消