【发布时间】:2014-09-21 07:24:28
【问题描述】:
如何像在 NodeJS 中一样通过管道传输 HTTP 响应。这是我在 NodeJS 中使用的 sn-p:
request({
url: audio_file_url,
}).pipe(ffmpeg_process.stdin);
如何在 Go 中实现相同的结果?
我正在尝试将来自 HTTP 的音频流通过管道传输到 FFmpeg 进程中,以便它即时对其进行转换并将转换后的文件返回给客户端。
到目前为止,这里的每个人都清楚我的源代码:
func encodeAudio(w http.ResponseWriter, req *http.Request) {
path, err := exec.LookPath("youtube-dl")
if err != nil {
log.Fatal("LookPath: ", err)
}
path_ff, err_ff := exec.LookPath("ffmpeg")
if err != nil {
log.Fatal("LookPath: ", err_ff)
}
streamLink := exec.Command(path,"-f", "140", "-g", "https://www.youtube.com/watch?v=VIDEOID")
var out bytes.Buffer
streamLink.Stdout = &out
cmdFF := exec.Command(path_ff, "-i", "pipe:0", "-acodec", "libmp3lame", "-f", "mp3", "-")
resp, err := http.Get(out.String())
if err != nil {
log.Fatal(err)
}
// pr, pw := io.Pipe()
defer resp.Body.Close()
cmdFF.Stdin = resp.Body
cmdFF.Stdout = w
streamLink.Run()
//get ffmpeg running in another goroutine to receive data
errCh := make(chan error, 1)
go func() {
errCh <- cmdFF.Run()
}()
// close the pipeline to signal the end of the stream
// pw.Close()
// pr.Close()
// check for an error from ffmpeg
if err := <-errCh; err != nil {
// ff error
}
}
错误:2014/07/29 23:04:02 获取:不支持的协议方案“”
【问题讨论】:
-
您确定您的 http 客户端会同时发送和接收吗?大多数人不会这样做,一旦缓冲区全部填满,您就会阻塞。
-
@JimB 音频来自另一个来源。我只需要在服务器上处理它并将 ffmpeg 响应发送回客户端。你说的还适用吗?
-
啊,我明白了(对节点不熟悉,所以我并没有仔细研究那个请求)。我以为客户正在发送源。这很简单,必须尝试什么?
-
好的,我已经编辑了我的答案以显示我到目前为止的进度@JimB
-
好的,谢谢。我显然又误解了:/