V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dzdh
V2EX  ›  FFmpeg

go + ffmpeg pipe 怎么确定当前转码操作已经结束,可以停了

  •  
  •   dzdh · 21 天前 · 1185 次点击

    伪代码如下:

    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 的已完成转码时长是不是等于预期?

    7 条回复    2024-05-27 10:38:34 +08:00
    jaynos
        1
    jaynos  
       21 天前   ❤️ 1
    把 cmd.Wait 放在外面,io.Copy 放在 goroutine 里
    dzdh
        2
    dzdh  
    OP
       21 天前
    @jaynos 不行。pipe 不是真正的 wait 。进程不会自己停的。即便 input 写完了,进程也在继续等你的 write 。而且转码进度一直也有速度。
    jaynos
        3
    jaynos  
       21 天前   ❤️ 1
    @dzdh 我测试 `cat file_example_MP4_1920_18MG.mp4 | ffmpeg -y -i pipe:0 -f mpegts pipe:1 > /dev/null` 进程是会结束的,是不是没的 reader 没返回 io.EOF
    dzdh
        4
    dzdh  
    OP
       21 天前
    @jaynos #3 io.Copy(pipe0, http.resp.body) 这个都结束了。进程还在跑。

    linux 管道自己会结束吧,| 前面的结束后边的也跟着结束这是 linux 自带的吧。我测试也会自己结束。

    写代码的不会。。。
    dzdh
        5
    dzdh  
    OP
       21 天前
    @jaynos #3

    我 sb 了。io.Copy(pipe0, http.resp.body)结束后加个 pipe0.close 就好了。我放到 defer 了。。。

    解决。结贴。
    jaynos
        6
    jaynos  
       21 天前
    @dzdh #5 刚写了个代码测试了可以,stdin 写完 close 就会触发 io.EOF 结束进程了
    Yoruno
        7
    Yoruno  
       21 天前
    应该可以读取信息,判断转完调用 close 关闭
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2350 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:00 · PVG 00:00 · LAX 09:00 · JFK 12:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.