go语言调用上下文拉起ffmpeg,并引入livego做的简单流媒体服务器
2021-07-20 09:06
标签:使用 界面 erro duration sed elf 分享图片 one std 想给项目组推一套视频的播放方案,用于播放ip camera的的实时流,网上有很多人已经做过了,我这边是使用golang,拉起上下文调用ffmpeg命令,获取rtsp转到livego的服务上,然后界面找我获取播放流的方式。 实现如下: 调用命令行的部分如下 go语言调用上下文拉起ffmpeg,并引入livego做的简单流媒体服务器 标签:使用 界面 erro duration sed elf 分享图片 one std 原文地址:https://www.cnblogs.com/wency/p/9519688.htmlpackage ffmpeg
import (
"bytes"
"context"
"os"
"os/exec"
"syscall"
"time"
)
type C struct {
Name string
ctx context.Context
cancel context.CancelFunc
cmd *exec.Cmd
}
func New(name string, args []string) C {
var c C
c.Name = name
c.ctx, c.cancel = context.WithCancel(context.Background())
c.cmd = exec.CommandContext(c.ctx, "ffmpeg", args...)
c.cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
c.cmd.Stdout = os.Stdout
return c
}
func (c *C) Run() error {
return c.cmd.Start()
}
func (c *C) RunThenClose(ch chan int) error {
err := c.cmd.Start()
c.cancel()
//tell go i take it
return err
}
func (c *C) Close() {
c.cancel()
}
//run and wait for back
func RunAndClose(args []string, callback func(c, t time.Duration)) error {
cmd := exec.Command("ffmpeg", args...)
if callback == nil {
var cmdErr bytes.Buffer
cmd.Stderr = &cmdErr
if err := cmd.Run(); err != nil {
return extractError(err, cmdErr.String())
}
return nil
}
// ffmpeg stdout is stderr
stderr, err := cmd.StderrPipe()
if err != nil {
return err
}
w, err := newWatcher(stderr, callback)
if err != nil {
return err
}
defer w.Close()
defer cmd.Process.Wait()
if err := cmd.Run(); err != nil {
return err
}
return nil
}
上一篇:【C++】vector用法详解
下一篇:探索Java的日志世界
文章标题:go语言调用上下文拉起ffmpeg,并引入livego做的简单流媒体服务器
文章链接:http://soscw.com/index.php/essay/106546.html