1. 程式人生 > >go語言調用上下文拉起ffmpeg,並引入livego做的簡單流媒體服務器

go語言調用上下文拉起ffmpeg,並引入livego做的簡單流媒體服務器

color 部分 bytes 流媒體 return ffmpeg tsp lang sed

想給項目組推一套視頻的播放方案,用於播放ip camera的的實時流,網上有很多人已經做過了,我這邊是使用golang,拉起上下文調用ffmpeg命令,獲取rtsp轉到livego的服務上,然後界面找我獲取播放流的方式。

實現如下:

調用命令行的部分如下

技術分享圖片
package 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 }
View Code

go語言調用上下文拉起ffmpeg,並引入livego做的簡單流媒體服務器