伪代码如下:
func main() {
url := "http://a.mp4"
args := strings.Split("ffmpeg -y -i pipe:0 -f mpegts pipe:1", " ")
ctx, cancel := context.WithCancel(context.Background())
cmd := exec.CommandContext(ctx, args[0], args[1:]...)
pipe0, _ := cmd.StdinPipe()
pipe1, _ := cmd.StdoutPipe()
cmd.Start()
go func () {
cmd.Wait()
}
go func () {
file := os.Openfile....
io.Copy(file, pipe1)
}
io.Copy(pipe0, http.resp.body)
}
问题是,write 完成了,但是我不确定转码完成了没。去监听 stderr 吗?看 stderr 的已完成转码时长是不是等于预期?
1
jaynos 174 天前 1
把 cmd.Wait 放在外面,io.Copy 放在 goroutine 里
|
3
jaynos 174 天前 1
@dzdh 我测试 `cat file_example_MP4_1920_18MG.mp4 | ffmpeg -y -i pipe:0 -f mpegts pipe:1 > /dev/null` 进程是会结束的,是不是没的 reader 没返回 io.EOF
|
4
dzdh OP @jaynos #3 io.Copy(pipe0, http.resp.body) 这个都结束了。进程还在跑。
linux 管道自己会结束吧,| 前面的结束后边的也跟着结束这是 linux 自带的吧。我测试也会自己结束。 写代码的不会。。。 |
5
dzdh OP |
7
Yoruno 174 天前
应该可以读取信息,判断转完调用 close 关闭
|