go语言调用上下文拉起ffmpeg,并引入livego做的简单流媒体服务器

Posted 轻歌曼舞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go语言调用上下文拉起ffmpeg,并引入livego做的简单流媒体服务器相关的知识,希望对你有一定的参考价值。

想给项目组推一套视频的播放方案,用于播放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做的简单流媒体服务器的主要内容,如果未能解决你的问题,请参考以下文章

2023-02-23:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420P格式文件。

2023-02-25:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420SP格式文件,YUV420P不要转换成YUV420SP。

2023-02-24:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420SP格式文件,采用YUV420P转YUV420SP的方式。

2023-03-12:mp3音频解码为pcm,代码用go语言编写,调用moonfdd/ffmpeg-go库。

2023-02-21:请用go语言调用ffmpeg,解码mp4文件,输出视频信息和总帧数。

2023-02-22:请用go语言调用ffmpeg,保存mp4文件的视频帧,每帧用ppm图片保存。